Example usage for org.objectweb.asm MethodVisitor visitMethodInsn

List of usage examples for org.objectweb.asm MethodVisitor visitMethodInsn

Introduction

In this page you can find the example usage for org.objectweb.asm MethodVisitor visitMethodInsn.

Prototype

public void visitMethodInsn(final int opcode, final String owner, final String name, final String descriptor,
        final boolean isInterface) 

Source Link

Document

Visits a method instruction.

Usage

From source file:com.cinnober.msgcodec.blink.BaseByteCodeGenerator.java

License:Open Source License

/**
 * Generate value encoding using the blink output.
 *
 * <p>Defaults to <code>writeUInt8[Null].</code>
 *
 * @param required true if the field is required, otherwise false.
 * @param mv the method visitor, not null.
 * @see #generateEncodeValue/*from w  w w.  ja  v  a2s.  c om*/
 */
protected void generateEncodeUInt8Value(boolean required, MethodVisitor mv) {
    if (required) {
        mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeUInt8",
                "(Lcom/cinnober/msgcodec/io/ByteSink;B)V", false);
    } else {
        mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeUInt8Null",
                "(Lcom/cinnober/msgcodec/io/ByteSink;Ljava/lang/Byte;)V", false);
    }
}

From source file:com.cinnober.msgcodec.blink.BaseByteCodeGenerator.java

License:Open Source License

/**
 * Generate value encoding using the blink output.
 *
 * <p>Defaults to <code>writeInt8[Null].</code>
 *
 * @param required true if the field is required, otherwise false.
 * @param mv the method visitor, not null.
 * @see #generateEncodeValue//from   w  ww.ja  v a2s  .co m
 */
protected void generateEncodeInt8Value(boolean required, MethodVisitor mv) {
    if (required) {
        mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeInt8",
                "(Lcom/cinnober/msgcodec/io/ByteSink;B)V", false);
    } else {
        mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeInt8Null",
                "(Lcom/cinnober/msgcodec/io/ByteSink;Ljava/lang/Byte;)V", false);
    }
}

From source file:com.cinnober.msgcodec.blink.BaseByteCodeGenerator.java

License:Open Source License

/**
 * Generate value encoding using the blink output.
 *
 * <p>Defaults to <code>writeDynamicGroup[Null]</code> in the generated codec.
 *
 * @param required true if the field is required, otherwise false.
 * @param mv the method visitor, not null.
 * @see #generateEncodeValue//w ww.ja  v a2 s  .c o  m
 */
protected void generateEncodeDynRefValue(LocalVariable nextVar, MethodVisitor mv, boolean required) {
    // PENDING: validate that the instance class is a subclass of refGroup (unless null)
    int instanceVar = nextVar.next();
    mv.visitVarInsn(ASTORE, instanceVar);
    mv.visitVarInsn(ALOAD, 0); // this
    mv.visitInsn(SWAP); // this and out
    mv.visitVarInsn(ALOAD, instanceVar);
    if (required) {
        mv.visitMethodInsn(INVOKEVIRTUAL, baseclassIName, "writeDynamicGroup",
                "(Lcom/cinnober/msgcodec/io/ByteSink;Ljava/lang/Object;)V", false);
    } else {
        mv.visitMethodInsn(INVOKEVIRTUAL, baseclassIName, "writeDynamicGroupNull",
                "(Lcom/cinnober/msgcodec/io/ByteSink;Ljava/lang/Object;)V", false);
    }
}

From source file:com.cinnober.msgcodec.blink.BaseByteCodeGenerator.java

License:Open Source License

