@@ -323,123 +323,136 @@ public static int updateStringCopyBound(final JsonIterator iter, final int bound
323323 return bound ;
324324 }
325325
326- static final int readPositiveInt (final JsonIterator iter , byte c ) throws IOException {
326+ static final int readInt (final JsonIterator iter , final byte c , final boolean negative ) throws IOException {
327327 int ind = IterImplNumber .intDigits [c ];
328328 if (ind == 0 ) {
329329 IterImplForStreaming .assertNotLeadingZero (iter );
330330 return 0 ;
331331 }
332332 if (ind == IterImplNumber .INVALID_CHAR_FOR_NUMBER ) {
333- throw iter .reportError ("readPositiveInt " , "expect 0~9" );
333+ throw iter .reportError ("readInt " , "expect 0~9" );
334334 }
335335 if (iter .tail - iter .head > 9 ) {
336336 int i = iter .head ;
337337 int ind2 = IterImplNumber .intDigits [iter .buf [i ]];
338338 if (ind2 == IterImplNumber .INVALID_CHAR_FOR_NUMBER ) {
339339 iter .head = i ;
340- return ind ;
340+ return negative ? - ind : ind ;
341341 }
342342 int ind3 = IterImplNumber .intDigits [iter .buf [++i ]];
343343 if (ind3 == IterImplNumber .INVALID_CHAR_FOR_NUMBER ) {
344344 iter .head = i ;
345- return ind * 10 + ind2 ;
345+ ind = ind * 10 + ind2 ;
346+ return negative ? -ind : ind ;
346347 }
347348 int ind4 = IterImplNumber .intDigits [iter .buf [++i ]];
348349 if (ind4 == IterImplNumber .INVALID_CHAR_FOR_NUMBER ) {
349350 iter .head = i ;
350- return ind * 100 + ind2 * 10 + ind3 ;
351+ ind = ind * 100 + ind2 * 10 + ind3 ;
352+ return negative ? -ind : ind ;
351353 }
352354 int ind5 = IterImplNumber .intDigits [iter .buf [++i ]];
353355 if (ind5 == IterImplNumber .INVALID_CHAR_FOR_NUMBER ) {
354356 iter .head = i ;
355- return ind * 1000 + ind2 * 100 + ind3 * 10 + ind4 ;
357+ ind = ind * 1000 + ind2 * 100 + ind3 * 10 + ind4 ;
358+ return negative ? -ind : ind ;
356359 }
357360 int ind6 = IterImplNumber .intDigits [iter .buf [++i ]];
358361 if (ind6 == IterImplNumber .INVALID_CHAR_FOR_NUMBER ) {
359362 iter .head = i ;
360- return ind * 10000 + ind2 * 1000 + ind3 * 100 + ind4 * 10 + ind5 ;
363+ ind = ind * 10000 + ind2 * 1000 + ind3 * 100 + ind4 * 10 + ind5 ;
364+ return negative ? -ind : ind ;
361365 }
362366 int ind7 = IterImplNumber .intDigits [iter .buf [++i ]];
363367 if (ind7 == IterImplNumber .INVALID_CHAR_FOR_NUMBER ) {
364368 iter .head = i ;
365- return ind * 100000 + ind2 * 10000 + ind3 * 1000 + ind4 * 100 + ind5 * 10 + ind6 ;
369+ ind = ind * 100000 + ind2 * 10000 + ind3 * 1000 + ind4 * 100 + ind5 * 10 + ind6 ;
370+ return negative ? -ind : ind ;
366371 }
367372 int ind8 = IterImplNumber .intDigits [iter .buf [++i ]];
368373 if (ind8 == IterImplNumber .INVALID_CHAR_FOR_NUMBER ) {
369374 iter .head = i ;
370- return ind * 1000000 + ind2 * 100000 + ind3 * 10000 + ind4 * 1000 + ind5 * 100 + ind6 * 10 + ind7 ;
375+ ind = ind * 1000000 + ind2 * 100000 + ind3 * 10000 + ind4 * 1000 + ind5 * 100 + ind6 * 10 + ind7 ;
376+ return negative ? -ind : ind ;
371377 }
372378 int ind9 = IterImplNumber .intDigits [iter .buf [++i ]];
373379 ind = ind * 10000000 + ind2 * 1000000 + ind3 * 100000 + ind4 * 10000 + ind5 * 1000 + ind6 * 100 + ind7 * 10 + ind8 ;
374380 iter .head = i ;
375381 if (ind9 == IterImplNumber .INVALID_CHAR_FOR_NUMBER ) {
376- return ind ;
382+ return negative ? - ind : ind ;
377383 }
378384 }
379- return IterImplForStreaming .readIntSlowPath (iter , ind );
385+ return IterImplForStreaming .readIntSlowPath (iter , ind , negative );
380386 }
381387
382- static final long readPositiveLong (final JsonIterator iter , byte c ) throws IOException {
388+ static final long readLong (final JsonIterator iter , final byte c , final boolean negative ) throws IOException {
383389 long ind = IterImplNumber .intDigits [c ];
384390 if (ind == 0 ) {
385391 IterImplForStreaming .assertNotLeadingZero (iter );
386392 return 0 ;
387393 }
388394 if (ind == IterImplNumber .INVALID_CHAR_FOR_NUMBER ) {
389- throw iter .reportError ("readPositiveLong " , "expect 0~9" );
395+ throw iter .reportError ("readLong " , "expect 0~9" );
390396 }
391397 if (iter .tail - iter .head > 9 ) {
392398 int i = iter .head ;
393399 int ind2 = IterImplNumber .intDigits [iter .buf [i ]];
394400 if (ind2 == IterImplNumber .INVALID_CHAR_FOR_NUMBER ) {
395401 iter .head = i ;
396- return ind ;
402+ return negative ? - ind : ind ;
397403 }
398404 int ind3 = IterImplNumber .intDigits [iter .buf [++i ]];
399405 if (ind3 == IterImplNumber .INVALID_CHAR_FOR_NUMBER ) {
400406 iter .head = i ;
401- return ind * 10 + ind2 ;
407+ ind = ind * 10 + ind2 ;
408+ return negative ? -ind : ind ;
402409 }
403410 int ind4 = IterImplNumber .intDigits [iter .buf [++i ]];
404411 if (ind4 == IterImplNumber .INVALID_CHAR_FOR_NUMBER ) {
405412 iter .head = i ;
406- return ind * 100 + ind2 * 10 + ind3 ;
413+ ind = ind * 100 + ind2 * 10 + ind3 ;
414+ return negative ? -ind : ind ;
407415 }
408416 int ind5 = IterImplNumber .intDigits [iter .buf [++i ]];
409417 if (ind5 == IterImplNumber .INVALID_CHAR_FOR_NUMBER ) {
410418 iter .head = i ;
411- return ind * 1000 + ind2 * 100 + ind3 * 10 + ind4 ;
419+ ind = ind * 1000 + ind2 * 100 + ind3 * 10 + ind4 ;
420+ return negative ? -ind : ind ;
412421 }
413422 int ind6 = IterImplNumber .intDigits [iter .buf [++i ]];
414423 if (ind6 == IterImplNumber .INVALID_CHAR_FOR_NUMBER ) {
415424 iter .head = i ;
416- return ind * 10000 + ind2 * 1000 + ind3 * 100 + ind4 * 10 + ind5 ;
425+ ind = ind * 10000 + ind2 * 1000 + ind3 * 100 + ind4 * 10 + ind5 ;
426+ return negative ? -ind : ind ;
417427 }
418428 int ind7 = IterImplNumber .intDigits [iter .buf [++i ]];
419429 if (ind7 == IterImplNumber .INVALID_CHAR_FOR_NUMBER ) {
420430 iter .head = i ;
421- return ind * 100000 + ind2 * 10000 + ind3 * 1000 + ind4 * 100 + ind5 * 10 + ind6 ;
431+ ind = ind * 100000 + ind2 * 10000 + ind3 * 1000 + ind4 * 100 + ind5 * 10 + ind6 ;
432+ return negative ? -ind : ind ;
422433 }
423434 int ind8 = IterImplNumber .intDigits [iter .buf [++i ]];
424435 if (ind8 == IterImplNumber .INVALID_CHAR_FOR_NUMBER ) {
425436 iter .head = i ;
426- return ind * 1000000 + ind2 * 100000 + ind3 * 10000 + ind4 * 1000 + ind5 * 100 + ind6 * 10 + ind7 ;
437+ ind = ind * 1000000 + ind2 * 100000 + ind3 * 10000 + ind4 * 1000 + ind5 * 100 + ind6 * 10 + ind7 ;
438+ return negative ? -ind : ind ;
427439 }
428440 int ind9 = IterImplNumber .intDigits [iter .buf [++i ]];
429441 ind = ind * 10000000 + ind2 * 1000000 + ind3 * 100000 + ind4 * 10000 + ind5 * 1000 + ind6 * 100 + ind7 * 10 + ind8 ;
430442 iter .head = i ;
431443 if (ind9 == IterImplNumber .INVALID_CHAR_FOR_NUMBER ) {
432- return ind ;
444+ return negative ? - ind : ind ;
433445 }
434446 }
435- return IterImplForStreaming .readLongSlowPath (iter , ind );
447+ return IterImplForStreaming .readLongSlowPath (iter , ind , negative );
436448 }
437449
438- static final double readPositiveDouble (final JsonIterator iter ) throws IOException {
450+ static final double readDouble (final JsonIterator iter , final boolean negative ) throws IOException {
439451 int oldHead = iter .head ;
440452 try {
441453 try {
442- long value = IterImplNumber .readLong (iter ); // without the dot
454+ long value = IterImplNumber .readLong (iter ); // without the dot & sign
455+ value = negative ? -value : value ;
443456 if (iter .head == iter .tail ) {
444457 return value ;
445458 }
@@ -448,27 +461,29 @@ static final double readPositiveDouble(final JsonIterator iter) throws IOExcepti
448461 iter .head ++;
449462 int start = iter .head ;
450463 c = iter .buf [iter .head ++];
451- long decimalPart = readPositiveLong (iter , c );
464+ long decimalPart = readLong (iter , c , negative );
452465 int decimalPlaces = iter .head - start ;
453466 if (decimalPlaces > 0 && decimalPlaces < IterImplNumber .POW10 .length && (iter .head - oldHead ) < 10 ) {
454- value = value * IterImplNumber .POW10 [decimalPlaces ] + decimalPart ;
455- return value / (double ) IterImplNumber .POW10 [decimalPlaces ];
467+ return value + (decimalPart / (double ) IterImplNumber .POW10 [decimalPlaces ]);
456468 } else {
457469 iter .head = oldHead ;
458- return IterImplForStreaming .readDoubleSlowPath (iter );
470+ double result = IterImplForStreaming .readDoubleSlowPath (iter );
471+ return negative ? -result : result ;
459472 }
460473 } else {
461474 return value ;
462475 }
463476 } finally {
464477 if (iter .head < iter .tail && (iter .buf [iter .head ] == 'e' || iter .buf [iter .head ] == 'E' )) {
465478 iter .head = oldHead ;
466- return IterImplForStreaming .readDoubleSlowPath (iter );
479+ double result = IterImplForStreaming .readDoubleSlowPath (iter );
480+ return negative ? -result : result ;
467481 }
468482 }
469483 } catch (JsonException e ) {
470484 iter .head = oldHead ;
471- return IterImplForStreaming .readDoubleSlowPath (iter );
485+ double result = IterImplForStreaming .readDoubleSlowPath (iter );
486+ return negative ? -result : result ;
472487 }
473488 }
474489}
0 commit comments