Search in sources :

Example 41 with Label

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

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, context.fieldDeserName(fieldInfo), 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, context.fieldDeserName(fieldInfo), desc(ObjectDeserializer.class));
    mw.visitLabel(notNull_);
    mw.visitVarInsn(ALOAD, 0);
    mw.visitFieldInsn(GETFIELD, context.className, context.fieldDeserName(fieldInfo), desc(ObjectDeserializer.class));
}
Also used : Label(com.alibaba.fastjson.asm.Label) ParserConfig(com.alibaba.fastjson.parser.ParserConfig)

Example 42 with Label

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

the class ASMDeserializerFactory method _deserialze.

private void _deserialze(ClassWriter cw, Context context) {
    if (context.fieldInfoList.length == 0) {
        return;
    }
    for (FieldInfo fieldInfo : context.fieldInfoList) {
        Class<?> fieldClass = fieldInfo.fieldClass;
        Type fieldType = fieldInfo.fieldType;
        if (fieldClass == char.class) {
            return;
        }
        if (Collection.class.isAssignableFrom(fieldClass)) {
            if (fieldType instanceof ParameterizedType) {
                Type itemType = ((ParameterizedType) fieldType).getActualTypeArguments()[0];
                if (itemType instanceof Class) {
                    continue;
                } else {
                    return;
                }
            } else {
                return;
            }
        }
    }
    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;I)Ljava/lang/Object;", null, null);
    Label reset_ = new Label();
    Label super_ = new Label();
    Label return_ = new Label();
    Label end_ = new Label();
    defineVarLexer(context, mw);
    {
        Label next_ = new Label();
        // 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.visitVarInsn(ILOAD, 4);
            mw.visitLdcInsn(Feature.SupportArrayToBean.mask);
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "isEnabled", "(II)Z");
            mw.visitJumpInsn(IFEQ, next_);
        }
        mw.visitVarInsn(ALOAD, 0);
        mw.visitVarInsn(ALOAD, Context.parser);
        mw.visitVarInsn(ALOAD, 2);
        mw.visitVarInsn(ALOAD, 3);
        // mw.visitVarInsn(ALOAD, 5);
        mw.visitInsn(ACONST_NULL);
        // 
        mw.visitMethodInsn(// 
        INVOKESPECIAL, // 
        context.className, // 
        "deserialzeArrayMapping", "(L" + DefaultJSONParser + ";Ljava/lang/reflect/Type;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
        mw.visitInsn(ARETURN);
        mw.visitLabel(next_);
    // deserialzeArrayMapping
    }
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitLdcInsn(Feature.SortFeidFastMatch.mask);
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "isEnabled", "(I)Z");
    Label continue_ = new Label();
    mw.visitJumpInsn(IFNE, continue_);
    mw.visitJumpInsn(GOTO_W, super_);
    mw.visitLabel(continue_);
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitLdcInsn(context.clazz.getName());
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanType", "(Ljava/lang/String;)I");
    mw.visitLdcInsn(com.alibaba.fastjson.parser.JSONLexerBase.NOT_MATCH);
    Label continue_2 = new Label();
    mw.visitJumpInsn(IF_ICMPNE, continue_2);
    mw.visitJumpInsn(GOTO_W, super_);
    mw.visitLabel(continue_2);
    // parser
    mw.visitVarInsn(ALOAD, 1);
    mw.visitMethodInsn(INVOKEVIRTUAL, DefaultJSONParser, "getContext", "()" + desc(ParseContext.class));
    mw.visitVarInsn(ASTORE, context.var("mark_context"));
    // ParseContext context = parser.getContext();
    mw.visitInsn(ICONST_0);
    mw.visitVarInsn(ISTORE, context.var("matchedCount"));
    _createInstance(context, mw);
    {
        // parser
        mw.visitVarInsn(ALOAD, 1);
        mw.visitMethodInsn(INVOKEVIRTUAL, DefaultJSONParser, "getContext", "()" + desc(ParseContext.class));
        mw.visitVarInsn(ASTORE, context.var("context"));
        // parser
        mw.visitVarInsn(ALOAD, 1);
        mw.visitVarInsn(ALOAD, context.var("context"));
        mw.visitVarInsn(ALOAD, context.var("instance"));
        // fieldName
        mw.visitVarInsn(ALOAD, 3);
        // 
        mw.visitMethodInsn(// 
        INVOKEVIRTUAL, // 
        DefaultJSONParser, // 
        "setContext", "(" + desc(ParseContext.class) + "Ljava/lang/Object;Ljava/lang/Object;)" + desc(ParseContext.class));
        mw.visitVarInsn(ASTORE, context.var("childContext"));
    }
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitFieldInsn(GETFIELD, JSONLexerBase, "matchStat", "I");
    mw.visitLdcInsn(com.alibaba.fastjson.parser.JSONLexerBase.END);
    // mw.visitJumpInsn(IF_ICMPEQ, return_);
    Label continue_3 = new Label();
    mw.visitJumpInsn(IF_ICMPNE, continue_3);
    mw.visitJumpInsn(GOTO_W, return_);
    mw.visitLabel(continue_3);
    // UNKOWN
    mw.visitInsn(ICONST_0);
    mw.visitIntInsn(ISTORE, context.var("matchStat"));
    int fieldListSize = context.fieldInfoList.length;
    for (int i = 0; i < fieldListSize; i += 32) {
        mw.visitInsn(ICONST_0);
        mw.visitVarInsn(ISTORE, context.var("_asm_flag_" + (i / 32)));
    }
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitLdcInsn(Feature.InitStringFieldAsEmpty.mask);
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "isEnabled", "(I)Z");
    mw.visitIntInsn(ISTORE, context.var("initStringFieldAsEmpty"));
    // declare and init
    for (int i = 0; i < fieldListSize; ++i) {
        FieldInfo fieldInfo = context.fieldInfoList[i];
        Class<?> fieldClass = fieldInfo.fieldClass;
        if (// 
        fieldClass == boolean.class || // 
        fieldClass == byte.class || // 
        fieldClass == short.class || fieldClass == int.class) {
            mw.visitInsn(ICONST_0);
            mw.visitVarInsn(ISTORE, context.var_asm(fieldInfo));
        } else if (fieldClass == long.class) {
            mw.visitInsn(LCONST_0);
            mw.visitVarInsn(LSTORE, context.var_asm(fieldInfo, 2));
        } else if (fieldClass == float.class) {
            mw.visitInsn(FCONST_0);
            mw.visitVarInsn(FSTORE, context.var_asm(fieldInfo));
        } else if (fieldClass == double.class) {
            mw.visitInsn(DCONST_0);
            mw.visitVarInsn(DSTORE, context.var_asm(fieldInfo, 2));
        } else {
            if (fieldClass == String.class) {
                Label flagEnd_ = new Label();
                Label flagElse_ = new Label();
                mw.visitVarInsn(ILOAD, context.var("initStringFieldAsEmpty"));
                mw.visitJumpInsn(IFEQ, flagElse_);
                _setFlag(mw, context, i);
                mw.visitVarInsn(ALOAD, context.var("lexer"));
                mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "stringDefaultValue", "()Ljava/lang/String;");
                mw.visitJumpInsn(GOTO, flagEnd_);
                mw.visitLabel(flagElse_);
                mw.visitInsn(ACONST_NULL);
                mw.visitLabel(flagEnd_);
            } else {
                mw.visitInsn(ACONST_NULL);
            }
            // cast
            mw.visitTypeInsn(CHECKCAST, type(fieldClass));
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
        }
    }
    for (int i = 0; i < fieldListSize; ++i) {
        FieldInfo fieldInfo = context.fieldInfoList[i];
        Class<?> fieldClass = fieldInfo.fieldClass;
        Type fieldType = fieldInfo.fieldType;
        Label notMatch_ = new Label();
        if (fieldClass == boolean.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(ALOAD, 0);
            mw.visitFieldInsn(GETFIELD, context.className, context.fieldName(fieldInfo), "[C");
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanFieldBoolean", "([C)Z");
            mw.visitVarInsn(ISTORE, context.var_asm(fieldInfo));
        } else if (fieldClass == byte.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(ALOAD, 0);
            mw.visitFieldInsn(GETFIELD, context.className, context.fieldName(fieldInfo), "[C");
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanFieldInt", "([C)I");
            mw.visitVarInsn(ISTORE, context.var_asm(fieldInfo));
        } else if (fieldClass == Byte.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(ALOAD, 0);
            mw.visitFieldInsn(GETFIELD, context.className, context.fieldName(fieldInfo), "[C");
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanFieldInt", "([C)I");
            mw.visitMethodInsn(INVOKESTATIC, "java/lang/Byte", "valueOf", "(B)Ljava/lang/Byte;");
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
            Label valueNullEnd_ = new Label();
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitFieldInsn(GETFIELD, JSONLexerBase, "matchStat", "I");
            mw.visitLdcInsn(com.alibaba.fastjson.parser.JSONLexerBase.VALUE_NULL);
            mw.visitJumpInsn(IF_ICMPNE, valueNullEnd_);
            mw.visitInsn(ACONST_NULL);
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
            mw.visitLabel(valueNullEnd_);
        } else if (fieldClass == short.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(ALOAD, 0);
            mw.visitFieldInsn(GETFIELD, context.className, context.fieldName(fieldInfo), "[C");
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanFieldInt", "([C)I");
            mw.visitVarInsn(ISTORE, context.var_asm(fieldInfo));
        } else if (fieldClass == Short.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(ALOAD, 0);
            mw.visitFieldInsn(GETFIELD, context.className, context.fieldName(fieldInfo), "[C");
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanFieldInt", "([C)I");
            mw.visitMethodInsn(INVOKESTATIC, "java/lang/Short", "valueOf", "(S)Ljava/lang/Short;");
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
            Label valueNullEnd_ = new Label();
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitFieldInsn(GETFIELD, JSONLexerBase, "matchStat", "I");
            mw.visitLdcInsn(com.alibaba.fastjson.parser.JSONLexerBase.VALUE_NULL);
            mw.visitJumpInsn(IF_ICMPNE, valueNullEnd_);
            mw.visitInsn(ACONST_NULL);
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
            mw.visitLabel(valueNullEnd_);
        } else if (fieldClass == int.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(ALOAD, 0);
            mw.visitFieldInsn(GETFIELD, context.className, context.fieldName(fieldInfo), "[C");
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanFieldInt", "([C)I");
            mw.visitVarInsn(ISTORE, context.var_asm(fieldInfo));
        } else if (fieldClass == Integer.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(ALOAD, 0);
            mw.visitFieldInsn(GETFIELD, context.className, context.fieldName(fieldInfo), "[C");
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanFieldInt", "([C)I");
            mw.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;");
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
            Label valueNullEnd_ = new Label();
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitFieldInsn(GETFIELD, JSONLexerBase, "matchStat", "I");
            mw.visitLdcInsn(com.alibaba.fastjson.parser.JSONLexerBase.VALUE_NULL);
            mw.visitJumpInsn(IF_ICMPNE, valueNullEnd_);
            mw.visitInsn(ACONST_NULL);
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
            mw.visitLabel(valueNullEnd_);
        } else if (fieldClass == long.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(ALOAD, 0);
            mw.visitFieldInsn(GETFIELD, context.className, context.fieldName(fieldInfo), "[C");
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanFieldLong", "([C)J");
            mw.visitVarInsn(LSTORE, context.var_asm(fieldInfo, 2));
        } else if (fieldClass == Long.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(ALOAD, 0);
            mw.visitFieldInsn(GETFIELD, context.className, context.fieldName(fieldInfo), "[C");
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanFieldLong", "([C)J");
            mw.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;");
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
            Label valueNullEnd_ = new Label();
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitFieldInsn(GETFIELD, JSONLexerBase, "matchStat", "I");
            mw.visitLdcInsn(com.alibaba.fastjson.parser.JSONLexerBase.VALUE_NULL);
            mw.visitJumpInsn(IF_ICMPNE, valueNullEnd_);
            mw.visitInsn(ACONST_NULL);
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
            mw.visitLabel(valueNullEnd_);
        } else if (fieldClass == float.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(ALOAD, 0);
            mw.visitFieldInsn(GETFIELD, context.className, context.fieldName(fieldInfo), "[C");
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanFieldFloat", "([C)F");
            mw.visitVarInsn(FSTORE, context.var_asm(fieldInfo));
        } else if (fieldClass == Float.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(ALOAD, 0);
            mw.visitFieldInsn(GETFIELD, context.className, context.fieldName(fieldInfo), "[C");
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanFieldFloat", "([C)F");
            mw.visitMethodInsn(INVOKESTATIC, "java/lang/Float", "valueOf", "(F)Ljava/lang/Float;");
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
            Label valueNullEnd_ = new Label();
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitFieldInsn(GETFIELD, JSONLexerBase, "matchStat", "I");
            mw.visitLdcInsn(com.alibaba.fastjson.parser.JSONLexerBase.VALUE_NULL);
            mw.visitJumpInsn(IF_ICMPNE, valueNullEnd_);
            mw.visitInsn(ACONST_NULL);
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
            mw.visitLabel(valueNullEnd_);
        } else if (fieldClass == double.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(ALOAD, 0);
            mw.visitFieldInsn(GETFIELD, context.className, context.fieldName(fieldInfo), "[C");
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanFieldDouble", "([C)D");
            mw.visitVarInsn(DSTORE, context.var_asm(fieldInfo, 2));
        } else if (fieldClass == Double.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(ALOAD, 0);
            mw.visitFieldInsn(GETFIELD, context.className, context.fieldName(fieldInfo), "[C");
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanFieldDouble", "([C)D");
            mw.visitMethodInsn(INVOKESTATIC, "java/lang/Double", "valueOf", "(D)Ljava/lang/Double;");
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
            Label valueNullEnd_ = new Label();
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitFieldInsn(GETFIELD, JSONLexerBase, "matchStat", "I");
            mw.visitLdcInsn(com.alibaba.fastjson.parser.JSONLexerBase.VALUE_NULL);
            mw.visitJumpInsn(IF_ICMPNE, valueNullEnd_);
            mw.visitInsn(ACONST_NULL);
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
            mw.visitLabel(valueNullEnd_);
        } else if (fieldClass == String.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(ALOAD, 0);
            mw.visitFieldInsn(GETFIELD, context.className, context.fieldName(fieldInfo), "[C");
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanFieldString", "([C)Ljava/lang/String;");
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
        } else if (fieldClass == java.util.Date.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(ALOAD, 0);
            mw.visitFieldInsn(GETFIELD, context.className, context.fieldName(fieldInfo), "[C");
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanFieldDate", "([C)Ljava/util/Date;");
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
        } else if (fieldClass == java.util.UUID.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(ALOAD, 0);
            mw.visitFieldInsn(GETFIELD, context.className, context.fieldName(fieldInfo), "[C");
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanFieldUUID", "([C)Ljava/util/UUID;");
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
        } else if (fieldClass == BigDecimal.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(ALOAD, 0);
            mw.visitFieldInsn(GETFIELD, context.className, context.fieldName(fieldInfo), "[C");
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanFieldDecimal", "([C)Ljava/math/BigDecimal;");
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
        } else if (fieldClass == BigInteger.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(ALOAD, 0);
            mw.visitFieldInsn(GETFIELD, context.className, context.fieldName(fieldInfo), "[C");
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanFieldBigInteger", "([C)Ljava/math/BigInteger;");
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
        } else if (fieldClass == int[].class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(ALOAD, 0);
            mw.visitFieldInsn(GETFIELD, context.className, context.fieldName(fieldInfo), "[C");
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanFieldIntArray", "([C)[I");
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
        } else if (fieldClass == float[].class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(ALOAD, 0);
            mw.visitFieldInsn(GETFIELD, context.className, context.fieldName(fieldInfo), "[C");
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanFieldFloatArray", "([C)[F");
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
        } else if (fieldClass == float[][].class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(ALOAD, 0);
            mw.visitFieldInsn(GETFIELD, context.className, context.fieldName(fieldInfo), "[C");
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanFieldFloatArray2", "([C)[[F");
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
        } else if (fieldClass.isEnum()) {
            mw.visitVarInsn(ALOAD, 0);
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(ALOAD, 0);
            mw.visitFieldInsn(GETFIELD, context.className, context.fieldName(fieldInfo), "[C");
            _getFieldDeser(context, mw, fieldInfo);
            mw.visitMethodInsn(INVOKEVIRTUAL, type(JavaBeanDeserializer.class), "scanEnum", "(L" + JSONLexerBase + ";[C" + desc(ObjectDeserializer.class) + ")Ljava/lang/Enum;");
            // cast
            mw.visitTypeInsn(CHECKCAST, type(fieldClass));
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
        // } else if (fieldClass.isEnum()) {
        // mw.visitVarInsn(ALOAD, context.var("lexer"));
        // mw.visitVarInsn(ALOAD, 0);
        // mw.visitFieldInsn(GETFIELD, context.className, context.fieldName(fieldInfo), "[C");
        // Label enumNull_ = new Label();
        // mw.visitInsn(ACONST_NULL);
        // mw.visitTypeInsn(CHECKCAST, type(fieldClass)); // cast
        // mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
        // 
        // mw.visitVarInsn(ALOAD, 1);
        // 
        // mw.visitMethodInsn(INVOKEVIRTUAL, DefaultJSONParser, "getSymbolTable", "()" + desc(SymbolTable.class));
        // 
        // mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanFieldSymbol",
        // "([C" + desc(SymbolTable.class) + ")Ljava/lang/String;");
        // mw.visitInsn(DUP);
        // mw.visitVarInsn(ASTORE, context.var(fieldInfo.name + "_asm_enumName"));
        // 
        // mw.visitJumpInsn(IFNULL, enumNull_);
        // 
        // mw.visitVarInsn(ALOAD, context.var(fieldInfo.name + "_asm_enumName"));
        // mw.visitMethodInsn(INVOKEVIRTUAL, type(String.class), "length", "()I");
        // mw.visitJumpInsn(IFEQ, enumNull_);
        // 
        // mw.visitVarInsn(ALOAD, context.var(fieldInfo.name + "_asm_enumName"));
        // mw.visitMethodInsn(INVOKESTATIC, type(fieldClass), "valueOf",
        // "(Ljava/lang/String;)" + desc(fieldClass));
        // mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
        // mw.visitLabel(enumNull_);
        } else if (Collection.class.isAssignableFrom(fieldClass)) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(ALOAD, 0);
            mw.visitFieldInsn(GETFIELD, context.className, context.fieldName(fieldInfo), "[C");
            Class<?> itemClass = TypeUtils.getCollectionItemClass(fieldType);
            if (itemClass == String.class) {
                // cast
                mw.visitLdcInsn(com.alibaba.fastjson.asm.Type.getType(desc(fieldClass)));
                mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanFieldStringArray", "([CLjava/lang/Class;)" + desc(Collection.class));
                mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
            } else {
                _deserialze_list_obj(context, mw, reset_, fieldInfo, fieldClass, itemClass, i);
                if (i == fieldListSize - 1) {
                    _deserialize_endCheck(context, mw, reset_);
                }
                continue;
            }
        } else {
            _deserialze_obj(context, mw, reset_, fieldInfo, fieldClass, i);
            if (i == fieldListSize - 1) {
                _deserialize_endCheck(context, mw, reset_);
            }
            continue;
        }
        mw.visitVarInsn(ALOAD, context.var("lexer"));
        mw.visitFieldInsn(GETFIELD, JSONLexerBase, "matchStat", "I");
        Label flag_ = new Label();
        // mw.visitInsn(DUP);
        mw.visitJumpInsn(IFLE, flag_);
        _setFlag(mw, context, i);
        mw.visitLabel(flag_);
        mw.visitVarInsn(ALOAD, context.var("lexer"));
        mw.visitFieldInsn(GETFIELD, JSONLexerBase, "matchStat", "I");
        mw.visitInsn(DUP);
        mw.visitVarInsn(ISTORE, context.var("matchStat"));
        mw.visitLdcInsn(com.alibaba.fastjson.parser.JSONLexerBase.NOT_MATCH);
        mw.visitJumpInsn(IF_ICMPEQ, reset_);
        mw.visitVarInsn(ALOAD, context.var("lexer"));
        mw.visitFieldInsn(GETFIELD, JSONLexerBase, "matchStat", "I");
        mw.visitJumpInsn(IFLE, notMatch_);
        // increment matchedCount
        mw.visitVarInsn(ILOAD, context.var("matchedCount"));
        mw.visitInsn(ICONST_1);
        mw.visitInsn(IADD);
        mw.visitVarInsn(ISTORE, context.var("matchedCount"));
        mw.visitVarInsn(ALOAD, context.var("lexer"));
        mw.visitFieldInsn(GETFIELD, JSONLexerBase, "matchStat", "I");
        mw.visitLdcInsn(com.alibaba.fastjson.parser.JSONLexerBase.END);
        mw.visitJumpInsn(IF_ICMPEQ, end_);
        mw.visitLabel(notMatch_);
        if (i == fieldListSize - 1) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitFieldInsn(GETFIELD, JSONLexerBase, "matchStat", "I");
            mw.visitLdcInsn(com.alibaba.fastjson.parser.JSONLexerBase.END);
            mw.visitJumpInsn(IF_ICMPNE, reset_);
        }
    }
    // endFor
    mw.visitLabel(end_);
    if (!context.clazz.isInterface() && !Modifier.isAbstract(context.clazz.getModifiers())) {
        _batchSet(context, mw);
    }
    mw.visitLabel(return_);
    _setContext(context, mw);
    mw.visitVarInsn(ALOAD, context.var("instance"));
    Method buildMethod = context.beanInfo.buildMethod;
    if (buildMethod != null) {
        mw.visitMethodInsn(INVOKEVIRTUAL, type(context.getInstClass()), buildMethod.getName(), "()" + desc(buildMethod.getReturnType()));
    }
    mw.visitInsn(ARETURN);
    mw.visitLabel(reset_);
    _batchSet(context, mw);
    mw.visitVarInsn(ALOAD, 0);
    mw.visitVarInsn(ALOAD, 1);
    mw.visitVarInsn(ALOAD, 2);
    mw.visitVarInsn(ALOAD, 3);
    mw.visitVarInsn(ALOAD, context.var("instance"));
    mw.visitVarInsn(ILOAD, 4);
    int flagSize = (fieldListSize / 32);
    if (fieldListSize != 0 && (fieldListSize % 32) != 0) {
        flagSize += 1;
    }
    if (flagSize == 1) {
        mw.visitInsn(ICONST_1);
    } else {
        mw.visitIntInsn(BIPUSH, flagSize);
    }
    mw.visitIntInsn(NEWARRAY, T_INT);
    for (int i = 0; i < flagSize; ++i) {
        mw.visitInsn(DUP);
        if (i == 0) {
            mw.visitInsn(ICONST_0);
        } else if (i == 1) {
            mw.visitInsn(ICONST_1);
        } else {
            mw.visitIntInsn(BIPUSH, i);
        }
        mw.visitVarInsn(ILOAD, context.var("_asm_flag_" + i));
        mw.visitInsn(IASTORE);
    }
    mw.visitMethodInsn(INVOKEVIRTUAL, type(JavaBeanDeserializer.class), "parseRest", "(L" + DefaultJSONParser + ";Ljava/lang/reflect/Type;Ljava/lang/Object;Ljava/lang/Object;I[I)Ljava/lang/Object;");
    // cast
    mw.visitTypeInsn(CHECKCAST, type(context.clazz));
    mw.visitInsn(ARETURN);
    mw.visitLabel(super_);
    mw.visitVarInsn(ALOAD, 0);
    mw.visitVarInsn(ALOAD, 1);
    mw.visitVarInsn(ALOAD, 2);
    mw.visitVarInsn(ALOAD, 3);
    mw.visitVarInsn(ILOAD, 4);
    // 
    mw.visitMethodInsn(// 
    INVOKESPECIAL, // 
    type(JavaBeanDeserializer.class), // 
    "deserialze", "(L" + DefaultJSONParser + ";Ljava/lang/reflect/Type;Ljava/lang/Object;I)Ljava/lang/Object;");
    mw.visitInsn(ARETURN);
    mw.visitMaxs(10, context.variantIndex);
    mw.visitEnd();
}
Also used : MethodWriter(com.alibaba.fastjson.asm.MethodWriter) Label(com.alibaba.fastjson.asm.Label) Method(java.lang.reflect.Method) MethodVisitor(com.alibaba.fastjson.asm.MethodVisitor) ParameterizedType(java.lang.reflect.ParameterizedType) ParameterizedType(java.lang.reflect.ParameterizedType) Type(java.lang.reflect.Type) com.alibaba.fastjson.util(com.alibaba.fastjson.util) ParseContext(com.alibaba.fastjson.parser.ParseContext) BigInteger(java.math.BigInteger)

Example 43 with Label

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

the class ASMDeserializerFactory method _deserialzeArrayMapping.

private void _deserialzeArrayMapping(ClassWriter cw, Context context) {
    MethodVisitor mw = new MethodWriter(cw, ACC_PUBLIC, "deserialzeArrayMapping", "(L" + DefaultJSONParser + ";Ljava/lang/reflect/Type;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", null, null);
    defineVarLexer(context, mw);
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitVarInsn(ALOAD, 1);
    mw.visitMethodInsn(INVOKEVIRTUAL, DefaultJSONParser, "getSymbolTable", "()" + desc(SymbolTable.class));
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanTypeName", "(" + desc(SymbolTable.class) + ")Ljava/lang/String;");
    mw.visitVarInsn(ASTORE, context.var("typeName"));
    Label typeNameNotNull_ = new Label();
    mw.visitVarInsn(ALOAD, context.var("typeName"));
    mw.visitJumpInsn(IFNULL, typeNameNotNull_);
    mw.visitVarInsn(ALOAD, 1);
    mw.visitMethodInsn(INVOKEVIRTUAL, DefaultJSONParser, "getConfig", "()" + desc(ParserConfig.class));
    mw.visitVarInsn(ALOAD, 0);
    mw.visitFieldInsn(GETFIELD, type(JavaBeanDeserializer.class), "beanInfo", desc(JavaBeanInfo.class));
    mw.visitVarInsn(ALOAD, context.var("typeName"));
    mw.visitMethodInsn(INVOKESTATIC, type(JavaBeanDeserializer.class), "getSeeAlso", "(" + desc(ParserConfig.class) + desc(JavaBeanInfo.class) + "Ljava/lang/String;)" + desc(JavaBeanDeserializer.class));
    mw.visitVarInsn(ASTORE, context.var("userTypeDeser"));
    mw.visitVarInsn(ALOAD, context.var("userTypeDeser"));
    mw.visitTypeInsn(INSTANCEOF, type(JavaBeanDeserializer.class));
    mw.visitJumpInsn(IFEQ, typeNameNotNull_);
    mw.visitVarInsn(ALOAD, context.var("userTypeDeser"));
    mw.visitVarInsn(ALOAD, Context.parser);
    mw.visitVarInsn(ALOAD, 2);
    mw.visitVarInsn(ALOAD, 3);
    mw.visitVarInsn(ALOAD, 4);
    // 
    mw.visitMethodInsn(// 
    INVOKEVIRTUAL, // 
    type(JavaBeanDeserializer.class), // 
    "deserialzeArrayMapping", "(L" + DefaultJSONParser + ";Ljava/lang/reflect/Type;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
    mw.visitInsn(ARETURN);
    mw.visitLabel(typeNameNotNull_);
    _createInstance(context, mw);
    FieldInfo[] sortedFieldInfoList = context.beanInfo.sortedFields;
    int fieldListSize = sortedFieldInfoList.length;
    for (int i = 0; i < fieldListSize; ++i) {
        final boolean last = (i == fieldListSize - 1);
        final char seperator = last ? ']' : ',';
        FieldInfo fieldInfo = sortedFieldInfoList[i];
        Class<?> fieldClass = fieldInfo.fieldClass;
        Type fieldType = fieldInfo.fieldType;
        if (// 
        fieldClass == byte.class || // 
        fieldClass == short.class || fieldClass == int.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(BIPUSH, seperator);
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanInt", "(C)I");
            mw.visitVarInsn(ISTORE, context.var_asm(fieldInfo));
        } else if (fieldClass == Byte.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(BIPUSH, seperator);
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanInt", "(C)I");
            mw.visitMethodInsn(INVOKESTATIC, "java/lang/Byte", "valueOf", "(B)Ljava/lang/Byte;");
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
            Label valueNullEnd_ = new Label();
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitFieldInsn(GETFIELD, JSONLexerBase, "matchStat", "I");
            mw.visitLdcInsn(com.alibaba.fastjson.parser.JSONLexerBase.VALUE_NULL);
            mw.visitJumpInsn(IF_ICMPNE, valueNullEnd_);
            mw.visitInsn(ACONST_NULL);
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
            mw.visitLabel(valueNullEnd_);
        } else if (fieldClass == Short.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(BIPUSH, seperator);
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanInt", "(C)I");
            mw.visitMethodInsn(INVOKESTATIC, "java/lang/Short", "valueOf", "(S)Ljava/lang/Short;");
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
            Label valueNullEnd_ = new Label();
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitFieldInsn(GETFIELD, JSONLexerBase, "matchStat", "I");
            mw.visitLdcInsn(com.alibaba.fastjson.parser.JSONLexerBase.VALUE_NULL);
            mw.visitJumpInsn(IF_ICMPNE, valueNullEnd_);
            mw.visitInsn(ACONST_NULL);
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
            mw.visitLabel(valueNullEnd_);
        } else if (fieldClass == Integer.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(BIPUSH, seperator);
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanInt", "(C)I");
            mw.visitMethodInsn(INVOKESTATIC, "java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;");
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
            Label valueNullEnd_ = new Label();
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitFieldInsn(GETFIELD, JSONLexerBase, "matchStat", "I");
            mw.visitLdcInsn(com.alibaba.fastjson.parser.JSONLexerBase.VALUE_NULL);
            mw.visitJumpInsn(IF_ICMPNE, valueNullEnd_);
            mw.visitInsn(ACONST_NULL);
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
            mw.visitLabel(valueNullEnd_);
        } else if (fieldClass == long.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(BIPUSH, seperator);
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanLong", "(C)J");
            mw.visitVarInsn(LSTORE, context.var_asm(fieldInfo, 2));
        } else if (fieldClass == Long.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(BIPUSH, seperator);
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanLong", "(C)J");
            mw.visitMethodInsn(INVOKESTATIC, "java/lang/Long", "valueOf", "(J)Ljava/lang/Long;");
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
            Label valueNullEnd_ = new Label();
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitFieldInsn(GETFIELD, JSONLexerBase, "matchStat", "I");
            mw.visitLdcInsn(com.alibaba.fastjson.parser.JSONLexerBase.VALUE_NULL);
            mw.visitJumpInsn(IF_ICMPNE, valueNullEnd_);
            mw.visitInsn(ACONST_NULL);
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
            mw.visitLabel(valueNullEnd_);
        } else if (fieldClass == boolean.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(BIPUSH, seperator);
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanBoolean", "(C)Z");
            mw.visitVarInsn(ISTORE, context.var_asm(fieldInfo));
        } else if (fieldClass == float.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(BIPUSH, seperator);
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanFloat", "(C)F");
            mw.visitVarInsn(FSTORE, context.var_asm(fieldInfo));
        } else if (fieldClass == Float.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(BIPUSH, seperator);
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanFloat", "(C)F");
            mw.visitMethodInsn(INVOKESTATIC, "java/lang/Float", "valueOf", "(F)Ljava/lang/Float;");
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
            Label valueNullEnd_ = new Label();
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitFieldInsn(GETFIELD, JSONLexerBase, "matchStat", "I");
            mw.visitLdcInsn(com.alibaba.fastjson.parser.JSONLexerBase.VALUE_NULL);
            mw.visitJumpInsn(IF_ICMPNE, valueNullEnd_);
            mw.visitInsn(ACONST_NULL);
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
            mw.visitLabel(valueNullEnd_);
        } else if (fieldClass == double.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(BIPUSH, seperator);
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanDouble", "(C)D");
            mw.visitVarInsn(DSTORE, context.var_asm(fieldInfo, 2));
        } else if (fieldClass == Double.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(BIPUSH, seperator);
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanDouble", "(C)D");
            mw.visitMethodInsn(INVOKESTATIC, "java/lang/Double", "valueOf", "(D)Ljava/lang/Double;");
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
            Label valueNullEnd_ = new Label();
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitFieldInsn(GETFIELD, JSONLexerBase, "matchStat", "I");
            mw.visitLdcInsn(com.alibaba.fastjson.parser.JSONLexerBase.VALUE_NULL);
            mw.visitJumpInsn(IF_ICMPNE, valueNullEnd_);
            mw.visitInsn(ACONST_NULL);
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
            mw.visitLabel(valueNullEnd_);
        } else if (fieldClass == char.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(BIPUSH, seperator);
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanString", "(C)Ljava/lang/String;");
            mw.visitInsn(ICONST_0);
            mw.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "charAt", "(I)C");
            mw.visitVarInsn(ISTORE, context.var_asm(fieldInfo));
        } else if (fieldClass == String.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(BIPUSH, seperator);
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanString", "(C)Ljava/lang/String;");
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
        } else if (fieldClass == BigDecimal.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(BIPUSH, seperator);
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanDecimal", "(C)Ljava/math/BigDecimal;");
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
        } else if (fieldClass == java.util.Date.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(BIPUSH, seperator);
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanDate", "(C)Ljava/util/Date;");
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
        } else if (fieldClass == java.util.UUID.class) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(BIPUSH, seperator);
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanUUID", "(C)Ljava/util/UUID;");
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
        } else if (fieldClass.isEnum()) {
            Label enumNumIf_ = new Label();
            Label enumNumErr_ = new Label();
            Label enumStore_ = new Label();
            Label enumQuote_ = new Label();
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "getCurrent", "()C");
            mw.visitInsn(DUP);
            mw.visitVarInsn(ISTORE, context.var("ch"));
            mw.visitLdcInsn((int) 'n');
            mw.visitJumpInsn(IF_ICMPEQ, enumQuote_);
            mw.visitVarInsn(ILOAD, context.var("ch"));
            mw.visitLdcInsn((int) '\"');
            mw.visitJumpInsn(IF_ICMPNE, enumNumIf_);
            mw.visitLabel(enumQuote_);
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitLdcInsn(com.alibaba.fastjson.asm.Type.getType(desc(fieldClass)));
            mw.visitVarInsn(ALOAD, 1);
            mw.visitMethodInsn(INVOKEVIRTUAL, DefaultJSONParser, "getSymbolTable", "()" + desc(SymbolTable.class));
            mw.visitVarInsn(BIPUSH, seperator);
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanEnum", "(Ljava/lang/Class;" + desc(SymbolTable.class) + "C)Ljava/lang/Enum;");
            mw.visitJumpInsn(GOTO, enumStore_);
            // (ch >= '0' && ch <= '9') {
            mw.visitLabel(enumNumIf_);
            mw.visitVarInsn(ILOAD, context.var("ch"));
            mw.visitLdcInsn((int) '0');
            mw.visitJumpInsn(IF_ICMPLT, enumNumErr_);
            mw.visitVarInsn(ILOAD, context.var("ch"));
            mw.visitLdcInsn((int) '9');
            mw.visitJumpInsn(IF_ICMPGT, enumNumErr_);
            _getFieldDeser(context, mw, fieldInfo);
            // cast
            mw.visitTypeInsn(CHECKCAST, type(EnumDeserializer.class));
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(BIPUSH, seperator);
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanInt", "(C)I");
            mw.visitMethodInsn(INVOKEVIRTUAL, type(EnumDeserializer.class), "valueOf", "(I)Ljava/lang/Enum;");
            mw.visitJumpInsn(GOTO, enumStore_);
            mw.visitLabel(enumNumErr_);
            mw.visitVarInsn(ALOAD, 0);
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitVarInsn(BIPUSH, seperator);
            mw.visitMethodInsn(INVOKEVIRTUAL, type(JavaBeanDeserializer.class), "scanEnum", "(L" + JSONLexerBase + ";C)Ljava/lang/Enum;");
            mw.visitLabel(enumStore_);
            // cast
            mw.visitTypeInsn(CHECKCAST, type(fieldClass));
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
        } else if (Collection.class.isAssignableFrom(fieldClass)) {
            Class<?> itemClass = TypeUtils.getCollectionItemClass(fieldType);
            if (itemClass == String.class) {
                if (fieldClass == List.class || fieldClass == Collections.class || fieldClass == ArrayList.class) {
                    mw.visitTypeInsn(NEW, type(ArrayList.class));
                    mw.visitInsn(DUP);
                    mw.visitMethodInsn(INVOKESPECIAL, type(ArrayList.class), "<init>", "()V");
                } else {
                    mw.visitLdcInsn(com.alibaba.fastjson.asm.Type.getType(desc(fieldClass)));
                    mw.visitMethodInsn(INVOKESTATIC, type(TypeUtils.class), "createCollection", "(Ljava/lang/Class;)Ljava/util/Collection;");
                }
                mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
                mw.visitVarInsn(ALOAD, context.var("lexer"));
                mw.visitVarInsn(ALOAD, context.var_asm(fieldInfo));
                mw.visitVarInsn(BIPUSH, seperator);
                mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanStringArray", "(Ljava/util/Collection;C)V");
                Label valueNullEnd_ = new Label();
                mw.visitVarInsn(ALOAD, context.var("lexer"));
                mw.visitFieldInsn(GETFIELD, JSONLexerBase, "matchStat", "I");
                mw.visitLdcInsn(com.alibaba.fastjson.parser.JSONLexerBase.VALUE_NULL);
                mw.visitJumpInsn(IF_ICMPNE, valueNullEnd_);
                mw.visitInsn(ACONST_NULL);
                mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
                mw.visitLabel(valueNullEnd_);
            } else {
                Label notError_ = new Label();
                mw.visitVarInsn(ALOAD, context.var("lexer"));
                mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "token", "()I");
                mw.visitVarInsn(ISTORE, context.var("token"));
                mw.visitVarInsn(ILOAD, context.var("token"));
                int token = i == 0 ? JSONToken.LBRACKET : JSONToken.COMMA;
                mw.visitLdcInsn(token);
                mw.visitJumpInsn(IF_ICMPEQ, notError_);
                // DefaultJSONParser
                mw.visitVarInsn(ALOAD, 1);
                mw.visitLdcInsn(token);
                mw.visitMethodInsn(INVOKEVIRTUAL, DefaultJSONParser, "throwException", "(I)V");
                mw.visitLabel(notError_);
                Label quickElse_ = new Label(), quickEnd_ = new Label();
                mw.visitVarInsn(ALOAD, context.var("lexer"));
                mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "getCurrent", "()C");
                mw.visitVarInsn(BIPUSH, '[');
                mw.visitJumpInsn(IF_ICMPNE, quickElse_);
                mw.visitVarInsn(ALOAD, context.var("lexer"));
                mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "next", "()C");
                mw.visitInsn(POP);
                mw.visitVarInsn(ALOAD, context.var("lexer"));
                mw.visitLdcInsn(JSONToken.LBRACKET);
                mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "setToken", "(I)V");
                mw.visitJumpInsn(GOTO, quickEnd_);
                mw.visitLabel(quickElse_);
                mw.visitVarInsn(ALOAD, context.var("lexer"));
                mw.visitLdcInsn(JSONToken.LBRACKET);
                mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "nextToken", "(I)V");
                mw.visitLabel(quickEnd_);
                _newCollection(mw, fieldClass, i, false);
                mw.visitInsn(DUP);
                mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
                _getCollectionFieldItemDeser(context, mw, fieldInfo, itemClass);
                mw.visitVarInsn(ALOAD, 1);
                mw.visitLdcInsn(com.alibaba.fastjson.asm.Type.getType(desc(itemClass)));
                mw.visitVarInsn(ALOAD, 3);
                mw.visitMethodInsn(INVOKESTATIC, type(JavaBeanDeserializer.class), "parseArray", // 
                "(Ljava/util/Collection;" + // 
                desc(ObjectDeserializer.class) + "L" + DefaultJSONParser + // 
                ";" + "Ljava/lang/reflect/Type;Ljava/lang/Object;)V");
            }
        } else if (fieldClass.isArray()) {
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitLdcInsn(com.alibaba.fastjson.parser.JSONToken.LBRACKET);
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "nextToken", "(I)V");
            mw.visitVarInsn(ALOAD, Context.parser);
            mw.visitVarInsn(ALOAD, 0);
            mw.visitLdcInsn(i);
            mw.visitMethodInsn(INVOKEVIRTUAL, type(JavaBeanDeserializer.class), "getFieldType", "(I)Ljava/lang/reflect/Type;");
            mw.visitMethodInsn(INVOKEVIRTUAL, DefaultJSONParser, "parseObject", "(Ljava/lang/reflect/Type;)Ljava/lang/Object;");
            // cast
            mw.visitTypeInsn(CHECKCAST, type(fieldClass));
            mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
        } else {
            Label objElseIf_ = new Label();
            Label objEndIf_ = new Label();
            if (fieldClass == java.util.Date.class) {
                mw.visitVarInsn(ALOAD, context.var("lexer"));
                mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "getCurrent", "()C");
                mw.visitLdcInsn((int) '1');
                mw.visitJumpInsn(IF_ICMPNE, objElseIf_);
                mw.visitTypeInsn(NEW, type(java.util.Date.class));
                mw.visitInsn(DUP);
                mw.visitVarInsn(ALOAD, context.var("lexer"));
                mw.visitVarInsn(BIPUSH, seperator);
                mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "scanLong", "(C)J");
                mw.visitMethodInsn(INVOKESPECIAL, type(java.util.Date.class), "<init>", "(J)V");
                mw.visitVarInsn(ASTORE, context.var_asm(fieldInfo));
                mw.visitJumpInsn(GOTO, objEndIf_);
            }
            mw.visitLabel(objElseIf_);
            _quickNextToken(context, mw, JSONToken.LBRACKET);
            _deserObject(context, mw, fieldInfo, fieldClass, i);
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "token", "()I");
            mw.visitLdcInsn(JSONToken.RBRACKET);
            mw.visitJumpInsn(IF_ICMPEQ, objEndIf_);
            // mw.visitInsn(POP);
            // mw.visitInsn(POP);
            mw.visitVarInsn(ALOAD, 0);
            mw.visitVarInsn(ALOAD, context.var("lexer"));
            if (!last) {
                mw.visitLdcInsn(JSONToken.COMMA);
            } else {
                mw.visitLdcInsn(JSONToken.RBRACKET);
            }
            // 
            mw.visitMethodInsn(// 
            INVOKESPECIAL, // 
            type(JavaBeanDeserializer.class), "check", "(" + desc(JSONLexer.class) + "I)V");
            mw.visitLabel(objEndIf_);
            continue;
        }
    }
    _batchSet(context, mw, false);
    Label quickElse_ = new Label(), quickElseIf_ = new Label(), quickElseIfEOI_ = 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, quickElseIf_);
    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(quickElseIf_);
    mw.visitVarInsn(ILOAD, context.var("ch"));
    mw.visitVarInsn(BIPUSH, ']');
    mw.visitJumpInsn(IF_ICMPNE, quickElseIfEOI_);
    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(quickElseIfEOI_);
    mw.visitVarInsn(ILOAD, context.var("ch"));
    mw.visitVarInsn(BIPUSH, (char) JSONLexer.EOI);
    mw.visitJumpInsn(IF_ICMPNE, quickElse_);
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "next", "()C");
    mw.visitInsn(POP);
    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.visitLdcInsn(JSONToken.COMMA);
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "nextToken", "(I)V");
    mw.visitLabel(quickEnd_);
    mw.visitVarInsn(ALOAD, context.var("instance"));
    mw.visitInsn(ARETURN);
    mw.visitMaxs(5, context.variantIndex);
    mw.visitEnd();
}
Also used : Label(com.alibaba.fastjson.asm.Label) JSONLexer(com.alibaba.fastjson.parser.JSONLexer) MethodVisitor(com.alibaba.fastjson.asm.MethodVisitor) ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList) List(java.util.List) Collections(java.util.Collections) MethodWriter(com.alibaba.fastjson.asm.MethodWriter) SymbolTable(com.alibaba.fastjson.parser.SymbolTable) BigDecimal(java.math.BigDecimal) BigInteger(java.math.BigInteger) ParameterizedType(java.lang.reflect.ParameterizedType) Type(java.lang.reflect.Type) com.alibaba.fastjson.util(com.alibaba.fastjson.util) AtomicLong(java.util.concurrent.atomic.AtomicLong) Collection(java.util.Collection) ParserConfig(com.alibaba.fastjson.parser.ParserConfig)

Example 44 with Label

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

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_asm(fieldInfo));
    _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_asm(fieldInfo));
    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_asm(fieldInfo));
    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_asm(fieldInfo));
        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_asm(fieldInfo));
    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_asm(fieldInfo));
    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 45 with Label

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

the class ASMDeserializerFactory method _quickNextToken.

private void _quickNextToken(Context context, MethodVisitor mw, int token) {
    Label quickElse_ = new Label(), quickEnd_ = new Label();
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "getCurrent", "()C");
    if (token == JSONToken.LBRACE) {
        mw.visitVarInsn(BIPUSH, '{');
    } else if (token == JSONToken.LBRACKET) {
        mw.visitVarInsn(BIPUSH, '[');
    } else {
        throw new IllegalStateException();
    }
    mw.visitJumpInsn(IF_ICMPNE, quickElse_);
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "next", "()C");
    mw.visitInsn(POP);
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitLdcInsn(token);
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "setToken", "(I)V");
    mw.visitJumpInsn(GOTO, quickEnd_);
    mw.visitLabel(quickElse_);
    mw.visitVarInsn(ALOAD, context.var("lexer"));
    mw.visitLdcInsn(token);
    mw.visitMethodInsn(INVOKEVIRTUAL, JSONLexerBase, "nextToken", "(I)V");
    mw.visitLabel(quickEnd_);
}
Also used : Label(com.alibaba.fastjson.asm.Label)

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