protected void generateEncodeRefValue(GroupDef refGroup, boolean required, LocalVariable nextVar,
        MethodVisitor mv, String genClassInternalName, int outputStreamVar, TypeDef.Reference type,
        boolean javaClassCodec) throws IllegalArgumentException {
    if (refGroup != null) {
        Object refGroupType = refGroup.getGroupType();
        String refGroupDescriptor = getTypeDescriptor(refGroupType, javaClassCodec);
        if (required) {
            int instanceVar = nextVar.next();
            mv.visitVarInsn(ASTORE, instanceVar);
            mv.visitVarInsn(ALOAD, 0); // this
            mv.visitInsn(SWAP); // this and out
            mv.visitVarInsn(ALOAD, instanceVar);
            mv.visitMethodInsn(INVOKEVIRTUAL, genClassInternalName, "writeStaticGroup_" + refGroup.getName(),
                    "(Lcom/cinnober/msgcodec/io/ByteSink;" + refGroupDescriptor + ")V", false);
        } else {// w  w  w . j  a  v a2  s. co  m
            int instanceVar = nextVar.next();
            mv.visitInsn(DUP);
            Label nonNullLabel = new Label();
            Label endLabel = new Label();
            mv.visitJumpInsn(IFNONNULL, nonNullLabel);
            // null
            mv.visitInsn(POP);
            mv.visitInsn(ICONST_0); // false
            mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writePresenceByte",
                    "(Lcom/cinnober/msgcodec/io/ByteSink;Z)V", false);
            mv.visitJumpInsn(GOTO, endLabel);

            // not null
            mv.visitLabel(nonNullLabel);
            // PENDING: mv.visitFrame?
            mv.visitVarInsn(ASTORE, instanceVar);
            mv.visitInsn(ICONST_1); // true
            mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writePresenceByte",
                    "(Lcom/cinnober/msgcodec/io/ByteSink;Z)V", false);
            mv.visitVarInsn(ALOAD, 0); // this
            mv.visitVarInsn(ALOAD, outputStreamVar);
            mv.visitVarInsn(ALOAD, instanceVar);
            mv.visitMethodInsn(INVOKEVIRTUAL, genClassInternalName, "writeStaticGroup_" + refGroup.getName(),
                    "(Lcom/cinnober/msgcodec/io/ByteSink;" + refGroupDescriptor + ")V", false);
            mv.visitLabel(endLabel);
            // PENDING: mv.visitFrame?
        }
    } else {
        throw new IllegalArgumentException("Illegal reference: " + type);
    }
}

From source file:com.cinnober.msgcodec.blink.BaseByteCodeGenerator.java

License:Open Source License

