@@ -43,8 +43,8 @@ class IterImplNumber {
43
43
private final static int DOT_IN_NUMBER = -3 ;
44
44
private final static int INVALID_CHAR_FOR_NUMBER = -1 ;
45
45
private static final int POW10 [] = {1 , 10 , 100 , 1000 , 10000 , 100000 , 1000000 };
46
- private final static long LONG_SAFE_TO_MULTIPLY_10 = (Long .MAX_VALUE / 10 ) - 10 ;
47
- private final static int INT_SAFE_TO_MULTIPLY_10 = (Integer .MAX_VALUE / 10 ) - 10 ;
46
+ private final static long LONG_SAFE_TO_MULTIPLY_10 = (Long .MAX_VALUE / 10 ) - 1 ;
47
+ private final static int INT_SAFE_TO_MULTIPLY_10 = (Integer .MAX_VALUE / 10 ) - 1 ;
48
48
49
49
static {
50
50
for (int i = 0 ; i < digits .length ; i ++) {
@@ -247,34 +247,74 @@ public static final String readNumber(final JsonIterator iter) throws IOExceptio
247
247
public static final int readInt (final JsonIterator iter ) throws IOException {
248
248
byte c = IterImpl .nextToken (iter );
249
249
if (c == '-' ) {
250
- return - readUnsignedInt (iter , IterImpl . readByte ( iter ) );
250
+ return readNegativeInt (iter );
251
251
} else {
252
- return readUnsignedInt (iter , c );
252
+ return readPositiveInt (iter , c );
253
253
}
254
254
}
255
255
256
- public static final int readUnsignedInt (final JsonIterator iter , byte c ) throws IOException {
257
- int result = intDigits [c ];
258
- if (result == 0 ) {
256
+ public static final int readPositiveInt (final JsonIterator iter , byte c ) throws IOException {
257
+ int value = intDigits [c ];
258
+ if (value == 0 ) {
259
259
return 0 ;
260
260
}
261
- if (result == INVALID_CHAR_FOR_NUMBER ) {
262
- throw iter .reportError ("readUnsignedInt " , "expect 0~9" );
261
+ if (value == INVALID_CHAR_FOR_NUMBER ) {
262
+ throw iter .reportError ("readPositiveInt " , "expect 0~9" );
263
263
}
264
264
for (;;) {
265
265
for (int i = iter .head ; i < iter .tail ; i ++) {
266
266
int ind = intDigits [iter .buf [i ]];
267
267
if (ind == INVALID_CHAR_FOR_NUMBER ) {
268
268
iter .head = i ;
269
- return result ;
269
+ return value ;
270
+ }
271
+ if (value > INT_SAFE_TO_MULTIPLY_10 ) {
272
+ int value2 = (value << 3 ) + (value << 1 ) + ind ;
273
+ if (value2 < INT_SAFE_TO_MULTIPLY_10 * 10 ) {
274
+ throw iter .reportError ("readPositiveInt" , "value is too large for int" );
275
+ } else {
276
+ value = value2 ;
277
+ continue ;
278
+ }
279
+ }
280
+ value = (value << 3 ) + (value << 1 ) + ind ;
281
+ }
282
+ if (!IterImpl .loadMore (iter )) {
283
+ return value ;
284
+ }
285
+ }
286
+ }
287
+
288
+ public static final int readNegativeInt (final JsonIterator iter ) throws IOException {
289
+ byte c = IterImpl .readByte (iter );
290
+ int ind = intDigits [c ];
291
+ if (ind == 0 ) {
292
+ return 0 ;
293
+ }
294
+ if (ind == INVALID_CHAR_FOR_NUMBER ) {
295
+ throw iter .reportError ("readNegativeInt" , "expect 0~9" );
296
+ }
297
+ int value = -ind ;
298
+ for (;;) {
299
+ for (int i = iter .head ; i < iter .tail ; i ++) {
300
+ ind = intDigits [iter .buf [i ]];
301
+ if (ind == INVALID_CHAR_FOR_NUMBER ) {
302
+ iter .head = i ;
303
+ return value ;
270
304
}
271
- if (result > INT_SAFE_TO_MULTIPLY_10 ) {
272
- throw iter .reportError ("readUnsignedInt" , "value is too large for int" );
305
+ if (value > INT_SAFE_TO_MULTIPLY_10 ) {
306
+ int value2 = (value << 3 ) + (value << 1 ) - ind ;
307
+ if (value2 < INT_SAFE_TO_MULTIPLY_10 * 10 ) {
308
+ throw iter .reportError ("readNegativeInt" , "value is too large for int" );
309
+ } else {
310
+ value = value2 ;
311
+ continue ;
312
+ }
273
313
}
274
- result = (result << 3 ) + (result << 1 ) + ind ;
314
+ value = (value << 3 ) + (value << 1 ) - ind ;
275
315
}
276
316
if (!IterImpl .loadMore (iter )) {
277
- return result ;
317
+ return value ;
278
318
}
279
319
}
280
320
}
0 commit comments