in core/src/main/java/com/alibaba/fastjson2/JSONReaderASCII.java [1032:1343]
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 byte[] bytes = this.bytes;
this.nameEscape = false;
int offset = this.nameBegin = this.offset;
final int nameBegin = this.nameBegin;
for (int i = 0; offset < end; ++i) {
int c = bytes[offset];
if (c == '\\') {
nameEscape = true;
c = bytes[offset + 1];
offset += (c == 'u' ? 6 : (c == 'x' ? 4 : 2));
continue;
}
if (c == quote) {
this.nameLength = i;
this.nameEnd = offset;
offset++;
c = bytes[offset];
while (c <= ' ' && ((1L << c) & SPACE) != 0) {
offset++;
c = bytes[offset];
}
if (c != ':') {
throw syntaxError(offset, ch);
}
offset++;
if (offset >= end) {
this.ch = EOI;
throw syntaxError(offset, ch);
}
c = bytes[offset];
while (c <= ' ' && ((1L << c) & SPACE) != 0) {
offset++;
c = bytes[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 length = nameEnd - nameBegin;
switch (length) {
case 1:
return TypeUtils.toString(bytes[nameBegin]);
case 2:
return TypeUtils.toString(
bytes[nameBegin],
bytes[nameBegin + 1]
);
case 3:
nameValue0
= (bytes[nameBegin + 2] << 16)
+ ((bytes[nameBegin + 1] & 0xFF) << 8)
+ (bytes[nameBegin] & 0xFF);
break;
case 4:
nameValue0
= (bytes[nameBegin + 3] << 24)
+ ((bytes[nameBegin + 2] & 0xFF) << 16)
+ ((bytes[nameBegin + 1] & 0xFF) << 8)
+ (bytes[nameBegin] & 0xFF);
break;
case 5:
nameValue0
= (((long) bytes[nameBegin + 4]) << 32)
+ ((bytes[nameBegin + 3] & 0xFFL) << 24)
+ ((bytes[nameBegin + 2] & 0xFFL) << 16)
+ ((bytes[nameBegin + 1] & 0xFFL) << 8)
+ (bytes[nameBegin] & 0xFFL);
break;
case 6:
nameValue0
= (((long) bytes[nameBegin + 5]) << 40)
+ ((bytes[nameBegin + 4] & 0xFFL) << 32)
+ ((bytes[nameBegin + 3] & 0xFFL) << 24)
+ ((bytes[nameBegin + 2] & 0xFFL) << 16)
+ ((bytes[nameBegin + 1] & 0xFFL) << 8)
+ (bytes[nameBegin] & 0xFFL);
break;
case 7:
nameValue0
= (((long) bytes[nameBegin + 6]) << 48)
+ ((bytes[nameBegin + 5] & 0xFFL) << 40)
+ ((bytes[nameBegin + 4] & 0xFFL) << 32)
+ ((bytes[nameBegin + 3] & 0xFFL) << 24)
+ ((bytes[nameBegin + 2] & 0xFFL) << 16)
+ ((bytes[nameBegin + 1] & 0xFFL) << 8)
+ (bytes[nameBegin] & 0xFFL);
break;
case 8:
nameValue0
= (((long) bytes[nameBegin + 7]) << 56)
+ ((bytes[nameBegin + 6] & 0xFFL) << 48)
+ ((bytes[nameBegin + 5] & 0xFFL) << 40)
+ ((bytes[nameBegin + 4] & 0xFFL) << 32)
+ ((bytes[nameBegin + 3] & 0xFFL) << 24)
+ ((bytes[nameBegin + 2] & 0xFFL) << 16)
+ ((bytes[nameBegin + 1] & 0xFFL) << 8)
+ (bytes[nameBegin] & 0xFFL);
break;
case 9:
nameValue0 = bytes[nameBegin];
nameValue1
= (((long) bytes[nameBegin + 8]) << 56)
+ ((bytes[nameBegin + 7] & 0xFFL) << 48)
+ ((bytes[nameBegin + 6] & 0xFFL) << 40)
+ ((bytes[nameBegin + 5] & 0xFFL) << 32)
+ ((bytes[nameBegin + 4] & 0xFFL) << 24)
+ ((bytes[nameBegin + 3] & 0xFFL) << 16)
+ ((bytes[nameBegin + 2] & 0xFFL) << 8)
+ (bytes[nameBegin + 1] & 0xFFL);
break;
case 10:
nameValue0
= (bytes[nameBegin + 1] << 8)
+ (bytes[nameBegin]);
nameValue1
= (((long) bytes[nameBegin + 9]) << 56)
+ ((bytes[nameBegin + 8] & 0xFFL) << 48)
+ ((bytes[nameBegin + 7] & 0xFFL) << 40)
+ ((bytes[nameBegin + 6] & 0xFFL) << 32)
+ ((bytes[nameBegin + 5] & 0xFFL) << 24)
+ ((bytes[nameBegin + 4] & 0xFFL) << 16)
+ ((bytes[nameBegin + 3] & 0xFFL) << 8)
+ (bytes[nameBegin + 2] & 0xFFL);
break;
case 11:
nameValue0
= (bytes[nameBegin + 2] << 16)
+ (bytes[nameBegin + 1] << 8)
+ (bytes[nameBegin]);
nameValue1
= (((long) bytes[nameBegin + 10]) << 56)
+ ((bytes[nameBegin + 9] & 0xFFL) << 48)
+ ((bytes[nameBegin + 8] & 0xFFL) << 40)
+ ((bytes[nameBegin + 7] & 0xFFL) << 32)
+ ((bytes[nameBegin + 6] & 0xFFL) << 24)
+ ((bytes[nameBegin + 5] & 0xFFL) << 16)
+ ((bytes[nameBegin + 4] & 0xFFL) << 8)
+ (bytes[nameBegin + 3] & 0xFFL);
break;
case 12:
nameValue0
= (bytes[nameBegin + 3] << 24)
+ (bytes[nameBegin + 2] << 16)
+ (bytes[nameBegin + 1] << 8)
+ (bytes[nameBegin]);
nameValue1
= (((long) bytes[nameBegin + 11]) << 56)
+ ((bytes[nameBegin + 10] & 0xFFL) << 48)
+ ((bytes[nameBegin + 9] & 0xFFL) << 40)
+ ((bytes[nameBegin + 8] & 0xFFL) << 32)
+ ((bytes[nameBegin + 7] & 0xFFL) << 24)
+ ((bytes[nameBegin + 6] & 0xFFL) << 16)
+ ((bytes[nameBegin + 5] & 0xFFL) << 8)
+ (bytes[nameBegin + 4] & 0xFFL);
break;
case 13:
nameValue0
= (((long) bytes[nameBegin + 4]) << 32)
+ (((long) bytes[nameBegin + 3]) << 24)
+ (((long) bytes[nameBegin + 2]) << 16)
+ (((long) bytes[nameBegin + 1]) << 8)
+ ((long) bytes[nameBegin]);
nameValue1
= (((long) bytes[nameBegin + 12]) << 56)
+ ((bytes[nameBegin + 11] & 0xFFL) << 48)
+ ((bytes[nameBegin + 10] & 0xFFL) << 40)
+ ((bytes[nameBegin + 9] & 0xFFL) << 32)
+ ((bytes[nameBegin + 8] & 0xFFL) << 24)
+ ((bytes[nameBegin + 7] & 0xFFL) << 16)
+ ((bytes[nameBegin + 6] & 0xFFL) << 8)
+ (bytes[nameBegin + 5] & 0xFFL);
break;
case 14:
nameValue0
= (((long) bytes[nameBegin + 5]) << 40)
+ ((bytes[nameBegin + 4] & 0xFFL) << 32)
+ ((bytes[nameBegin + 3] & 0xFFL) << 24)
+ ((bytes[nameBegin + 2] & 0xFFL) << 16)
+ ((bytes[nameBegin + 1] & 0xFFL) << 8)
+ (bytes[nameBegin] & 0xFFL);
nameValue1
= (((long) bytes[nameBegin + 13]) << 56)
+ ((bytes[nameBegin + 12] & 0xFFL) << 48)
+ ((bytes[nameBegin + 11] & 0xFFL) << 40)
+ ((bytes[nameBegin + 10] & 0xFFL) << 32)
+ ((bytes[nameBegin + 9] & 0xFFL) << 24)
+ ((bytes[nameBegin + 8] & 0xFFL) << 16)
+ ((bytes[nameBegin + 7] & 0xFFL) << 8)
+ (bytes[nameBegin + 6] & 0xFFL);
break;
case 15:
nameValue0
= (((long) bytes[nameBegin + 6]) << 48)
+ ((bytes[nameBegin + 5] & 0xFFL) << 40)
+ ((bytes[nameBegin + 4] & 0xFFL) << 32)
+ ((bytes[nameBegin + 3] & 0xFFL) << 24)
+ ((bytes[nameBegin + 2] & 0xFFL) << 16)
+ ((bytes[nameBegin + 1] & 0xFFL) << 8)
+ (bytes[nameBegin] & 0xFFL);
nameValue1
= (((long) bytes[nameBegin + 14]) << 56)
+ ((bytes[nameBegin + 13] & 0xFFL) << 48)
+ ((bytes[nameBegin + 12] & 0xFFL) << 40)
+ ((bytes[nameBegin + 11] & 0xFFL) << 32)
+ ((bytes[nameBegin + 10] & 0xFFL) << 24)
+ ((bytes[nameBegin + 9] & 0xFFL) << 16)
+ ((bytes[nameBegin + 8] & 0xFFL) << 8)
+ (bytes[nameBegin + 7] & 0xFFL);
break;
case 16:
nameValue0
= (((long) bytes[nameBegin + 7]) << 56)
+ ((bytes[nameBegin + 6] & 0xFFL) << 48)
+ ((bytes[nameBegin + 5] & 0xFFL) << 40)
+ ((bytes[nameBegin + 4] & 0xFFL) << 32)
+ ((bytes[nameBegin + 3] & 0xFFL) << 24)
+ ((bytes[nameBegin + 2] & 0xFFL) << 16)
+ ((bytes[nameBegin + 1] & 0xFFL) << 8)
+ (bytes[nameBegin] & 0xFFL);
nameValue1
= (((long) bytes[nameBegin + 15]) << 56)
+ ((bytes[nameBegin + 14] & 0xFFL) << 48)
+ ((bytes[nameBegin + 13] & 0xFFL) << 40)
+ ((bytes[nameBegin + 12] & 0xFFL) << 32)
+ ((bytes[nameBegin + 11] & 0xFFL) << 24)
+ ((bytes[nameBegin + 10] & 0xFFL) << 16)
+ ((bytes[nameBegin + 9] & 0xFFL) << 8)
+ (bytes[nameBegin + 8] & 0xFFL);
break;
default:
break;
}
if (nameValue0 != -1) {
if (nameValue1 != -1) {
long nameValue01 = nameValue0 ^ nameValue1;
int indexMask = ((int) (nameValue01 ^ (nameValue01 >>> 32))) & (NAME_CACHE2.length - 1);
JSONFactory.NameCacheEntry2 entry = NAME_CACHE2[indexMask];
if (entry == null) {
char[] chars = new char[length];
for (int i = 0; i < length; ++i) {
chars[i] = (char) (bytes[nameBegin + i] & 0xFF);
}
String name;
if (STRING_CREATOR_JDK8 != null) {
name = STRING_CREATOR_JDK8.apply(chars, Boolean.TRUE);
} else {
name = new String(chars);
}
NAME_CACHE2[indexMask] = new JSONFactory.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);
JSONFactory.NameCacheEntry entry = NAME_CACHE[indexMask];
if (entry == null) {
char[] chars = new char[length];
for (int i = 0; i < length; ++i) {
chars[i] = (char) (bytes[nameBegin + i] & 0xFF);
}
String name;
if (STRING_CREATOR_JDK8 != null) {
name = STRING_CREATOR_JDK8.apply(chars, Boolean.TRUE);
} else {
name = new String(chars);
}
NAME_CACHE[indexMask] = new JSONFactory.NameCacheEntry(name, nameValue0);
return name;
} else if (entry.value == nameValue0) {
return entry.name;
}
}
}
}
return getFieldName();
}