protected void generateEncodeSequenceValue(Class<?> javaClass, LocalVariable nextVar, MethodVisitor mv,
        boolean required, int outputStreamVar, Class<?> componentJavaClass, TypeDef type, Schema schema,
        String genClassInternalName, String fieldIdentifier, String debugValueLabel, boolean javaClassCodec)
        throws IllegalArgumentException {

    // PENDING: merge the two if-cases, and reuse common code blocks (see generateDecodeSquenceValue)
    if (javaClass.isArray()) {
        int sequenceVar = nextVar.next();
        mv.visitInsn(DUP);/*ww  w.ja v  a 2s. c o  m*/
        mv.visitVarInsn(ASTORE, sequenceVar);
        int lengthVar = nextVar.next();
        Label endLabel = new Label();
        if (required) {
            mv.visitInsn(ARRAYLENGTH);
            mv.visitInsn(DUP);
            mv.visitVarInsn(ISTORE, lengthVar);
            mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeUInt32",
                    "(Lcom/cinnober/msgcodec/io/ByteSink;I)V", false);
        } else {
            Label nonNullLabel = new Label();
            mv.visitInsn(DUP);
            mv.visitJumpInsn(IFNONNULL, nonNullLabel);
            // null
            mv.visitInsn(POP);
            mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeNull",
                    "(Lcom/cinnober/msgcodec/io/ByteSink;)V", false);
            mv.visitJumpInsn(GOTO, endLabel);
            // not null
            mv.visitLabel(nonNullLabel);
            // PENDING: mv.visitFrame?
            mv.visitInsn(ARRAYLENGTH);
            mv.visitInsn(DUP);
            mv.visitVarInsn(ISTORE, lengthVar);
            mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeUInt32",
                    "(Lcom/cinnober/msgcodec/io/ByteSink;I)V", false);
        }
        // for loop
        int loopVar = nextVar.next();
        mv.visitInsn(ICONST_0);
        mv.visitVarInsn(ISTORE, loopVar);
        Label loopLabel = new Label();
        mv.visitLabel(loopLabel);
        // PENDING: mv.visitFrame?
        mv.visitVarInsn(ILOAD, loopVar);
        mv.visitVarInsn(ILOAD, lengthVar);
        mv.visitJumpInsn(IF_ICMPGE, endLabel);
        mv.visitVarInsn(ALOAD, outputStreamVar);
        mv.visitVarInsn(ALOAD, sequenceVar);
        mv.visitVarInsn(ILOAD, loopVar);
        if (componentJavaClass == byte.class || componentJavaClass == boolean.class) {
            mv.visitInsn(BALOAD);
        } else if (componentJavaClass == short.class) {
            mv.visitInsn(SALOAD);
        } else if (componentJavaClass == int.class) {
            mv.visitInsn(IALOAD);
        } else if (componentJavaClass == long.class) {
            mv.visitInsn(LALOAD);
        } else if (componentJavaClass == float.class) {
            mv.visitInsn(FALOAD);
        } else if (componentJavaClass == double.class) {
            mv.visitInsn(DALOAD);
        } else if (componentJavaClass == char.class) {
            mv.visitInsn(CALOAD);
        } else {
            mv.visitInsn(AALOAD);
            mv.visitTypeInsn(CHECKCAST, Type.getInternalName(componentJavaClass));
        }

        // encode the element
        TypeDef.Sequence seqType = (TypeDef.Sequence) type;
        generateEncodeValue(mv, outputStreamVar, nextVar, true, seqType.getComponentType(), componentJavaClass,
                null, schema, genClassInternalName, fieldIdentifier, debugValueLabel + ".component",
                javaClassCodec);

        mv.visitIincInsn(loopVar, 1);
        mv.visitJumpInsn(GOTO, loopLabel);
        mv.visitLabel(endLabel);
        // PENDING: mv.visitFrame?

    } else if (javaClass == List.class) {
        int sequenceVar = nextVar.next();
        mv.visitInsn(DUP);
        mv.visitVarInsn(ASTORE, sequenceVar);
        int lengthVar = nextVar.next();
        Label endLabel = new Label();
        if (required) {
            mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "size", "()I", true);
            mv.visitInsn(DUP);
            mv.visitVarInsn(ISTORE, lengthVar);
            mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeUInt32",
                    "(Lcom/cinnober/msgcodec/io/ByteSink;I)V", false);
        } else {
            Label nonNullLabel = new Label();
            mv.visitInsn(DUP);
            mv.visitJumpInsn(IFNONNULL, nonNullLabel);
            // null
            mv.visitInsn(POP);
            mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeNull",
                    "(Lcom/cinnober/msgcodec/io/ByteSink;)V", false);
            mv.visitJumpInsn(GOTO, endLabel);
            // not null
            mv.visitLabel(nonNullLabel);
            // PENDING: mv.visitFrame?
            mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "size", "()I", true);
            mv.visitInsn(DUP);
            mv.visitVarInsn(ISTORE, lengthVar);
            mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeUInt32",
                    "(Lcom/cinnober/msgcodec/io/ByteSink;I)V", false);
        }
        // for loop, using iterator
        int iteratorVar = nextVar.next();
        mv.visitVarInsn(ALOAD, sequenceVar);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/List", "iterator", "()Ljava/util/Iterator;", true);
        mv.visitVarInsn(ASTORE, iteratorVar);
        Label loopLabel = new Label();
        mv.visitLabel(loopLabel);
        // PENDING: mv.visitFrame?
        mv.visitVarInsn(ALOAD, iteratorVar);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z", true);
        mv.visitJumpInsn(IFEQ, endLabel);
        mv.visitVarInsn(ALOAD, outputStreamVar);
        mv.visitVarInsn(ALOAD, iteratorVar);
        mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;", true);
        if (componentJavaClass.isPrimitive()) {
            mv.visitTypeInsn(CHECKCAST, Type.getInternalName(box(componentJavaClass)));
            unbox(mv, componentJavaClass);
        } else {
            mv.visitTypeInsn(CHECKCAST, Type.getInternalName(componentJavaClass));
        }

        // encode the element
        TypeDef.Sequence seqType = (TypeDef.Sequence) type;
        generateEncodeValue(mv, outputStreamVar, nextVar, true, seqType.getComponentType(), componentJavaClass,
                null, schema, genClassInternalName, fieldIdentifier, debugValueLabel + ".component",
                javaClassCodec);

        mv.visitJumpInsn(GOTO, loopLabel);
        mv.visitLabel(endLabel);
        // PENDING: mv.visitFrame?
    } else {
        throw new IllegalArgumentException("Illegal sequence javaClass: " + javaClass);
    }
}

