Search in sources :

Example 46 with Label

use of com.alibaba.fastjson.asm.Label in project fastjson by alibaba.

the class ASMDeserializerFactory method _getCollectionFieldItemDeser.

private void _getCollectionFieldItemDeser(Context context, MethodVisitor mw, FieldInfo fieldInfo, Class<?> itemType) {
    Label notNull_ = new Label();
    mw.visitVarInsn(ALOAD, 0);
    mw.visitFieldInsn(GETFIELD, context.className, fieldInfo.name + "_asm_list_item_deser__", desc(ObjectDeserializer.class));
    mw.visitJumpInsn(IFNONNULL, notNull_);
    mw.visitVarInsn(ALOAD, 0);
    mw.visitVarInsn(ALOAD, 1);
    mw.visitMethodInsn(INVOKEVIRTUAL, DefaultJSONParser, "getConfig", "()" + desc(ParserConfig.class));
    mw.visitLdcInsn(com.alibaba.fastjson.asm.Type.getType(desc(itemType)));
    mw.visitMethodInsn(INVOKEVIRTUAL, type(ParserConfig.class), "getDeserializer", "(Ljava/lang/reflect/Type;)" + desc(ObjectDeserializer.class));
    mw.visitFieldInsn(PUTFIELD, context.className, fieldInfo.name + "_asm_list_item_deser__", desc(ObjectDeserializer.class));
    mw.visitLabel(notNull_);
    mw.visitVarInsn(ALOAD, 0);
    mw.visitFieldInsn(GETFIELD, context.className, fieldInfo.name + "_asm_list_item_deser__", desc(ObjectDeserializer.class));
}
Also used : Label(com.alibaba.fastjson.asm.Label) ParserConfig(com.alibaba.fastjson.parser.ParserConfig)

Example 47 with Label

use of com.alibaba.fastjson.asm.Label in project fastjson by alibaba.

the class ASMDeserializerFactory method _quickNextTokenComma.

private void _quickNextTokenComma(Context context, MethodVisitor mw) {
    Label quickElse_ = new Label(), quickElseIf0_ = new Label(), quickElseIf1_ = new Label(), quickElseIf2_ = new Label(), quickEnd_ = new Label();
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "getCurrent", "()C");
    mw.visitInsn(DUP);
    mw.visitVarInsn(ISTORE, context.var("ch"));
    mw.visitVarInsn(BIPUSH, ',');
    mw.visitJumpInsn(IF_ICMPNE, quickElseIf0_);
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "next", "()C");
    mw.visitInsn(POP);
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitLdcInsn(JSONToken.COMMA);
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "setToken", "(I)V");
    mw.visitJumpInsn(GOTO, quickEnd_);
    mw.visitLabel(quickElseIf0_);
    mw.visitVarInsn(ILOAD, context.var("ch"));
    mw.visitVarInsn(BIPUSH, '}');
    mw.visitJumpInsn(IF_ICMPNE, quickElseIf1_);
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "next", "()C");
    mw.visitInsn(POP);
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitLdcInsn(JSONToken.RBRACE);
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "setToken", "(I)V");
    mw.visitJumpInsn(GOTO, quickEnd_);
    mw.visitLabel(quickElseIf1_);
    mw.visitVarInsn(ILOAD, context.var("ch"));
    mw.visitVarInsn(BIPUSH, ']');
    mw.visitJumpInsn(IF_ICMPNE, quickElseIf2_);
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "next", "()C");
    mw.visitInsn(POP);
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitLdcInsn(JSONToken.RBRACKET);
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "setToken", "(I)V");
    mw.visitJumpInsn(GOTO, quickEnd_);
    mw.visitLabel(quickElseIf2_);
    mw.visitVarInsn(ILOAD, context.var("ch"));
    mw.visitVarInsn(BIPUSH, JSONLexer.EOI);
    mw.visitJumpInsn(IF_ICMPNE, quickElse_);
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitLdcInsn(JSONToken.EOF);
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "setToken", "(I)V");
    mw.visitJumpInsn(GOTO, quickEnd_);
    mw.visitLabel(quickElse_);
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "nextToken", "()V");
    mw.visitLabel(quickEnd_);
}
Also used : Label(com.alibaba.fastjson.asm.Label)

Example 48 with Label

use of com.alibaba.fastjson.asm.Label in project uavstack by uavorg.

the class ASMDeserializerFactory method _quickNextTokenComma.

