From e2406483cd2dcb2c4f2943381edc9c61756e7431 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=93=81?= Date: Sat, 30 Apr 2016 15:55:21 +0800 Subject: [PATCH] refactor asm bytecode gen for BeanToArray --- .../com/alibaba/fastjson/parser/JSONLexer.java | 2 ++ .../deserializer/ASMDeserializerFactory.java | 15 +++++++++------ .../parser/deserializer/JavaBeanDeserializer.java | 4 ---- .../json/test/codec/FastjsonBeanToArrayCodec.java | 10 +++++----- .../json/test/codegen/DepartmentCodec.java | 2 +- src/test/java/data/media/ImageGenDecoder.java | 2 +- .../java/data/media/MediaContentGenDecoder.java | 2 +- src/test/java/data/media/MediaGenDecoder.java | 2 +- 8 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/alibaba/fastjson/parser/JSONLexer.java b/src/main/java/com/alibaba/fastjson/parser/JSONLexer.java index 6b3ae0a392..399075e08f 100644 --- a/src/main/java/com/alibaba/fastjson/parser/JSONLexer.java +++ b/src/main/java/com/alibaba/fastjson/parser/JSONLexer.java @@ -50,6 +50,8 @@ public interface JSONLexer { String stringVal(); + boolean isEnabled(int feature); + boolean isEnabled(Feature feature); void config(Feature feature, boolean state); 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 d2414347ea..c91cc04fb5 100755 --- a/src/main/java/com/alibaba/fastjson/parser/deserializer/ASMDeserializerFactory.java +++ b/src/main/java/com/alibaba/fastjson/parser/deserializer/ASMDeserializerFactory.java @@ -377,7 +377,8 @@ void _deserialze(ClassWriter cw, Context context) { } } - context.fieldInfoList = context.beanInfo.sortedFields; + JavaBeanInfo beanInfo = context.beanInfo; + context.fieldInfoList = beanInfo.sortedFields; MethodVisitor mw = new MethodWriter(cw, ACC_PUBLIC, "deserialze", "(L" + DefaultJSONParser + ";Ljava/lang/reflect/Type;Ljava/lang/Object;)Ljava/lang/Object;", @@ -399,17 +400,19 @@ void _deserialze(ClassWriter cw, Context context) { { Label next_ = new Label(); - mw.visitVarInsn(ALOAD, 0); - mw.visitVarInsn(ALOAD, context.var("lexer")); - mw.visitMethodInsn(INVOKESPECIAL, type(JavaBeanDeserializer.class), - "isSupportArrayToBean", "(" + desc(JSONLexer.class) + ")Z"); - mw.visitJumpInsn(IFEQ, next_); // isSupportArrayToBean mw.visitVarInsn(ALOAD, context.var("lexer")); mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "token", "()I"); mw.visitLdcInsn(JSONToken.LBRACKET); mw.visitJumpInsn(IF_ICMPNE, next_); + + if ((beanInfo.parserFeatures & Feature.SupportArrayToBean.mask) == 0) { + mw.visitVarInsn(ALOAD, context.var("lexer")); + mw.visitLdcInsn(Feature.SupportArrayToBean.mask); + mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "isEnabled", "(I)Z"); + mw.visitJumpInsn(IFEQ, next_); + } mw.visitVarInsn(ALOAD, 0); mw.visitVarInsn(ALOAD, 1); diff --git a/src/main/java/com/alibaba/fastjson/parser/deserializer/JavaBeanDeserializer.java b/src/main/java/com/alibaba/fastjson/parser/deserializer/JavaBeanDeserializer.java index f26b14fd2e..6037faa2b3 100755 --- a/src/main/java/com/alibaba/fastjson/parser/deserializer/JavaBeanDeserializer.java +++ b/src/main/java/com/alibaba/fastjson/parser/deserializer/JavaBeanDeserializer.java @@ -641,10 +641,6 @@ public FieldDeserializer smartMatch(String key) { public int getFastMatchToken() { return JSONToken.LBRACE; } - - public final boolean isSupportArrayToBean(JSONLexer lexer) { - return Feature.isEnabled(beanInfo.parserFeatures, Feature.SupportArrayToBean) || lexer.isEnabled(Feature.SupportArrayToBean); - } public Object createInstance(Map map, ParserConfig config) // throws IllegalArgumentException, diff --git a/src/test/java/com/alibaba/json/test/codec/FastjsonBeanToArrayCodec.java b/src/test/java/com/alibaba/json/test/codec/FastjsonBeanToArrayCodec.java index 482f97aa93..a99867ea96 100644 --- a/src/test/java/com/alibaba/json/test/codec/FastjsonBeanToArrayCodec.java +++ b/src/test/java/com/alibaba/json/test/codec/FastjsonBeanToArrayCodec.java @@ -8,25 +8,23 @@ import com.alibaba.fastjson.parser.Feature; import com.alibaba.fastjson.parser.ParserConfig; import com.alibaba.fastjson.serializer.JSONSerializer; +import com.alibaba.fastjson.serializer.SerializeConfig; import com.alibaba.fastjson.serializer.SerializeWriter; import com.alibaba.fastjson.serializer.SerializerFeature; public class FastjsonBeanToArrayCodec implements Codec { - private ParserConfig config = ParserConfig.getGlobalInstance(); public String getName() { return "fastjson-bean-to-array"; } public T decodeObject(String text, Class clazz) { - DefaultJSONParser parser = new DefaultJSONParser(text, config); - parser.config(Feature.DisableCircularReferenceDetect, true); - parser.config(Feature.SupportArrayToBean, true); - return parser.parseObject(clazz); + return (T) JSON.parseObject(text, clazz, Feature.DisableCircularReferenceDetect, Feature.SupportArrayToBean); } public Collection decodeArray(String text, Class clazz) throws Exception { + ParserConfig config = ParserConfig.global; DefaultJSONParser parser = new DefaultJSONParser(text, config); parser.config(Feature.DisableCircularReferenceDetect, true); parser.config(Feature.SupportArrayToBean, true); @@ -34,6 +32,7 @@ public Collection decodeArray(String text, Class clazz) throws Excepti } public final Object decodeObject(String text) { + ParserConfig config = ParserConfig.global; DefaultJSONParser parser = new DefaultJSONParser(text, config); parser.config(Feature.DisableCircularReferenceDetect, true); parser.config(Feature.SupportArrayToBean, true); @@ -41,6 +40,7 @@ public final Object decodeObject(String text) { } public final Object decode(String text) { + ParserConfig config = ParserConfig.global; DefaultJSONParser parser = new DefaultJSONParser(text, config); parser.config(Feature.DisableCircularReferenceDetect, true); parser.config(Feature.SupportArrayToBean, true); 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 73246fa89b..704db6cf4c 100644 --- a/src/test/java/com/alibaba/json/test/codegen/DepartmentCodec.java +++ b/src/test/java/com/alibaba/json/test/codegen/DepartmentCodec.java @@ -41,7 +41,7 @@ public Object deserialze(DefaultJSONParser parser, Type type, Object fieldName) return super.deserialze(parser, type, fieldName); } - if (isSupportArrayToBean(lexer)) { + if (lexer.isEnabled(Feature.SupportArrayToBean)) { // deserialzeArrayMapping } diff --git a/src/test/java/data/media/ImageGenDecoder.java b/src/test/java/data/media/ImageGenDecoder.java index 0dcc6c047f..fb3ad5e127 100644 --- a/src/test/java/data/media/ImageGenDecoder.java +++ b/src/test/java/data/media/ImageGenDecoder.java @@ -36,7 +36,7 @@ public Object deserialze(DefaultJSONParser parser, Type type, Object fieldName) return super.deserialze(parser, type, fieldName); } - if (isSupportArrayToBean(lexer)) { + if (lexer.isEnabled(Feature.SupportArrayToBean)) { // deserialzeArrayMapping } diff --git a/src/test/java/data/media/MediaContentGenDecoder.java b/src/test/java/data/media/MediaContentGenDecoder.java index 42f6f0cb87..bc012d8c62 100644 --- a/src/test/java/data/media/MediaContentGenDecoder.java +++ b/src/test/java/data/media/MediaContentGenDecoder.java @@ -36,7 +36,7 @@ public Object deserialze(DefaultJSONParser parser, Type type, Object fieldName) return super.deserialze(parser, type, fieldName); } - if (isSupportArrayToBean(lexer)) { + if (lexer.isEnabled(Feature.SupportArrayToBean)) { // deserialzeArrayMapping } diff --git a/src/test/java/data/media/MediaGenDecoder.java b/src/test/java/data/media/MediaGenDecoder.java index 802c05c436..0a4a5a4642 100644 --- a/src/test/java/data/media/MediaGenDecoder.java +++ b/src/test/java/data/media/MediaGenDecoder.java @@ -46,7 +46,7 @@ public Object deserialze(DefaultJSONParser parser, Type type, Object fieldName) return super.deserialze(parser, type, fieldName); } - if (isSupportArrayToBean(lexer)) { + if (lexer.isEnabled(Feature.SupportArrayToBean)) { // deserialzeArrayMapping }