From source file:com.cinnober.msgcodec.blink.BaseByteCodeGenerator.java

License:Open Source License

protected void generateEncodeTimeValue(TypeDef.Time type, Class<?> javaClass, boolean required,
        MethodVisitor mv) throws RuntimeException {
    if (javaClass == long.class || javaClass == Long.class) {
        generateEncodeInt64Value(required, mv);
    } else if (javaClass == int.class || javaClass == Integer.class) {
        generateEncodeInt32Value(required, mv);
    } else if (javaClass == Date.class) {

        Label nullLabel = new Label();
        Label endLabel = new Label();
        if (!required) {
            mv.visitInsn(DUP);/* www. ja v  a2 s .c  o  m*/
            mv.visitJumpInsn(IFNULL, nullLabel);
        }

        // not null
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/util/Date", "getTime", "()J", false);
        // handle differences in UNIT and EPOCH
        long epochOffset = DateUtil.getEpochOffset(type.getEpoch());
        long timeInMillis = DateUtil.getTimeInMillis(type.getUnit());
        // wireTime = (dateTime - epochOffset) / timeUnitInMillis);
        if (epochOffset != 0) {
            mv.visitLdcInsn(epochOffset);
            mv.visitInsn(LSUB);
        }
        if (timeInMillis != 1) {
            mv.visitLdcInsn(timeInMillis);
            mv.visitInsn(LDIV);
        }
        box(mv, long.class);
        mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeInt64Null",
                "(Lcom/cinnober/msgcodec/io/ByteSink;Ljava/lang/Long;)V", false);

        if (!required) {
            mv.visitJumpInsn(GOTO, endLabel);
            mv.visitLabel(nullLabel);
            mv.visitInsn(POP);
            mv.visitInsn(ACONST_NULL);
            mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeInt64Null",
                    "(Lcom/cinnober/msgcodec/io/ByteSink;Ljava/lang/Long;)V", false);
            mv.visitLabel(endLabel);
        }
    } else {
        throw new IllegalArgumentException("Illegal time javaClass: " + javaClass);
    }
}

From source file:com.cinnober.msgcodec.blink.BaseByteCodeGenerator.java

License:Open Source License