private void _quickNextTokenComma(Context context, MethodVisitor mw) {
    Label quickElse_ = new Label(), quickElseIf0_ = new Label(), quickElseIf1_ = new Label(), quickElseIf2_ = new Label(), quickEnd_ = new Label();
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "getCurrent", "()C");
    mw.visitInsn(DUP);
    mw.visitVarInsn(ISTORE, context.var("ch"));
    mw.visitVarInsn(BIPUSH, ',');
    mw.visitJumpInsn(IF_ICMPNE, quickElseIf0_);
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "next", "()C");
    mw.visitInsn(POP);
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitLdcInsn(JSONToken.COMMA);
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "setToken", "(I)V");
    mw.visitJumpInsn(GOTO, quickEnd_);
    mw.visitLabel(quickElseIf0_);
    mw.visitVarInsn(ILOAD, context.var("ch"));
    mw.visitVarInsn(BIPUSH, '}');
    mw.visitJumpInsn(IF_ICMPNE, quickElseIf1_);
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "next", "()C");
    mw.visitInsn(POP);
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitLdcInsn(JSONToken.RBRACE);
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "setToken", "(I)V");
    mw.visitJumpInsn(GOTO, quickEnd_);
    mw.visitLabel(quickElseIf1_);
    mw.visitVarInsn(ILOAD, context.var("ch"));
    mw.visitVarInsn(BIPUSH, ']');
    mw.visitJumpInsn(IF_ICMPNE, quickElseIf2_);
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "next", "()C");
    mw.visitInsn(POP);
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitLdcInsn(JSONToken.RBRACKET);
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "setToken", "(I)V");
    mw.visitJumpInsn(GOTO, quickEnd_);
    mw.visitLabel(quickElseIf2_);
    mw.visitVarInsn(ILOAD, context.var("ch"));
    mw.visitVarInsn(BIPUSH, JSONLexer.EOI);
    mw.visitJumpInsn(IF_ICMPNE, quickElse_);
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitLdcInsn(JSONToken.EOF);
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "setToken", "(I)V");
    mw.visitJumpInsn(GOTO, quickEnd_);
    mw.visitLabel(quickElse_);
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "nextToken", "()V");
    mw.visitLabel(quickEnd_);
}
Also used : Label(com.alibaba.fastjson.asm.Label)

Example 49 with Label

use of com.alibaba.fastjson.asm.Label in project uavstack by uavorg.

the class ASMDeserializerFactory method _deserialze_list_obj.

