From 114ba01a02bc4bd1173fe0b5722537ddbbb0aa8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=93=81?= Date: Sat, 2 Apr 2016 03:48:24 +0800 Subject: [PATCH] improved performance --- .../fastjson/parser/DefaultJSONParser.java | 51 +++++-------------- .../deserializer/ASMDeserializerFactory.java | 11 +--- .../DefaultFieldDeserializer.java | 4 +- .../json/test/codegen/DepartmentCodec.java | 4 +- .../data/media/MediaContentGenDecoder.java | 4 +- 5 files changed, 21 insertions(+), 53 deletions(-) diff --git a/src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java b/src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java index 203a8390d..4f84a442f 100755 --- a/src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java +++ b/src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java @@ -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; - } - } } diff --git a/src/main/java/com/alibaba/fastjson/parser/deserializer/ASMDeserializerFactory.java b/src/main/java/com/alibaba/fastjson/parser/deserializer/ASMDeserializerFactory.java index 91df6fff7..ceb98f039 100755 --- a/src/main/java/com/alibaba/fastjson/parser/deserializer/ASMDeserializerFactory.java +++ b/src/main/java/com/alibaba/fastjson/parser/deserializer/ASMDeserializerFactory.java @@ -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"); diff --git a/src/main/java/com/alibaba/fastjson/parser/deserializer/DefaultFieldDeserializer.java b/src/main/java/com/alibaba/fastjson/parser/deserializer/DefaultFieldDeserializer.java index 3ea090d6c..b9733a0aa 100755 --- a/src/main/java/com/alibaba/fastjson/parser/deserializer/DefaultFieldDeserializer.java +++ b/src/main/java/com/alibaba/fastjson/parser/deserializer/DefaultFieldDeserializer.java @@ -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) { diff --git a/src/test/java/com/alibaba/json/test/codegen/DepartmentCodec.java b/src/test/java/com/alibaba/json/test/codegen/DepartmentCodec.java index c16563a7a..b6cd11087 100644 --- a/src/test/java/com/alibaba/json/test/codegen/DepartmentCodec.java +++ b/src/test/java/com/alibaba/json/test/codegen/DepartmentCodec.java @@ -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); } } diff --git a/src/test/java/data/media/MediaContentGenDecoder.java b/src/test/java/data/media/MediaContentGenDecoder.java index d1f887199..65f339404 100644 --- a/src/test/java/data/media/MediaContentGenDecoder.java +++ b/src/test/java/data/media/MediaContentGenDecoder.java @@ -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); } }