protected void generateEncodeEnumValue(TypeDef.Enum enumType, String genClassInternalName,
        String fieldIdentifier, LocalVariable nextVar, Class<?> javaClass, boolean required, MethodVisitor mv,
        String debugValueLabel) throws IllegalArgumentException {

    Label writeValueLabel = new Label();

    // Make sure that no unsupported javaClass is used for an enum
    if (javaClass != int.class && javaClass != Integer.class && (javaClass == null || !javaClass.isEnum())) {
        throw new IllegalArgumentException("Illegal enum javaClass: " + javaClass);
    }// www  .j  av  a2  s . c  o  m

    // If null do not look it up
    if (!required) {
        Label lookupIdLabel = new Label();
        mv.visitInsn(DUP);
        mv.visitJumpInsn(IFNONNULL, lookupIdLabel);

        // null
        mv.visitInsn(POP);
        mv.visitInsn(ACONST_NULL);
        mv.visitJumpInsn(GOTO, writeValueLabel);

        // not null
        mv.visitLabel(lookupIdLabel);
    }

    // SymbolMapping
    if (required && !javaClass.isEnum()) {
        box(mv, int.class);
    }
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, genClassInternalName, "symbolMapping_" + fieldIdentifier,
            "Lcom/cinnober/msgcodec/SymbolMapping;");
    mv.visitInsn(SWAP);
    mv.visitMethodInsn(INVOKEINTERFACE, "com/cinnober/msgcodec/SymbolMapping", "getId",
            "(Ljava/lang/Object;)Ljava/lang/Integer;", true);

    // Write the value
    mv.visitLabel(writeValueLabel);
    if (required) {
        unbox(mv, Integer.class); // TODO: Should null check before this and throw exception since there was no mapping
    }
    generateEncodeInt32Value(required, mv);

    //        if (javaClass.isEnum()) {
    //            Label endLabel = new Label();
    //            if (!required) {
    //                Label nonNullLabel = new Label();
    //                mv.visitInsn(DUP);
    //                mv.visitJumpInsn(IFNONNULL, nonNullLabel);
    //                // null
    //                mv.visitInsn(POP);
    //                mv.visitInsn(ACONST_NULL);
    //                mv.visitMethodInsn(INVOKESTATIC, blinkOutputIName, "writeInt32Null",
    //                        "(Lcom/cinnober/msgcodec/io/ByteSink;Ljava/lang/Integer;)V", false);
    //                mv.visitJumpInsn(GOTO, endLabel);
    //                // not null
    //                mv.visitLabel(nonNullLabel);
    //            }
    //            mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Enum", "ordinal", "()I", false);
    //            //switch
    //            EnumSymbols enumSymbols = new EnumSymbols(enumType, javaClass);
    //            Enum[] enumValues = ((Class<Enum>)javaClass).getEnumConstants();
    //            int[] ordinals = new int[enumValues.length];
    //            Label[] labels = new Label[enumValues.length];
    //            for (int i=0; i<enumValues.length; i++) {
    //                ordinals[i] = i;
    //                labels[i] = new Label();
    //            }
    //            Label defaultLabel = new Label();
    //            Label writeLabel = new Label();
    //            int symbolIdVar = nextVar.next();
    //            mv.visitLookupSwitchInsn(defaultLabel, ordinals, labels);
    //            for (int i=0; i<enumValues.length; i++) {
    //                mv.visitLabel(labels[i]);
    //                Symbol symbol = enumSymbols.getSymbol(enumValues[i]);
    //                if (symbol != null) {
    //                    mv.visitLdcInsn(symbol.getId());
    //                    mv.visitJumpInsn(GOTO, writeLabel);
    //                } else {
    //                    mv.visitLdcInsn(debugValueLabel);
    //                    mv.visitVarInsn(ALOAD, symbolIdVar);
    //                    mv.visitMethodInsn(INVOKESTATIC, baseclassIName, "unmappableEnumSymbolValue",
    //                            "(Ljava/lang/String;Ljava/lang/Enum;)Ljava/lang/IllegalArgumentException;", false);
    //                    mv.visitInsn(ATHROW);
    //                }
    //            }
    //            mv.visitLabel(defaultLabel);
    //            mv.visitTypeInsn(NEW, "java/lang/RuntimeException");
    //            mv.visitInsn(DUP);
    //            mv.visitLdcInsn("Should not happen: reached generated switch default case for value " + debugValueLabel);
    //            mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/String;)V", false);
    //            mv.visitInsn(ATHROW);
    //
    //            // write
    //            mv.visitLabel(writeLabel);
    //            if (!required) {
    //                box(mv, int.class);
    //            }
    //            generateEncodeInt32Value(required, mv);
    //            // end
    //            mv.visitLabel(endLabel);
    //        } else if (javaClass == int.class || javaClass == Integer.class) {
    //            generateEncodeInt32Value(required, mv);
    //        } else {
    //            throw new IllegalArgumentException("Illegal enum javaClass: " + javaClass);
    //        }
}

