@@ -299,7 +299,7 @@ private static boolean keepSkippedBytesThenRead(JsonIterator iter) throws IOExce
299299 final static byte readByte (JsonIterator iter ) throws IOException {
300300 if (iter .head == iter .tail ) {
301301 if (!loadMore (iter )) {
302- return 0 ;
302+ throw iter . reportError ( "readByte" , "no more to read" ) ;
303303 }
304304 }
305305 return iter .buf [iter .head ++];
@@ -343,7 +343,7 @@ public static Any readAny(JsonIterator iter) throws IOException {
343343 case 'n' :
344344 skipUntilBreak (iter );
345345 iter .skipStartedAt = -1 ;
346- return Any .wrap ((Object )null );
346+ return Any .wrap ((Object ) null );
347347 case '[' :
348348 skipArray (iter );
349349 copied = copySkippedBytes (iter );
@@ -376,4 +376,77 @@ public static void skipFixedBytes(JsonIterator iter, int n) throws IOException {
376376 iter .head += more ;
377377 }
378378 }
379+
380+ public final static String readStringSlowPath (JsonIterator iter , int j ) throws IOException {
381+ for (;;) {
382+ int bc = readByte (iter );
383+ if (bc == '"' ) {
384+ return new String (iter .reusableChars , 0 , j );
385+ }
386+ if (bc == '\\' ) {
387+ bc = readByte (iter );
388+ switch (bc ) {
389+ case 'b' :
390+ bc = '\b' ;
391+ break ;
392+ case 't' :
393+ bc = '\t' ;
394+ break ;
395+ case 'n' :
396+ bc = '\n' ;
397+ break ;
398+ case 'f' :
399+ bc = '\f' ;
400+ break ;
401+ case 'r' :
402+ bc = '\r' ;
403+ break ;
404+ case '"' :
405+ case '/' :
406+ case '\\' :
407+ break ;
408+ case 'u' :
409+ bc = (IterImplString .translateHex (readByte (iter )) << 12 ) +
410+ (IterImplString .translateHex (readByte (iter )) << 8 ) +
411+ (IterImplString .translateHex (readByte (iter )) << 4 ) +
412+ IterImplString .translateHex (readByte (iter ));
413+ break ;
414+
415+ default :
416+ throw iter .reportError ("readStringSlowPath" , "invalid escape character: " + bc );
417+ }
418+ } else if ((bc & 0x80 ) != 0 ) {
419+ final int u2 = readByte (iter );
420+ if ((bc & 0xE0 ) == 0xC0 ) {
421+ bc = ((bc & 0x1F ) << 6 ) + (u2 & 0x3F );
422+ } else {
423+ final int u3 = readByte (iter );
424+ if ((bc & 0xF0 ) == 0xE0 ) {
425+ bc = ((bc & 0x0F ) << 12 ) + ((u2 & 0x3F ) << 6 ) + (u3 & 0x3F );
426+ } else {
427+ final int u4 = readByte (iter );
428+ if ((bc & 0xF8 ) == 0xF0 ) {
429+ bc = ((bc & 0x07 ) << 18 ) + ((u2 & 0x3F ) << 12 ) + ((u3 & 0x3F ) << 6 ) + (u4 & 0x3F );
430+ } else {
431+ throw iter .reportError ("readStringSlowPath" , "invalid unicode character" );
432+ }
433+
434+ if (bc >= 0x10000 ) {
435+ // check if valid unicode
436+ if (bc >= 0x110000 )
437+ throw iter .reportError ("readStringSlowPath" , "invalid unicode character" );
438+
439+ // split surrogates
440+ final int sup = bc - 0x10000 ;
441+ iter .reusableChars [j ++] = (char ) ((sup >>> 10 ) + 0xd800 );
442+ iter .reusableChars [j ++] = (char ) ((sup & 0x3ff ) + 0xdc00 );
443+ continue ;
444+ }
445+ }
446+ }
447+ }
448+ iter .reusableChars [j ++] = (char ) bc ;
449+ }
450+ }
451+
379452}
0 commit comments