in core/src/main/java/com/alibaba/fastjson2/writer/ObjectWriterCreatorASM.java [3554:3888]
private void gwFieldName(MethodWriterContext mwc, FieldWriter fieldWriter, int i) {
MethodWriter mw = mwc.mw;
String classNameType = mwc.classNameType;
Label labelElse = new Label(), labelEnd = new Label();
boolean writeDirect = false;
if (!mwc.jsonb) {
byte[] fieldNameUTF8 = fieldWriter.fieldName.getBytes(StandardCharsets.UTF_8);
boolean asciiName = true;
for (int j = 0; j < fieldNameUTF8.length; j++) {
if (fieldNameUTF8[j] < 0) {
asciiName = false;
break;
}
}
int length = fieldNameUTF8.length;
if (length >= 2 && length <= 16 && asciiName) {
Number name1 = 0, name1SQ = 0;
String methodName;
String methodDesc = "(J)V";
byte[] bytes = new byte[8];
switch (length) {
case 2:
bytes[0] = '"';
System.arraycopy(fieldNameUTF8, 0, bytes, 1, 2);
bytes[3] = '"';
bytes[4] = ':';
methodName = "writeName2Raw";
break;
case 3:
bytes[0] = '"';
System.arraycopy(fieldNameUTF8, 0, bytes, 1, 3);
bytes[4] = '"';
bytes[5] = ':';
methodName = "writeName3Raw";
break;
case 4:
bytes[0] = '"';
System.arraycopy(fieldNameUTF8, 0, bytes, 1, 4);
bytes[5] = '"';
bytes[6] = ':';
methodName = "writeName4Raw";
break;
case 5:
bytes[0] = '"';
System.arraycopy(fieldNameUTF8, 0, bytes, 1, 5);
bytes[6] = '"';
bytes[7] = ':';
methodName = "writeName5Raw";
break;
case 6:
bytes[0] = '"';
System.arraycopy(fieldNameUTF8, 0, bytes, 1, 6);
bytes[7] = '"';
methodName = "writeName6Raw";
break;
case 7:
bytes[0] = '"';
System.arraycopy(fieldNameUTF8, 0, bytes, 1, 7);
methodName = "writeName7Raw";
break;
case 8: {
bytes = fieldNameUTF8;
methodName = "writeName8Raw";
break;
}
case 9: {
bytes[0] = '"';
System.arraycopy(fieldNameUTF8, 0, bytes, 1, 7);
methodDesc = "(JI)V";
byte[] name1Bytes = new byte[4];
name1Bytes[0] = fieldNameUTF8[7];
name1Bytes[1] = fieldNameUTF8[8];
name1Bytes[2] = '"';
name1Bytes[3] = ':';
name1 = UNSAFE.getInt(name1Bytes, ARRAY_BYTE_BASE_OFFSET);
name1Bytes[2] = '\'';
name1SQ = UNSAFE.getInt(name1Bytes, ARRAY_BYTE_BASE_OFFSET);
methodName = "writeName9Raw";
break;
}
case 10: {
bytes[0] = '"';
System.arraycopy(fieldNameUTF8, 0, bytes, 1, 7);
methodDesc = "(JJ)V";
byte[] name1Bytes = new byte[8];
name1Bytes[0] = fieldNameUTF8[7];
name1Bytes[1] = fieldNameUTF8[8];
name1Bytes[2] = fieldNameUTF8[9];
name1Bytes[3] = '"';
name1Bytes[4] = ':';
name1 = UNSAFE.getLong(name1Bytes, ARRAY_BYTE_BASE_OFFSET);
name1Bytes[3] = '\'';
name1SQ = UNSAFE.getLong(name1Bytes, ARRAY_BYTE_BASE_OFFSET);
methodName = "writeName10Raw";
break;
}
case 11: {
bytes[0] = '"';
System.arraycopy(fieldNameUTF8, 0, bytes, 1, 7);
methodDesc = "(JJ)V";
byte[] name1Bytes = new byte[8];
name1Bytes[0] = fieldNameUTF8[7];
name1Bytes[1] = fieldNameUTF8[8];
name1Bytes[2] = fieldNameUTF8[9];
name1Bytes[3] = fieldNameUTF8[10];
name1Bytes[4] = '"';
name1Bytes[5] = ':';
name1 = UNSAFE.getLong(name1Bytes, ARRAY_BYTE_BASE_OFFSET);
name1Bytes[4] = '\'';
name1SQ = UNSAFE.getLong(name1Bytes, ARRAY_BYTE_BASE_OFFSET);
methodName = "writeName11Raw";
break;
}
case 12: {
bytes[0] = '"';
System.arraycopy(fieldNameUTF8, 0, bytes, 1, 7);
methodDesc = "(JJ)V";
byte[] name1Bytes = new byte[8];
name1Bytes[0] = fieldNameUTF8[7];
name1Bytes[1] = fieldNameUTF8[8];
name1Bytes[2] = fieldNameUTF8[9];
name1Bytes[3] = fieldNameUTF8[10];
name1Bytes[4] = fieldNameUTF8[11];
name1Bytes[5] = '"';
name1Bytes[6] = ':';
name1 = UNSAFE.getLong(name1Bytes, ARRAY_BYTE_BASE_OFFSET);
name1Bytes[5] = '\'';
name1SQ = UNSAFE.getLong(name1Bytes, ARRAY_BYTE_BASE_OFFSET);
methodName = "writeName12Raw";
break;
}
case 13: {
bytes[0] = '"';
System.arraycopy(fieldNameUTF8, 0, bytes, 1, 7);
methodDesc = "(JJ)V";
byte[] name1Bytes = new byte[8];
name1Bytes[0] = fieldNameUTF8[7];
name1Bytes[1] = fieldNameUTF8[8];
name1Bytes[2] = fieldNameUTF8[9];
name1Bytes[3] = fieldNameUTF8[10];
name1Bytes[4] = fieldNameUTF8[11];
name1Bytes[5] = fieldNameUTF8[12];
name1Bytes[6] = '"';
name1Bytes[7] = ':';
name1 = UNSAFE.getLong(name1Bytes, ARRAY_BYTE_BASE_OFFSET);
name1Bytes[6] = '\'';
name1SQ = UNSAFE.getLong(name1Bytes, ARRAY_BYTE_BASE_OFFSET);
methodName = "writeName13Raw";
break;
}
case 14: {
bytes[0] = '"';
System.arraycopy(fieldNameUTF8, 0, bytes, 1, 7);
methodDesc = "(JJ)V";
byte[] name1Bytes = new byte[8];
name1Bytes[0] = fieldNameUTF8[7];
name1Bytes[1] = fieldNameUTF8[8];
name1Bytes[2] = fieldNameUTF8[9];
name1Bytes[3] = fieldNameUTF8[10];
name1Bytes[4] = fieldNameUTF8[11];
name1Bytes[5] = fieldNameUTF8[12];
name1Bytes[6] = fieldNameUTF8[13];
name1Bytes[7] = '"';
name1 = UNSAFE.getLong(name1Bytes, ARRAY_BYTE_BASE_OFFSET);
name1Bytes[7] = '\'';
name1SQ = UNSAFE.getLong(name1Bytes, ARRAY_BYTE_BASE_OFFSET);
methodName = "writeName14Raw";
break;
}
case 15: {
bytes[0] = '"';
System.arraycopy(fieldNameUTF8, 0, bytes, 1, 7);
methodDesc = "(JJ)V";
name1 = UNSAFE.getLong(fieldNameUTF8, ARRAY_BYTE_BASE_OFFSET + 7);
name1SQ = name1;
methodName = "writeName15Raw";
break;
}
case 16: {
System.arraycopy(fieldNameUTF8, 0, bytes, 0, 8);
methodDesc = "(JJ)V";
name1 = UNSAFE.getLong(fieldNameUTF8, ARRAY_BYTE_BASE_OFFSET + 8);
name1SQ = name1;
methodName = "writeName16Raw";
break;
}
default:
throw new IllegalStateException("length : " + length);
}
long nameIn64 = UNSAFE.getLong(bytes, ARRAY_BYTE_BASE_OFFSET);
for (int j = 0; j < bytes.length; j++) {
if (bytes[j] == '"') {
bytes[j] = '\'';
}
}
long nameIn64SQ = UNSAFE.getLong(bytes, ARRAY_BYTE_BASE_OFFSET);
mw.aload(JSON_WRITER);
mwc.ldcIFEQ(NAME_DIRECT, nameIn64, nameIn64SQ);
if ("(JI)V".equals(methodDesc) || "(JJ)V".equals(methodDesc)) {
mwc.ldcIFEQ(NAME_DIRECT, name1, name1SQ);
}
mw.invokevirtual(
TYPE_JSON_WRITER,
methodName,
methodDesc);
return;
}
} else {
byte[] fieldNameUTF8 = JSONB.toBytes(fieldWriter.fieldName);
int length = fieldNameUTF8.length;
String methodName = null;
String methodDesc = "(J)V";
byte[] bytes = Arrays.copyOf(fieldNameUTF8, 16);
switch (length) {
case 2:
methodName = "writeName2Raw";
break;
case 3:
methodName = "writeName3Raw";
break;
case 4:
methodName = "writeName4Raw";
break;
case 5:
methodName = "writeName5Raw";
break;
case 6:
methodName = "writeName6Raw";
break;
case 7:
methodName = "writeName7Raw";
break;
case 8:
methodName = "writeName8Raw";
break;
case 9:
methodName = "writeName9Raw";
methodDesc = "(JI)V";
break;
case 10:
methodName = "writeName10Raw";
methodDesc = "(JJ)V";
break;
case 11:
methodName = "writeName11Raw";
methodDesc = "(JJ)V";
break;
case 12:
methodName = "writeName12Raw";
methodDesc = "(JJ)V";
break;
case 13:
methodName = "writeName13Raw";
methodDesc = "(JJ)V";
break;
case 14:
methodName = "writeName14Raw";
methodDesc = "(JJ)V";
break;
case 15:
methodName = "writeName15Raw";
methodDesc = "(JJ)V";
break;
case 16:
methodName = "writeName16Raw";
methodDesc = "(JJ)V";
break;
default:
break;
}
if (methodName != null) {
mw.iload(mwc.var(NAME_DIRECT));
mw.ifeq(labelElse);
long nameIn64 = UNSAFE.getLong(bytes, ARRAY_BYTE_BASE_OFFSET);
mw.aload(JSON_WRITER);
mw.visitLdcInsn(nameIn64);
if ("(JI)V".equals(methodDesc)) {
int name1 = UNSAFE.getInt(bytes, ARRAY_BYTE_BASE_OFFSET + 8);
mw.visitLdcInsn(name1);
} else if ("(JJ)V".equals(methodDesc)) {
long name1 = UNSAFE.getLong(bytes, ARRAY_BYTE_BASE_OFFSET + 8);
mw.visitLdcInsn(name1);
}
mw.invokevirtual(
TYPE_JSON_WRITER,
methodName,
methodDesc);
mw.goto_(labelEnd);
writeDirect = true;
}
}
if (writeDirect) {
mw.visitLabel(labelElse);
}
mw.aload(THIS);
mw.getfield(classNameType, fieldWriter(i), DESC_FIELD_WRITER);
mw.aload(JSON_WRITER);
mw.invokevirtual(
TYPE_FIELD_WRITER,
mwc.jsonb ? "writeFieldNameJSONB" : "writeFieldName",
METHOD_DESC_WRITE_FIELD_NAME);
if (writeDirect) {
mw.visitLabel(labelEnd);
}
}