From source file:com.cinnober.msgcodec.blink.BaseByteCodeGenerator.java

License:Open Source License

protected void generateDecodeDummy(MethodVisitor mv, int byteSourceVar, LocalVariable nextVar, boolean required,
        TypeDef type, Class<?> javaClass, Class<?> componentJavaClass, Schema schema,
        String genClassInternalName, String debugValueLabel, boolean javaClassCodec) {
    type = schema.resolveToType(type, false);

    switch (type.getType()) {
    case ENUM://from w  w  w.  j a va 2s. c  om
        if (required) {
            mv.visitMethodInsn(INVOKESTATIC, blinkInputIName, "readUInt32",
                    "(Lcom/cinnober/msgcodec/io/ByteSource;)I", false);
        } else {
            mv.visitMethodInsn(INVOKESTATIC, blinkInputIName, "readUInt32Null",
                    "(Lcom/cinnober/msgcodec/io/ByteSource;)Ljava/lang/Integer;", false);
        }
        break;
    default:
        generateDecodeValue(mv, byteSourceVar, nextVar, required, type, javaClass, componentJavaClass, schema,
                genClassInternalName, null, debugValueLabel, javaClassCodec);
    }
}

From source file:com.cinnober.msgcodec.blink.BaseByteCodeGenerator.java

License:Open Source License

/**
 * Generate value decoding using the blink input.
 *
 * <p>Defaults to <code>readBoolean[Null].</code>
 *
 * @param required true if the field is required, otherwise false.
 * @param mv the method visitor, not null.
 * @see #generateDecodeValue// w  w w.  j a  v a2  s  .c  o  m
 */
protected void generateDecodeBooleanValue(boolean required, MethodVisitor mv) {
    if (required) {
        mv.visitMethodInsn(INVOKESTATIC, blinkInputIName, "readBoolean",
                "(Lcom/cinnober/msgcodec/io/ByteSource;)Z", false);
    } else {
        mv.visitMethodInsn(INVOKESTATIC, blinkInputIName, "readBooleanNull",
                "(Lcom/cinnober/msgcodec/io/ByteSource;)Ljava/lang/Boolean;", false);
    }
}

From source file:com.cinnober.msgcodec.blink.BaseByteCodeGenerator.java

License:Open Source License

/**
 * Generate value decoding using the blink input.
 *
 * <p>Defaults to <code>readBinary[Null].</code>
 *
 * @param required true if the field is required, otherwise false.
 * @param mv the method visitor, not null.
 * @see #generateDecodeValue// w ww  .  jav a2  s .c  om
 */
protected void generateDecodeBinaryValue(TypeDef.Binary type, MethodVisitor mv, boolean required) {
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKEVIRTUAL, baseclassIName, "getMaxBinarySize", "()I", false);
    if (required) {
        mv.visitMethodInsn(INVOKESTATIC, blinkInputIName, "readBinary",
                "(Lcom/cinnober/msgcodec/io/ByteSource;I)[B", false);
    } else {
        mv.visitMethodInsn(INVOKESTATIC, blinkInputIName, "readBinaryNull",
                "(Lcom/cinnober/msgcodec/io/ByteSource;I)[B", false);
    }
}