private void _deserialze_list_obj(Context context, MethodVisitor mw, Label reset_, FieldInfo fieldInfo, Class<?> fieldClass, Class<?> itemType, int i) {
    Label _end_if = new Label();
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "matchField", "([C)Z");
    mw.visitJumpInsn(IFEQ, _end_if);
    _setFlag(mw, context, i);
    Label valueNotNull_ = new Label();
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "token", "()I");
    mw.visitLdcInsn(JSONToken.NULL);
    mw.visitJumpInsn(IF_ICMPNE, valueNotNull_);
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitLdcInsn(JSONToken.COMMA);
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "nextToken", "(I)V");
    mw.visitJumpInsn(GOTO, _end_if);
    // loop_end_
    mw.visitLabel(valueNotNull_);
    Label storeCollection_ = new Label(), endSet_ = new Label(), lbacketNormal_ = new Label();
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "token", "()I");
    mw.visitLdcInsn(JSONToken.SET);
    mw.visitJumpInsn(IF_ICMPNE, endSet_);
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitLdcInsn(JSONToken.LBRACKET);
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "nextToken", "(I)V");
    _newCollection(mw, fieldClass, i, true);
    mw.visitJumpInsn(GOTO, storeCollection_);
    mw.visitLabel(endSet_);
    // if (lexer.token() != JSONToken.LBRACKET) reset
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "token", "()I");
    mw.visitLdcInsn(JSONToken.LBRACKET);
    mw.visitJumpInsn(IF_ICMPEQ, lbacketNormal_);
    // if (lexer.token() == JSONToken.LBRACE) reset
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "token", "()I");
    mw.visitLdcInsn(JSONToken.LBRACE);
    mw.visitJumpInsn(IF_ICMPNE, reset_);
    _newCollection(mw, fieldClass, i, false);
    mw.visitVarInsn(ASTORE, context.var(fieldInfo.name + "_asm"));
    _getCollectionFieldItemDeser(context, mw, fieldInfo, itemType);
    mw.visitVarInsn(ALOAD, 1);
    mw.visitLdcInsn(com.alibaba.fastjson.asm.Type.getType(desc(itemType)));
    mw.visitInsn(ICONST_0);
    mw.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;");
    mw.visitMethodInsn(INVOKEINTERFACE, type(ObjectDeserializer.class), "deserialze", "(L" + DefaultJSONParser + ";Ljava/lang/reflect/Type;Ljava/lang/Object;)Ljava/lang/Object;");
    mw.visitVarInsn(ASTORE, context.var("list_item_value"));
    mw.visitVarInsn(ALOAD, context.var(fieldInfo.name + "_asm"));
    mw.visitVarInsn(ALOAD, context.var("list_item_value"));
    if (fieldClass.isInterface()) {
        mw.visitMethodInsn(INVOKEINTERFACE, type(fieldClass), "add", "(Ljava/lang/Object;)Z");
    } else {
        mw.visitMethodInsn(INVOKEVIRTUAL, type(fieldClass), "add", "(Ljava/lang/Object;)Z");
    }
    mw.visitInsn(POP);
    mw.visitJumpInsn(GOTO, _end_if);
    mw.visitLabel(lbacketNormal_);
    _newCollection(mw, fieldClass, i, false);
    mw.visitLabel(storeCollection_);
    mw.visitVarInsn(ASTORE, context.var(fieldInfo.name + "_asm"));
    boolean isPrimitive = ParserConfig.isPrimitive2(fieldInfo.fieldClass);
    _getCollectionFieldItemDeser(context, mw, fieldInfo, itemType);
    if (isPrimitive) {
        mw.visitMethodInsn(INVOKEINTERFACE, type(ObjectDeserializer.class), "getFastMatchToken", "()I");
        mw.visitVarInsn(ISTORE, context.var("fastMatchToken"));
        mw.visitVarInsn(ALOAD, context.var("lexer"));
        mw.visitVarInsn(ILOAD, context.var("fastMatchToken"));
        mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "nextToken", "(I)V");
    } else {
        mw.visitInsn(POP);
        mw.visitLdcInsn(JSONToken.LBRACE);
        mw.visitVarInsn(ISTORE, context.var("fastMatchToken"));
        _quickNextToken(context, mw, JSONToken.LBRACE);
    }
    {
        // setContext
        mw.visitVarInsn(ALOAD, 1);
        mw.visitMethodInsn(INVOKEVIRTUAL, DefaultJSONParser, "getContext", "()" + desc(ParseContext.class));
        mw.visitVarInsn(ASTORE, context.var("listContext"));
        // parser
        mw.visitVarInsn(ALOAD, 1);
        mw.visitVarInsn(ALOAD, context.var(fieldInfo.name + "_asm"));
        mw.visitLdcInsn(fieldInfo.name);
        mw.visitMethodInsn(INVOKEVIRTUAL, DefaultJSONParser, "setContext", "(Ljava/lang/Object;Ljava/lang/Object;)" + desc(ParseContext.class));
        mw.visitInsn(POP);
    }
    Label loop_ = new Label();
    Label loop_end_ = new Label();
    // for (;;) {
    mw.visitInsn(ICONST_0);
    mw.visitVarInsn(ISTORE, context.var("i"));
    mw.visitLabel(loop_);
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "token", "()I");
    mw.visitLdcInsn(JSONToken.RBRACKET);
    mw.visitJumpInsn(IF_ICMPEQ, loop_end_);
    // Object value = itemDeserializer.deserialze(parser, null);
    // array.add(value);
    mw.visitVarInsn(ALOAD, 0);
    mw.visitFieldInsn(GETFIELD, context.className, fieldInfo.name + "_asm_list_item_deser__", desc(ObjectDeserializer.class));
    mw.visitVarInsn(ALOAD, 1);
    mw.visitLdcInsn(com.alibaba.fastjson.asm.Type.getType(desc(itemType)));
    mw.visitVarInsn(ILOAD, context.var("i"));
    mw.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;");
    mw.visitMethodInsn(INVOKEINTERFACE, type(ObjectDeserializer.class), "deserialze", "(L" + DefaultJSONParser + ";Ljava/lang/reflect/Type;Ljava/lang/Object;)Ljava/lang/Object;");
    mw.visitVarInsn(ASTORE, context.var("list_item_value"));
    mw.visitIincInsn(context.var("i"), 1);
    mw.visitVarInsn(ALOAD, context.var(fieldInfo.name + "_asm"));
    mw.visitVarInsn(ALOAD, context.var("list_item_value"));
    if (fieldClass.isInterface()) {
        mw.visitMethodInsn(INVOKEINTERFACE, type(fieldClass), "add", "(Ljava/lang/Object;)Z");
    } else {
        mw.visitMethodInsn(INVOKEVIRTUAL, type(fieldClass), "add", "(Ljava/lang/Object;)Z");
    }
    mw.visitInsn(POP);
    mw.visitVarInsn(ALOAD, 1);
    mw.visitVarInsn(ALOAD, context.var(fieldInfo.name + "_asm"));
    mw.visitMethodInsn(INVOKEVIRTUAL, DefaultJSONParser, "checkListResolve", "(Ljava/util/Collection;)V");
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "token", "()I");
    mw.visitLdcInsn(JSONToken.COMMA);
    mw.visitJumpInsn(IF_ICMPNE, loop_);
    if (isPrimitive) {
        mw.visitVarInsn(ALOAD, context.var("lexer"));
        mw.visitVarInsn(ILOAD, context.var("fastMatchToken"));
        mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "nextToken", "(I)V");
    } else {
        _quickNextToken(context, mw, JSONToken.LBRACE);
    }
    mw.visitJumpInsn(GOTO, loop_);
    mw.visitLabel(loop_end_);
    // mw.visitVarInsn(ASTORE, context.var("context"));
    // parser.setContext(context);
    {
        // setContext
        // parser
        mw.visitVarInsn(ALOAD, 1);
        mw.visitVarInsn(ALOAD, context.var("listContext"));
        mw.visitMethodInsn(INVOKEVIRTUAL, DefaultJSONParser, "setContext", "(" + desc(ParseContext.class) + ")V");
    }
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "token", "()I");
    mw.visitLdcInsn(JSONToken.RBRACKET);
    mw.visitJumpInsn(IF_ICMPNE, reset_);
    _quickNextTokenComma(context, mw);
    // lexer.nextToken(JSONToken.COMMA);
    mw.visitLabel(_end_if);
}
Also used : Label(com.alibaba.fastjson.asm.Label) ParseContext(com.alibaba.fastjson.parser.ParseContext)

