@@ -323,123 +323,135 @@ 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 ) 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 - 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 -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 -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 -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 -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 -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 -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 - ind ;
377383 }
378384 }
379385 return IterImplForStreaming .readIntSlowPath (iter , ind );
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 ) 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 - 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 -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 -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 -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 -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 -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 -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 - ind ;
433445 }
434446 }
435447 return IterImplForStreaming .readLongSlowPath (iter , ind );
436448 }
437449
438- static final double readPositiveDouble (final JsonIterator iter ) throws IOException {
450+ static final double readDouble (final JsonIterator iter ) 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
443455 if (iter .head == iter .tail ) {
444456 return value ;
445457 }
@@ -448,11 +460,14 @@ static final double readPositiveDouble(final JsonIterator iter) throws IOExcepti
448460 iter .head ++;
449461 int start = iter .head ;
450462 c = iter .buf [iter .head ++];
451- long decimalPart = readPositiveLong (iter , c );
463+ long decimalPart = readLong (iter , c );
464+ if (decimalPart == Long .MIN_VALUE ) {
465+ return IterImplForStreaming .readDoubleSlowPath (iter );
466+ }
467+ decimalPart = -decimalPart ;
452468 int decimalPlaces = iter .head - start ;
453469 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 ];
470+ return value + (decimalPart / (double ) IterImplNumber .POW10 [decimalPlaces ]);
456471 } else {
457472 iter .head = oldHead ;
458473 return IterImplForStreaming .readDoubleSlowPath (iter );
0 commit comments