in core/src/main/java/com/alibaba/fastjson2/JSONReaderUTF16.java [1784:2363]
public final String readFieldName() {
final char quote = ch;
if (quote == '\'' && ((context.features & Feature.DisableSingleQuote.mask) != 0)) {
throw notSupportName();
}
if (quote != '"' && quote != '\'') {
if ((context.features & Feature.AllowUnQuotedFieldNames.mask) != 0 && isFirstIdentifier(quote)) {
return readFieldNameUnquote();
}
return null;
}
final char[] chars = this.chars;
this.nameEscape = false;
int offset = this.nameBegin = this.offset, end = this.end;
final int nameBegin = this.nameBegin;
for (int i = 0; offset < end; ++i) {
int c = chars[offset];
if (c == '\\') {
nameEscape = true;
c = chars[offset + 1];
offset += (c == 'u' ? 6 : (c == 'x' ? 4 : 2));
continue;
}
if (c == quote) {
this.nameLength = i;
this.nameEnd = offset;
offset++;
if (offset < end) {
c = chars[offset];
} else {
c = EOI;
}
while (c <= ' ' && ((1L << c) & SPACE) != 0) {
offset++;
c = chars[offset];
}
if (c != ':') {
throw new JSONException("syntax error : " + offset);
}
c = ++offset == end ? EOI : chars[offset];
while (c <= ' ' && ((1L << c) & SPACE) != 0) {
offset++;
c = chars[offset];
}
this.offset = offset + 1;
this.ch = (char) c;
break;
}
offset++;
}
if (nameEnd < nameBegin) {
throw new JSONException("syntax error : " + offset);
}
if (!nameEscape) {
long nameValue0 = -1, nameValue1 = -1;
int c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15;
switch (nameLength) {
case 1:
return TypeUtils.toString(chars[nameBegin]);
case 2:
return TypeUtils.toString(chars[nameBegin], chars[nameBegin + 1]);
case 3:
c0 = chars[nameBegin];
c1 = chars[nameBegin + 1];
c2 = chars[nameBegin + 2];
if ((c0 & 0xFF) == c0
&& (c1 & 0xFF) == c1
&& (c2 & 0xFF) == c2) {
nameValue0
= (c2 << 16)
+ (c1 << 8)
+ c0;
}
break;
case 4:
c0 = chars[nameBegin];
c1 = chars[nameBegin + 1];
c2 = chars[nameBegin + 2];
c3 = chars[nameBegin + 3];
if ((c0 & 0xFF) == c0
&& (c1 & 0xFF) == c1
&& (c2 & 0xFF) == c2
&& (c3 & 0xFF) == c3) {
nameValue0
= (c3 << 24)
+ (c2 << 16)
+ (c1 << 8)
+ c0;
}
break;
case 5:
c0 = chars[nameBegin];
c1 = chars[nameBegin + 1];
c2 = chars[nameBegin + 2];
c3 = chars[nameBegin + 3];
c4 = chars[nameBegin + 4];
if ((c0 & 0xFF) == c0
&& (c1 & 0xFF) == c1
&& (c2 & 0xFF) == c2
&& (c3 & 0xFF) == c3
&& (c4 & 0xFF) == c4) {
nameValue0
= (((long) c4) << 32)
+ (((long) c3) << 24)
+ (((long) c2) << 16)
+ (((long) c1) << 8)
+ ((long) c0);
}
break;
case 6:
c0 = chars[nameBegin];
c1 = chars[nameBegin + 1];
c2 = chars[nameBegin + 2];
c3 = chars[nameBegin + 3];
c4 = chars[nameBegin + 4];
c5 = chars[nameBegin + 5];
if ((c0 & 0xFF) == c0
&& (c1 & 0xFF) == c1
&& (c2 & 0xFF) == c2
&& (c3 & 0xFF) == c3
&& (c4 & 0xFF) == c4
&& (c5 & 0xFF) == c5) {
nameValue0
= (((long) c5) << 40)
+ (((long) c4) << 32)
+ (((long) c3) << 24)
+ (((long) c2) << 16)
+ (((long) c1) << 8)
+ ((long) c0);
}
break;
case 7:
c0 = chars[nameBegin];
c1 = chars[nameBegin + 1];
c2 = chars[nameBegin + 2];
c3 = chars[nameBegin + 3];
c4 = chars[nameBegin + 4];
c5 = chars[nameBegin + 5];
c6 = chars[nameBegin + 6];
if ((c0 & 0xFF) == c0
&& (c1 & 0xFF) == c1
&& (c2 & 0xFF) == c2
&& (c3 & 0xFF) == c3
&& (c4 & 0xFF) == c4
&& (c5 & 0xFF) == c5
&& (c6 & 0xFF) == c6) {
nameValue0
= (((long) c6) << 48)
+ (((long) c5) << 40)
+ (((long) c4) << 32)
+ (((long) c3) << 24)
+ (((long) c2) << 16)
+ (((long) c1) << 8)
+ ((long) c0);
}
break;
case 8:
c0 = chars[nameBegin];
c1 = chars[nameBegin + 1];
c2 = chars[nameBegin + 2];
c3 = chars[nameBegin + 3];
c4 = chars[nameBegin + 4];
c5 = chars[nameBegin + 5];
c6 = chars[nameBegin + 6];
c7 = chars[nameBegin + 7];
if ((c0 & 0xFF) == c0
&& (c1 & 0xFF) == c1
&& (c2 & 0xFF) == c2
&& (c3 & 0xFF) == c3
&& (c4 & 0xFF) == c4
&& (c5 & 0xFF) == c5
&& (c6 & 0xFF) == c6
&& (c7 & 0xFF) == c7) {
nameValue0
= (((long) c7) << 56)
+ (((long) c6) << 48)
+ (((long) c5) << 40)
+ (((long) c4) << 32)
+ (((long) c3) << 24)
+ (((long) c2) << 16)
+ (((long) c1) << 8)
+ ((long) c0);
}
break;
case 9:
c0 = chars[nameBegin];
c1 = chars[nameBegin + 1];
c2 = chars[nameBegin + 2];
c3 = chars[nameBegin + 3];
c4 = chars[nameBegin + 4];
c5 = chars[nameBegin + 5];
c6 = chars[nameBegin + 6];
c7 = chars[nameBegin + 7];
c8 = chars[nameBegin + 8];
if ((c0 & 0xFF) == c0
&& (c1 & 0xFF) == c1
&& (c2 & 0xFF) == c2
&& (c3 & 0xFF) == c3
&& (c4 & 0xFF) == c4
&& (c5 & 0xFF) == c5
&& (c6 & 0xFF) == c6
&& (c7 & 0xFF) == c7
&& (c8 & 0xFF) == c8) {
nameValue0 = c0;
nameValue1
= (((long) c8) << 56)
+ (((long) c7) << 48)
+ (((long) c6) << 40)
+ (((long) c5) << 32)
+ (((long) c4) << 24)
+ (((long) c3) << 16)
+ (((long) c2) << 8)
+ ((long) c1);
}
break;
case 10:
c0 = chars[nameBegin];
c1 = chars[nameBegin + 1];
c2 = chars[nameBegin + 2];
c3 = chars[nameBegin + 3];
c4 = chars[nameBegin + 4];
c5 = chars[nameBegin + 5];
c6 = chars[nameBegin + 6];
c7 = chars[nameBegin + 7];
c8 = chars[nameBegin + 8];
c9 = chars[nameBegin + 9];
if ((c0 & 0xFF) == c0
&& (c1 & 0xFF) == c1
&& (c2 & 0xFF) == c2
&& (c3 & 0xFF) == c3
&& (c4 & 0xFF) == c4
&& (c5 & 0xFF) == c5
&& (c6 & 0xFF) == c6
&& (c7 & 0xFF) == c7
&& (c8 & 0xFF) == c8
&& (c9 & 0xFF) == c9) {
nameValue0 = (c1 << 8)
+ c0;
nameValue1
= (((long) c9) << 56)
+ (((long) c8) << 48)
+ (((long) c7) << 40)
+ (((long) c6) << 32)
+ (((long) c5) << 24)
+ (((long) c4) << 16)
+ (((long) c3) << 8)
+ ((long) c2);
}
break;
case 11:
c0 = chars[nameBegin];
c1 = chars[nameBegin + 1];
c2 = chars[nameBegin + 2];
c3 = chars[nameBegin + 3];
c4 = chars[nameBegin + 4];
c5 = chars[nameBegin + 5];
c6 = chars[nameBegin + 6];
c7 = chars[nameBegin + 7];
c8 = chars[nameBegin + 8];
c9 = chars[nameBegin + 9];
c10 = chars[nameBegin + 10];
if ((c0 & 0xFF) == c0
&& (c1 & 0xFF) == c1
&& (c2 & 0xFF) == c2
&& (c3 & 0xFF) == c3
&& (c4 & 0xFF) == c4
&& (c5 & 0xFF) == c5
&& (c6 & 0xFF) == c6
&& (c7 & 0xFF) == c7
&& (c8 & 0xFF) == c8
&& (c9 & 0xFF) == c9
&& (c10 & 0xFF) == c10) {
nameValue0
= (c2 << 16)
+ (c1 << 8)
+ c0;
nameValue1
= (((long) c10) << 56)
+ (((long) c9) << 48)
+ (((long) c8) << 40)
+ (((long) c7) << 32)
+ (((long) c6) << 24)
+ (((long) c5) << 16)
+ (((long) c4) << 8)
+ ((long) c3);
}
break;
case 12:
c0 = chars[nameBegin];
c1 = chars[nameBegin + 1];
c2 = chars[nameBegin + 2];
c3 = chars[nameBegin + 3];
c4 = chars[nameBegin + 4];
c5 = chars[nameBegin + 5];
c6 = chars[nameBegin + 6];
c7 = chars[nameBegin + 7];
c8 = chars[nameBegin + 8];
c9 = chars[nameBegin + 9];
c10 = chars[nameBegin + 10];
c11 = chars[nameBegin + 11];
if ((c0 & 0xFF) == c0
&& (c1 & 0xFF) == c1
&& (c2 & 0xFF) == c2
&& (c3 & 0xFF) == c3
&& (c4 & 0xFF) == c4
&& (c5 & 0xFF) == c5
&& (c6 & 0xFF) == c6
&& (c7 & 0xFF) == c7
&& (c8 & 0xFF) == c8
&& (c9 & 0xFF) == c9
&& (c10 & 0xFF) == c10
&& (c11 & 0xFF) == c11) {
nameValue0
= (c3 << 24)
+ (c2 << 16)
+ (c1 << 8)
+ c0;
nameValue1
= (((long) c11) << 56)
+ (((long) c10) << 48)
+ (((long) c9) << 40)
+ (((long) c8) << 32)
+ (((long) c7) << 24)
+ (((long) c6) << 16)
+ (((long) c5) << 8)
+ ((long) c4);
}
break;
case 13:
c0 = chars[nameBegin];
c1 = chars[nameBegin + 1];
c2 = chars[nameBegin + 2];
c3 = chars[nameBegin + 3];
c4 = chars[nameBegin + 4];
c5 = chars[nameBegin + 5];
c6 = chars[nameBegin + 6];
c7 = chars[nameBegin + 7];
c8 = chars[nameBegin + 8];
c9 = chars[nameBegin + 9];
c10 = chars[nameBegin + 10];
c11 = chars[nameBegin + 11];
c12 = chars[nameBegin + 12];
if ((c0 & 0xFF) == c0
&& (c1 & 0xFF) == c1
&& (c2 & 0xFF) == c2
&& (c3 & 0xFF) == c3
&& (c4 & 0xFF) == c4
&& (c5 & 0xFF) == c5
&& (c6 & 0xFF) == c6
&& (c7 & 0xFF) == c7
&& (c8 & 0xFF) == c8
&& (c9 & 0xFF) == c9
&& (c10 & 0xFF) == c10
&& (c11 & 0xFF) == c11
&& (c12 & 0xFF) == c12) {
nameValue0
= (((long) c4) << 32)
+ (((long) c3) << 24)
+ (((long) c2) << 16)
+ (((long) c1) << 8)
+ ((long) c0);
nameValue1
= (((long) c12) << 56)
+ (((long) c11) << 48)
+ (((long) c10) << 40)
+ (((long) c9) << 32)
+ (((long) c8) << 24)
+ (((long) c7) << 16)
+ (((long) c6) << 8)
+ ((long) c5);
}
break;
case 14:
c0 = chars[nameBegin];
c1 = chars[nameBegin + 1];
c2 = chars[nameBegin + 2];
c3 = chars[nameBegin + 3];
c4 = chars[nameBegin + 4];
c5 = chars[nameBegin + 5];
c6 = chars[nameBegin + 6];
c7 = chars[nameBegin + 7];
c8 = chars[nameBegin + 8];
c9 = chars[nameBegin + 9];
c10 = chars[nameBegin + 10];
c11 = chars[nameBegin + 11];
c12 = chars[nameBegin + 12];
c13 = chars[nameBegin + 13];
if ((c0 & 0xFF) == c0
&& (c1 & 0xFF) == c1
&& (c2 & 0xFF) == c2
&& (c3 & 0xFF) == c3
&& (c4 & 0xFF) == c4
&& (c5 & 0xFF) == c5
&& (c6 & 0xFF) == c6
&& (c7 & 0xFF) == c7
&& (c8 & 0xFF) == c8
&& (c9 & 0xFF) == c9
&& (c10 & 0xFF) == c10
&& (c11 & 0xFF) == c11
&& (c12 & 0xFF) == c12
&& (c13 & 0xFF) == c13) {
nameValue0
= (((long) c5) << 40)
+ (((long) c4) << 32)
+ (((long) c3) << 24)
+ (((long) c2) << 16)
+ (((long) c1) << 8)
+ ((long) c0);
nameValue1
= (((long) c13) << 56)
+ (((long) c12) << 48)
+ (((long) c11) << 40)
+ (((long) c10) << 32)
+ (((long) c9) << 24)
+ (((long) c8) << 16)
+ (((long) c7) << 8)
+ ((long) c6);
}
break;
case 15:
c0 = chars[nameBegin];
c1 = chars[nameBegin + 1];
c2 = chars[nameBegin + 2];
c3 = chars[nameBegin + 3];
c4 = chars[nameBegin + 4];
c5 = chars[nameBegin + 5];
c6 = chars[nameBegin + 6];
c7 = chars[nameBegin + 7];
c8 = chars[nameBegin + 8];
c9 = chars[nameBegin + 9];
c10 = chars[nameBegin + 10];
c11 = chars[nameBegin + 11];
c12 = chars[nameBegin + 12];
c13 = chars[nameBegin + 13];
c14 = chars[nameBegin + 14];
if ((c0 & 0xFF) == c0
&& (c1 & 0xFF) == c1
&& (c2 & 0xFF) == c2
&& (c3 & 0xFF) == c3
&& (c4 & 0xFF) == c4
&& (c5 & 0xFF) == c5
&& (c6 & 0xFF) == c6
&& (c7 & 0xFF) == c7
&& (c8 & 0xFF) == c8
&& (c9 & 0xFF) == c9
&& (c10 & 0xFF) == c10
&& (c11 & 0xFF) == c11
&& (c12 & 0xFF) == c12
&& (c13 & 0xFF) == c13
&& (c14 & 0xFF) == c14) {
nameValue0
= (((long) c6) << 48)
+ (((long) c5) << 40)
+ (((long) c4) << 32)
+ (((long) c3) << 24)
+ (((long) c2) << 16)
+ (((long) c1) << 8)
+ ((long) c0);
nameValue1
= (((long) c14) << 56)
+ (((long) c13) << 48)
+ (((long) c12) << 40)
+ (((long) c11) << 32)
+ (((long) c10) << 24)
+ (((long) c9) << 16)
+ (((long) c8) << 8)
+ ((long) c7);
}
break;
case 16:
c0 = chars[nameBegin];
c1 = chars[nameBegin + 1];
c2 = chars[nameBegin + 2];
c3 = chars[nameBegin + 3];
c4 = chars[nameBegin + 4];
c5 = chars[nameBegin + 5];
c6 = chars[nameBegin + 6];
c7 = chars[nameBegin + 7];
c8 = chars[nameBegin + 8];
c9 = chars[nameBegin + 9];
c10 = chars[nameBegin + 10];
c11 = chars[nameBegin + 11];
c12 = chars[nameBegin + 12];
c13 = chars[nameBegin + 13];
c14 = chars[nameBegin + 14];
c15 = chars[nameBegin + 15];
if ((c0 & 0xFF) == c0
&& (c1 & 0xFF) == c1
&& (c2 & 0xFF) == c2
&& (c3 & 0xFF) == c3
&& (c4 & 0xFF) == c4
&& (c5 & 0xFF) == c5
&& (c6 & 0xFF) == c6
&& (c7 & 0xFF) == c7
&& (c8 & 0xFF) == c8
&& (c9 & 0xFF) == c9
&& (c10 & 0xFF) == c10
&& (c11 & 0xFF) == c11
&& (c12 & 0xFF) == c12
&& (c13 & 0xFF) == c13
&& (c14 & 0xFF) == c14
&& (c15 & 0xFF) == c15) {
nameValue0
= (((long) c7) << 56)
+ (((long) c6) << 48)
+ (((long) c5) << 40)
+ (((long) c4) << 32)
+ (((long) c3) << 24)
+ (((long) c2) << 16)
+ (((long) c1) << 8)
+ ((long) c0);
nameValue1
= (((long) c15) << 56)
+ (((long) c14) << 48)
+ (((long) c13) << 40)
+ (((long) c12) << 32)
+ (((long) c11) << 24)
+ (((long) c10) << 16)
+ (((long) c9) << 8)
+ ((long) c8);
}
break;
default:
break;
}
if (nameValue0 != -1) {
if (nameValue1 != -1) {
long nameValue01 = nameValue0 ^ nameValue1;
int indexMask = ((int) (nameValue01 ^ (nameValue01 >>> 32))) & (NAME_CACHE2.length - 1);
NameCacheEntry2 entry = NAME_CACHE2[indexMask];
if (entry == null) {
String name;
if (this.str != null) {
name = this.str.substring(nameBegin, nameEnd);
} else {
name = new String(chars, nameBegin, nameEnd - nameBegin);
}
NAME_CACHE2[indexMask] = new NameCacheEntry2(name, nameValue0, nameValue1);
return name;
} else if (entry.value0 == nameValue0 && entry.value1 == nameValue1) {
return entry.name;
}
} else {
int indexMask = ((int) (nameValue0 ^ (nameValue0 >>> 32))) & (NAME_CACHE.length - 1);
NameCacheEntry entry = NAME_CACHE[indexMask];
if (entry == null) {
String name;
if (this.str != null) {
name = this.str.substring(nameBegin, nameEnd);
} else {
name = new String(chars, nameBegin, nameEnd - nameBegin);
}
NAME_CACHE[indexMask] = new NameCacheEntry(name, nameValue0);
return name;
} else if (entry.value == nameValue0) {
return entry.name;
}
}
}
if (this.str != null) {
return this.str.substring(nameBegin, nameEnd);
} else {
return new String(chars, nameBegin, nameEnd - nameBegin);
}
}
return getFieldName();
}