Example 50 with Label

use of com.alibaba.fastjson.asm.Label in project uavstack by uavorg.

the class ASMDeserializerFactory method _getFieldDeser.

private void _getFieldDeser(Context context, MethodVisitor mw, FieldInfo fieldInfo) {
    Label notNull_ = new Label();
    mw.visitVarInsn(ALOAD, 0);
    mw.visitFieldInsn(GETFIELD, context.className, fieldInfo.name + "_asm_deser__", desc(ObjectDeserializer.class));
    mw.visitJumpInsn(IFNONNULL, notNull_);
    mw.visitVarInsn(ALOAD, 0);
    mw.visitVarInsn(ALOAD, 1);
    mw.visitMethodInsn(INVOKEVIRTUAL, DefaultJSONParser, "getConfig", "()" + desc(ParserConfig.class));
    mw.visitLdcInsn(com.alibaba.fastjson.asm.Type.getType(desc(fieldInfo.fieldClass)));
    mw.visitMethodInsn(INVOKEVIRTUAL, type(ParserConfig.class), "getDeserializer", "(Ljava/lang/reflect/Type;)" + desc(ObjectDeserializer.class));
    mw.visitFieldInsn(PUTFIELD, context.className, fieldInfo.name + "_asm_deser__", desc(ObjectDeserializer.class));
    mw.visitLabel(notNull_);
    mw.visitVarInsn(ALOAD, 0);
    mw.visitFieldInsn(GETFIELD, context.className, fieldInfo.name + "_asm_deser__", desc(ObjectDeserializer.class));
}
Also used : Label(com.alibaba.fastjson.asm.Label) ParserConfig(com.alibaba.fastjson.parser.ParserConfig)

Aggregations

Label (com.alibaba.fastjson.asm.Label)53 ParseContext (com.alibaba.fastjson.parser.ParseContext)8 MethodVisitor (com.alibaba.fastjson.asm.MethodVisitor)5 ParserConfig (com.alibaba.fastjson.parser.ParserConfig)5 FieldInfo (com.alibaba.fastjson.util.FieldInfo)5 MethodWriter (com.alibaba.fastjson.asm.MethodWriter)4 ParameterizedType (java.lang.reflect.ParameterizedType)4 Type (java.lang.reflect.Type)4 BigInteger (java.math.BigInteger)4 List (java.util.List)4 BigDecimal (java.math.BigDecimal)3 ResolveTask (com.alibaba.fastjson.parser.DefaultJSONParser.ResolveTask)2 JSONLexer (com.alibaba.fastjson.parser.JSONLexer)2 SymbolTable (com.alibaba.fastjson.parser.SymbolTable)2 com.alibaba.fastjson.util (com.alibaba.fastjson.util)2 Method (java.lang.reflect.Method)2 ArrayList (java.util.ArrayList)2 Collection (java.util.Collection)2 Collections (java.util.Collections)2 LinkedList (java.util.LinkedList)2