refactor ObjectReaderCreatorASM

This commit is contained in:
wenshao 2025-02-26 08:51:46 +08:00
parent 88c0a475ab
commit a4c841139d

View File

@ -897,23 +897,25 @@ public class ObjectReaderCreatorASM
final int FIELD_TYPE = 2;
final int FIELD_NAME = 3;
final int FEATURES = 4;
final int OBJECT = 6;
final int ENTRY_CNT = 7;
final int I = 8;
final int HASH_CODE64 = 9;
final int HASH_CODE_32 = 11;
final int ITEM_CNT = 12;
final int J = 13;
final int FIELD_READER = 14;
final int AUTO_TYPE_OBJECT_READER = 15;
MethodWriterContext mwc = new MethodWriterContext(mw, 6);
mw.aload(JSON_READER);
mw.lload(FEATURES);
mw.invokevirtual(TYPE_JSON_READER, "features", "(J)J");
mw.lstore(FEATURES);
final int OBJECT = mwc.var("object");
final int I = mwc.var("I");
final int HASH_CODE64 = mwc.var2("hashCode64");
final int HASH_CODE_32 = mwc.var("hashCode32");
final int ITEM_CNT = mwc.var("itemCnt");
final int J = mwc.var("J");
final int FIELD_READER = mwc.var("fieldReader");
final int AUTO_TYPE_OBJECT_READER = mwc.var("autoTypeObjectReader");
if (!disableAutoType) {
genCheckAutoType(classNameType, mw, JSON_READER, FIELD_TYPE, FIELD_NAME, FEATURES, AUTO_TYPE_OBJECT_READER);
}
int varIndex = 16;
Map<Object, Integer> variants = new HashMap<>();
{
Label notNull_ = new Label();
mw.aload(JSON_READER);
@ -985,20 +987,18 @@ public class ObjectReaderCreatorASM
mw.ifne(for_end_i_);
if (context.fieldNameLengthMin >= 2 && context.fieldNameLengthMax <= 43) {
varIndex = genRead243(
genRead243(
context,
TYPE_OBJECT,
fieldReaderArray,
classNameType,
fieldBased,
mw,
mwc,
JSON_READER,
FEATURES,
OBJECT,
ITEM_CNT,
J,
varIndex,
variants,
for_inc_i_,
hashCode64Start,
true
@ -1096,18 +1096,16 @@ public class ObjectReaderCreatorASM
FieldReader fieldReader = fieldReaderArray[index];
varIndex = genReadFieldValue(
genReadFieldValue(
context,
fieldReader,
fieldBased,
classNameType,
mw,
mwc,
THIS,
JSON_READER,
OBJECT,
FEATURES,
varIndex,
variants,
ITEM_CNT,
J,
index,
@ -1165,18 +1163,16 @@ public class ObjectReaderCreatorASM
mw.lcmp();
mw.ifne(next_);
varIndex = genReadFieldValue(
genReadFieldValue(
context,
fieldReader,
fieldBased,
classNameType,
mw,
mwc,
THIS,
JSON_READER,
OBJECT,
FEATURES,
varIndex,
variants,
ITEM_CNT,
J,
i,
@ -1215,18 +1211,16 @@ public class ObjectReaderCreatorASM
mw.lcmp();
mw.ifne(next_);
varIndex = genReadFieldValue(
genReadFieldValue(
context,
fieldReader,
fieldBased,
classNameType,
mw,
mwc,
THIS,
JSON_READER,
OBJECT,
FEATURES,
varIndex,
variants,
ITEM_CNT,
J,
i,
@ -1285,19 +1279,22 @@ public class ObjectReaderCreatorASM
final int FIELD_TYPE = 2;
final int FIELD_NAME = 3;
final int FEATURES = 4;
final int OBJECT = 6;
final int ENTRY_CNT = 7;
final int ITEM_CNT = 8;
final int J = 9;
final int AUTO_TYPE_OBJECT_READER = 10;
MethodWriterContext mwc = new MethodWriterContext(mw, 6);
mw.aload(JSON_READER);
mw.lload(FEATURES);
mw.invokevirtual(TYPE_JSON_READER, "features", "(J)J");
mw.lstore(FEATURES);
final int OBJECT = mwc.var("object");
final int ENTRY_CNT = mwc.var("entryCnt");
final int ITEM_CNT = mwc.var("itemCount");
final int J = mwc.var("J");
final int AUTO_TYPE_OBJECT_READER = mwc.var("autoTypeObjectReader");
if (!context.disableAutoType()) {
genCheckAutoType(classNameType, mw, JSON_READER, FIELD_TYPE, FIELD_NAME, FEATURES, AUTO_TYPE_OBJECT_READER);
}
int varIndex = 11;
Map<Object, Integer> variants = new HashMap<>();
{
Label notNull_ = new Label();
mw.aload(JSON_READER);
@ -1322,18 +1319,16 @@ public class ObjectReaderCreatorASM
for (int i = 0; i < fieldReaderArray.length; ++i) {
FieldReader fieldReader = fieldReaderArray[i];
varIndex = genReadFieldValue(
genReadFieldValue(
context,
fieldReader,
fieldBased,
classNameType,
mw,
mwc,
THIS,
JSON_READER,
OBJECT,
FEATURES,
varIndex,
variants,
ITEM_CNT,
J,
i,
@ -1412,16 +1407,15 @@ public class ObjectReaderCreatorASM
final int FIELD_TYPE = 2;
final int FIELD_NAME = 3;
final int FEATURES = 4;
final int OBJECT = 6;
final int I = 7;
final int HASH_CODE64 = 8;
final int HASH_CODE_32 = 10;
final int ITEM_CNT = 11;
final int J = 12;
final int FIELD_READER = 13;
MethodWriterContext mwc = new MethodWriterContext(mw, 6);
int varIndex = 14;
Map<Object, Integer> variants = new HashMap<>();
final int OBJECT = mwc.var("object");
final int I = mwc.var("I");
final int HASH_CODE64 = mwc.var2("hashCode64");
final int HASH_CODE_32 = mwc.var("hashCode32");
final int ITEM_CNT = mwc.var("itemCount");
final int J = mwc.var("J");
final int FIELD_READER = mwc.var("fieldReader");
boolean disableArrayMapping = context.disableSupportArrayMapping();
boolean disableAutoType = context.disableAutoType();
@ -1445,6 +1439,10 @@ public class ObjectReaderCreatorASM
mw.visitLabel(json_);
}
mw.aload(JSON_READER);
mw.lload(FEATURES);
mw.invokevirtual(TYPE_JSON_READER, "features", "(J)J");
mw.lstore(FEATURES);
if (!disableSmartMatch || !disableArrayMapping) {
Label object_ = new Label();
@ -1520,39 +1518,35 @@ public class ObjectReaderCreatorASM
boolean switchGen = false;
if (context.fieldNameLengthMin >= 5 && context.fieldNameLengthMax <= 7) {
varIndex = genRead57(
genRead57(
context,
TYPE_OBJECT,
fieldReaderArray,
classNameType,
fieldBased,
mw,
mwc,
JSON_READER,
FEATURES,
OBJECT,
ITEM_CNT,
J,
varIndex,
variants,
for_inc_i_,
hashCode64Start
);
switchGen = true;
} else if (context.fieldNameLengthMin >= 2 && context.fieldNameLengthMax <= 43) {
varIndex = genRead243(
genRead243(
context,
TYPE_OBJECT,
fieldReaderArray,
classNameType,
fieldBased,
mw,
mwc,
JSON_READER,
FEATURES,
OBJECT,
ITEM_CNT,
J,
varIndex,
variants,
for_inc_i_,
hashCode64Start,
false
@ -1667,18 +1661,16 @@ public class ObjectReaderCreatorASM
FieldReader fieldReader = fieldReaderArray[index];
varIndex = genReadFieldValue(
genReadFieldValue(
context,
fieldReader,
fieldBased,
classNameType,
mw,
mwc,
THIS,
JSON_READER,
OBJECT,
FEATURES,
varIndex,
variants,
ITEM_CNT,
J,
index,
@ -1701,9 +1693,11 @@ public class ObjectReaderCreatorASM
if (!disableSmartMatch) {
Label fieldReaderNull_ = new Label();
if ((readerFeatures & JSONReader.Feature.SupportSmartMatch.mask) == 0) {
mw.aload(JSON_READER);
mw.lload(FEATURES);
mw.invokevirtual(TYPE_JSON_READER, "isSupportSmartMatch", "(J)Z");
mw.visitLdcInsn(JSONReader.Feature.SupportSmartMatch.mask);
mw.land();
mw.lconst_0();
mw.lcmp();
mw.ifeq(fieldReaderNull_);
}
@ -1739,18 +1733,16 @@ public class ObjectReaderCreatorASM
mw.ifne(next_);
mw.visitLabel(get_);
varIndex = genReadFieldValue(
genReadFieldValue(
context,
fieldReader,
fieldBased,
classNameType,
mw,
mwc,
THIS,
JSON_READER,
OBJECT,
FEATURES,
varIndex,
variants,
ITEM_CNT,
J,
i,
@ -1768,9 +1760,11 @@ public class ObjectReaderCreatorASM
if (!disableSmartMatch) {
if ((readerFeatures & JSONReader.Feature.SupportSmartMatch.mask) == 0) {
mw.aload(JSON_READER);
mw.lload(FEATURES);
mw.invokevirtual(TYPE_JSON_READER, "isSupportSmartMatch", "(J)Z");
mw.visitLdcInsn(JSONReader.Feature.SupportSmartMatch.mask);
mw.land();
mw.lconst_0();
mw.lcmp();
mw.ifeq(processExtra_);
}
@ -1803,18 +1797,16 @@ public class ObjectReaderCreatorASM
}
mw.visitLabel(get_);
varIndex = genReadFieldValue(
genReadFieldValue(
context,
fieldReader,
fieldBased,
classNameType,
mw,
mwc,
THIS,
JSON_READER,
OBJECT,
FEATURES,
varIndex,
variants,
ITEM_CNT,
J,
i,
@ -1856,24 +1848,23 @@ public class ObjectReaderCreatorASM
mw.visitMaxs(5, 10);
}
private int genRead243(
private void genRead243(
ObjectWriteContext context,
String TYPE_OBJECT,
FieldReader[] fieldReaderArray,
String classNameType,
boolean fieldBased,
MethodWriter mw,
MethodWriterContext mwc,
int JSON_READER,
int FEATURES,
int OBJECT,
int ITEM_CNT,
int J,
int varIndex,
Map<Object, Integer> variants,
Label for_inc_i_,
Label hashCode64Start,
boolean jsonb
) {
MethodWriter mw = mwc.mw;
IdentityHashMap<FieldReader, Integer> readerIndexMap = new IdentityHashMap<>();
Map<Integer, List<FieldReader>> name0Map = new TreeMap<>();
for (int i = 0; i < fieldReaderArray.length; ++i) {
@ -2544,18 +2535,16 @@ public class ObjectReaderCreatorASM
}
mw.ifeq(nextJ != null ? nextJ : hashCode64Start);
varIndex = genReadFieldValue(
genReadFieldValue(
context,
fieldReader,
fieldBased,
classNameType,
mw,
mwc,
THIS,
JSON_READER,
OBJECT,
FEATURES,
varIndex,
variants,
ITEM_CNT,
J,
fieldReaderIndex,
@ -2575,32 +2564,25 @@ public class ObjectReaderCreatorASM
}
mw.visitLabel(dflt);
return varIndex;
}
private int genRead57(
private void genRead57(
ObjectWriteContext context,
String TYPE_OBJECT,
FieldReader[] fieldReaderArray,
String classNameType,
boolean fieldBased,
MethodWriter mw,
MethodWriterContext mwc,
int JSON_READER,
int FEATURES,
int OBJECT,
int ITEM_CNT,
int J,
int varIndex,
Map<Object, Integer> variants,
Label for_inc_i_,
Label hashCode64Start
) {
Integer RAW_LONG = variants.get("RAW_LONG");
if (RAW_LONG == null) {
variants.put("RAW_LONG", RAW_LONG = varIndex);
varIndex += 2;
}
int RAW_LONG = mwc.var2("RAW_LONG");
MethodWriter mw = mwc.mw;
mw.aload(JSON_READER);
mw.invokevirtual(TYPE_JSON_READER, "getRawLong", "()J");
@ -2649,18 +2631,16 @@ public class ObjectReaderCreatorASM
mw.invokevirtual(TYPE_JSON_READER, nextMethodName, "()Z");
mw.ifeq(hashCode64Start);
varIndex = genReadFieldValue(
genReadFieldValue(
context,
fieldReader,
fieldBased,
classNameType,
mw,
mwc,
THIS,
JSON_READER,
OBJECT,
FEATURES,
varIndex,
variants,
ITEM_CNT,
J,
i,
@ -2673,7 +2653,6 @@ public class ObjectReaderCreatorASM
mw.visitLabel(next_);
}
return varIndex;
}
private <T> void genCreateObject(
@ -2712,32 +2691,37 @@ public class ObjectReaderCreatorASM
}
if (context.hasStringField) {
Label endInitStringAsEmpty_ = new Label(), addResolveTask_ = new Label();
mw.aload(JSON_READER);
mw.invokevirtual(TYPE_JSON_READER, "isInitStringFieldAsEmpty", "()Z");
mw.ifeq(endInitStringAsEmpty_);
/*
* if ((features & JSONReader.Feature.InitStringFieldAsEmpty.mask) != 0) {
* this.initStringFieldAsEmpty(object);
* }
*/
Label L0 = new Label();
mw.lload(FEATURES);
mw.visitLdcInsn(JSONReader.Feature.InitStringFieldAsEmpty.mask);
mw.land();
mw.lconst_0();
mw.lcmp();
mw.ifeq(L0);
mw.dup();
mw.aload(THIS);
mw.swap();
mw.invokevirtual(classNameType, "initStringFieldAsEmpty", "(Ljava/lang/Object;)V");
mw.visitLabel(endInitStringAsEmpty_);
mw.visitLabel(L0);
}
}
private <T> int genReadFieldValue(
private <T> void genReadFieldValue(
ObjectWriteContext context,
FieldReader fieldReader,
boolean fieldBased,
String classNameType,
MethodWriter mw,
MethodWriterContext mwc,
int THIS,
int JSON_READER,
int OBJECT,
int FEATURES,
int varIndex,
Map<Object, Integer> variants,
int ITEM_CNT,
int J,
int i,
@ -2752,13 +2736,15 @@ public class ObjectReaderCreatorASM
String format = fieldReader.format;
Type itemType = fieldReader.itemType;
MethodWriter mw = mwc.mw;
if ((fieldFeatures & JSONReader.Feature.NullOnError.mask) != 0) {
mw.aload(THIS);
mw.getfield(classNameType, fieldReader(i), DESC_FIELD_READER);
mw.aload(JSON_READER);
mw.aload(OBJECT);
mw.invokevirtual(TYPE_FIELD_READE, "readFieldValue", METHOD_DESC_READ_FIELD_VALUE);
return varIndex;
return;
}
Field field = fieldReader.field;
@ -2868,10 +2854,9 @@ public class ObjectReaderCreatorASM
Label endObject_ = new Label();
boolean disableReferenceDetect = context.disableReferenceDetect();
Integer REFERENCE = variants.get("REFERENCE");
if (REFERENCE == null && !disableReferenceDetect) {
variants.put("REFERENCE", REFERENCE = varIndex);
varIndex++;
Integer REFERENCE = null;
if (!disableReferenceDetect) {
REFERENCE = mwc.var("REFERENCE");
}
if ((!disableReferenceDetect) && (!ObjectWriterProvider.isPrimitiveOrEnum(fieldClass))) {
@ -2916,9 +2901,19 @@ public class ObjectReaderCreatorASM
if (!fieldReader.fieldClassSerializable) {
Label endIgnoreCheck_ = new Label();
mw.aload(JSON_READER);
mw.invokevirtual(TYPE_JSON_READER, "isIgnoreNoneSerializable", "()Z");
/*
* if ((features & Feature.IgnoreNoneSerializable.mask) != 0) {
* jsonReader.skipValue();
* goto endSet_;
* }
*/
mw.lload(FEATURES);
mw.visitLdcInsn(JSONReader.Feature.IgnoreNoneSerializable.mask);
mw.land();
mw.lconst_0();
mw.lcmp();
mw.ifeq(endIgnoreCheck_);
mw.aload(JSON_READER);
mw.invokevirtual(TYPE_JSON_READER, "skipValue", "()V");
mw.pop();
@ -2945,16 +2940,14 @@ public class ObjectReaderCreatorASM
}
if (list) {
varIndex = genReadFieldValueList(
genReadFieldValueList(
fieldReader,
classNameType,
mw,
mwc,
THIS,
JSON_READER,
OBJECT,
FEATURES,
varIndex,
variants,
ITEM_CNT,
J,
i,
@ -3076,15 +3069,7 @@ public class ObjectReaderCreatorASM
if (setDirect) {
mw.putfield(TYPE_OBJECT, field.getName(), DESC_FIELD_CLASS);
} else {
Integer FIELD_VALUE = variants.get(fieldClass);
if (FIELD_VALUE == null) {
variants.put(fieldClass, FIELD_VALUE = varIndex);
if (fieldClass == long.class || fieldClass == double.class) {
varIndex += 2;
} else {
varIndex++;
}
}
int FIELD_VALUE = mwc.var(fieldClass);
String methodName, methodDes;
int LOAD;
@ -3147,15 +3132,7 @@ public class ObjectReaderCreatorASM
boolean invokeFieldReaderAccept = context.externalClass || method == null || !context.publicClass;
if (invokeFieldReaderAccept) {
Integer FIELD_VALUE = variants.get(fieldClass);
if (FIELD_VALUE == null) {
variants.put(fieldClass, FIELD_VALUE = varIndex);
if (fieldClass == long.class || fieldClass == double.class) {
varIndex += 2;
} else {
varIndex++;
}
}
int FIELD_VALUE = mwc.var(fieldClass);
String acceptMethodDesc;
int LOAD;
@ -3271,8 +3248,6 @@ public class ObjectReaderCreatorASM
}
mw.visitLabel(endSet_);
return varIndex;
}
private void genReadObject(
@ -3529,16 +3504,14 @@ public class ObjectReaderCreatorASM
mw.visitLabel(enumEnd);
}
private int genReadFieldValueList(
private void genReadFieldValueList(
FieldReader fieldReader,
String classNameType,
MethodWriter mw,
MethodWriterContext mwc,
int THIS,
int JSON_READER,
int OBJECT,
int FEATURES,
int varIndex,
Map<Object, Integer> variants,
int ITEM_CNT,
int J,
int i,
@ -3558,17 +3531,10 @@ public class ObjectReaderCreatorASM
Class itemClass = TypeUtils.getMapping(itemType);
String ITEM_OBJECT_READER = fieldItemObjectReader(i);
MethodWriter mw = mwc.mw;
Integer LIST = variants.get(fieldClass);
if (LIST == null) {
variants.put(fieldClass, LIST = varIndex);
varIndex++;
}
Integer AUTO_TYPE_OBJECT_READER = variants.get(ObjectReader.class);
if (AUTO_TYPE_OBJECT_READER == null) {
variants.put(fieldClass, AUTO_TYPE_OBJECT_READER = varIndex);
varIndex++;
}
Integer LIST = mwc.var(fieldClass);
Integer AUTO_TYPE_OBJECT_READER = mwc.var(ObjectReader.class);
String LIST_TYPE = fieldClass.isInterface() ? "java/util/ArrayList" : TYPE_FIELD_CLASS;
@ -3833,7 +3799,6 @@ public class ObjectReaderCreatorASM
mw.visitLabel(loadList_);
mw.aload(LIST);
return varIndex;
}
private void gwGetFieldType(String classNameType, MethodWriter mw, int THIS, int i, Type fieldType) {
@ -4303,4 +4268,39 @@ public class ObjectReaderCreatorASM
}
return null;
}
static class MethodWriterContext {
final MethodWriter mw;
final Map<Object, Integer> variants = new LinkedHashMap<>();
int maxVariant;
public MethodWriterContext(MethodWriter mw, int maxVariant) {
this.mw = mw;
this.maxVariant = maxVariant;
}
int var(Object key) {
Integer var = variants.get(key);
if (var == null) {
var = maxVariant;
variants.put(key, var);
if (key == long.class || key == double.class) {
maxVariant += 2;
} else {
maxVariant += 1;
}
}
return var;
}
int var2(Object key) {
Integer var = variants.get(key);
if (var == null) {
var = maxVariant;
variants.put(key, var);
maxVariant += 2;
}
return var;
}
}
}