improved performance

This commit is contained in:
高铁
2016-04-02 03:48:24 +08:00
parent 0b2f1e6526
commit 114ba01a02
5 changed files with 21 additions and 53 deletions
@@ -970,13 +970,13 @@ public class DefaultJSONParser extends AbstractJSONParser implements Closeable {
final int index = array.size() - 1;
final List list = (List) array;
ResolveTask task = getLastResolveTask();
task.setFieldDeserializer(new ListResolveFieldDeserializer(this, list, index));
task.setOwnerContext(context);
task.fieldDeserializer = new ListResolveFieldDeserializer(this, list, index);
task.ownerContext = context;
setResolveStatus(DefaultJSONParser.NONE);
} else {
ResolveTask task = getLastResolveTask();
task.setFieldDeserializer(new CollectionResolveFieldDeserializer(this, array));
task.setOwnerContext(context);
task.fieldDeserializer = new CollectionResolveFieldDeserializer(this, array);
task.ownerContext = context;
setResolveStatus(DefaultJSONParser.NONE);
}
}
@@ -987,8 +987,8 @@ public class DefaultJSONParser extends AbstractJSONParser implements Closeable {
if (resolveStatus == NeedToResolve) {
MapResolveFieldDeserializer fieldResolver = new MapResolveFieldDeserializer(object, fieldName);
ResolveTask task = getLastResolveTask();
task.setFieldDeserializer(fieldResolver);
task.setOwnerContext(context);
task.fieldDeserializer = fieldResolver;
task.ownerContext = context;
setResolveStatus(DefaultJSONParser.NONE);
}
}
@@ -1358,23 +1358,23 @@ public class DefaultJSONParser extends AbstractJSONParser implements Closeable {
int size = resolveTaskList.size();
for (int i = 0; i < size; ++i) {
ResolveTask task = resolveTaskList.get(i);
FieldDeserializer fieldDeser = task.getFieldDeserializer();
FieldDeserializer fieldDeser = task.fieldDeserializer;
if (fieldDeser == null) {
continue;
}
Object object = null;
if (task.getOwnerContext() != null) {
object = task.getOwnerContext().object;
if (task.ownerContext != null) {
object = task.ownerContext.object;
}
String ref = task.getReferenceValue();
String ref = task.referenceValue;
Object refValue;
if (ref.startsWith("$")) {
refValue = getObject(ref);
} else {
refValue = task.getContext().object;
refValue = task.context.object;
}
fieldDeser.setValue(object, refValue);
}
@@ -1384,38 +1384,13 @@ public class DefaultJSONParser extends AbstractJSONParser implements Closeable {
private final ParseContext context;
private final String referenceValue;
private FieldDeserializer fieldDeserializer;
private ParseContext ownerContext;
public FieldDeserializer fieldDeserializer;
public ParseContext ownerContext;
public ResolveTask(ParseContext context, String referenceValue){
this.context = context;
this.referenceValue = referenceValue;
}
public ParseContext getContext() {
return context;
}
public String getReferenceValue() {
return referenceValue;
}
public FieldDeserializer getFieldDeserializer() {
return fieldDeserializer;
}
public void setFieldDeserializer(FieldDeserializer fieldDeserializer) {
this.fieldDeserializer = fieldDeserializer;
}
public ParseContext getOwnerContext() {
return ownerContext;
}
public void setOwnerContext(ParseContext ownerContext) {
this.ownerContext = ownerContext;
}
}
}
@@ -1047,10 +1047,6 @@ public class ASMDeserializerFactory implements Opcodes {
mw.visitFieldInsn(GETSTATIC, "com/alibaba/fastjson/parser/DefaultJSONParser", "NeedToResolve", "I");
mw.visitJumpInsn(IF_ICMPNE, _end_if);
// ResolveTask task = parser.getLastResolveTask();
// task.setFieldDeserializer(this);
// task.setOwnerContext(parser.getContext());
mw.visitVarInsn(ALOAD, 1);
mw.visitMethodInsn(INVOKEVIRTUAL, "com/alibaba/fastjson/parser/DefaultJSONParser", "getLastResolveTask",
"()Lcom/alibaba/fastjson/parser/DefaultJSONParser$ResolveTask;");
@@ -1060,17 +1056,14 @@ public class ASMDeserializerFactory implements Opcodes {
mw.visitVarInsn(ALOAD, 1);
mw.visitMethodInsn(INVOKEVIRTUAL, "com/alibaba/fastjson/parser/DefaultJSONParser", "getContext", "()"
+ "Lcom/alibaba/fastjson/parser/ParseContext;");
mw.visitMethodInsn(INVOKEVIRTUAL, "com/alibaba/fastjson/parser/DefaultJSONParser$ResolveTask"
, "setOwnerContext"
, "(Lcom/alibaba/fastjson/parser/ParseContext;)V");
mw.visitFieldInsn(PUTFIELD, "com/alibaba/fastjson/parser/DefaultJSONParser$ResolveTask", "ownerContext", "Lcom/alibaba/fastjson/parser/ParseContext;");
mw.visitVarInsn(ALOAD, context.var("resolveTask"));
mw.visitVarInsn(ALOAD, 0);
mw.visitLdcInsn(fieldInfo.name);
mw.visitMethodInsn(INVOKEVIRTUAL, "com/alibaba/fastjson/parser/deserializer/ASMJavaBeanDeserializer", "getFieldDeserializer",
"(Ljava/lang/String;)Lcom/alibaba/fastjson/parser/deserializer/FieldDeserializer;");
mw.visitMethodInsn(INVOKEVIRTUAL, "com/alibaba/fastjson/parser/DefaultJSONParser$ResolveTask", "setFieldDeserializer",
"(Lcom/alibaba/fastjson/parser/deserializer/FieldDeserializer;)V");
mw.visitFieldInsn(PUTFIELD, "com/alibaba/fastjson/parser/DefaultJSONParser$ResolveTask", "fieldDeserializer", "Lcom/alibaba/fastjson/parser/deserializer/FieldDeserializer;");
mw.visitVarInsn(ALOAD, 1);
mw.visitFieldInsn(GETSTATIC, "com/alibaba/fastjson/parser/DefaultJSONParser", "NONE", "I");
@@ -33,8 +33,8 @@ public class DefaultFieldDeserializer extends FieldDeserializer {
Object value = fieldValueDeserilizer.deserialze(parser, getFieldType(), fieldInfo.name);
if (parser.getResolveStatus() == DefaultJSONParser.NeedToResolve) {
ResolveTask task = parser.getLastResolveTask();
task.setFieldDeserializer(this);
task.setOwnerContext(parser.getContext());
task.fieldDeserializer = this;
task.ownerContext = parser.getContext();
parser.setResolveStatus(DefaultJSONParser.NONE);
} else {
if (object == null) {
@@ -96,8 +96,8 @@ public class DepartmentCodec extends ASMJavaBeanDeserializer implements ObjectDe
matchedCount++;
if(parser.getResolveStatus() == DefaultJSONParser.NeedToResolve) {
ResolveTask resolveTask = parser.getLastResolveTask();
resolveTask.setOwnerContext(parser.getContext());
resolveTask.setFieldDeserializer(this.getFieldDeserializer("leader"));
resolveTask.ownerContext = parser.getContext();
resolveTask.fieldDeserializer = this.getFieldDeserializer("leader");
parser.setResolveStatus(DefaultJSONParser.NONE);
}
}
@@ -121,8 +121,8 @@ public class MediaContentGenDecoder extends ASMJavaBeanDeserializer implements O
media_gen_deser__.deserialze(parser, data.media.Media.class,"media");
if(parser.getResolveStatus() == DefaultJSONParser.NeedToResolve) {
ResolveTask resolveTask = parser.getLastResolveTask();
resolveTask.setOwnerContext(parser.getContext());
resolveTask.setFieldDeserializer(this.getFieldDeserializer("media"));
resolveTask.ownerContext = parser.getContext();
resolveTask.fieldDeserializer = this.getFieldDeserializer("media");
parser.setResolveStatus(DefaultJSONParser.NONE);
}
}