Example usage for org.objectweb.asm MethodVisitor visitLabel

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

Introduction

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

Prototype

public void visitLabel(final Label label) 

Source Link

Document

Visits a label.

Usage

From source file:mt.swift.Serializer.java

License:Apache License

private void generateWriteMap(MethodVisitor methodVisitor, FrameRegisterManager context, MapType mapType) {
    // top of stack is list we're serializing
    int mapSlot = context.newAnonymousSlot();
    methodVisitor.visitVarInsn(ASTORE, mapSlot);

    // protocol.writeListBegin(new TList(ttype, object.size))
    methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));

    methodVisitor.visitTypeInsn(NEW, "com/facebook/thrift/protocol/TMap");
    methodVisitor.visitInsn(DUP);/*  w  w w  . ja v  a2  s . co m*/
    pushValue(methodVisitor, mapType.getKeyType().getTType());
    pushValue(methodVisitor, mapType.getValueType().getTType());
    methodVisitor.visitVarInsn(ALOAD, mapSlot);
    methodVisitor.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "size", "()I");
    methodVisitor.visitMethodInsn(INVOKESPECIAL, "com/facebook/thrift/protocol/TMap", "<init>", "(BBI)V");

    methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "writeMapBegin",
            "(Lcom/facebook/thrift/protocol/TMap;)V");

    // at this point, stack is empty

    // for (element : value), using a while (iterator.hasNext()) { ... } loop
    methodVisitor.visitVarInsn(ALOAD, mapSlot);
    methodVisitor.visitMethodInsn(INVOKEINTERFACE, "java/util/Map", "entrySet", "()Ljava/util/Set;");
    methodVisitor.visitMethodInsn(INVOKEINTERFACE, "java/util/Set", "iterator", "()Ljava/util/Iterator;");

    // TODO: generalize generateIterator method to take a callback to generate the code for processing each
    // element
    Label loopLabel = new Label();
    Label doneLabel = new Label();

    methodVisitor.visitLabel(loopLabel);
    methodVisitor.visitInsn(DUP); // for iterator.hasNext()
    methodVisitor.visitInsn(DUP); // for iterator.next()

    // iterator.hasNext?
    methodVisitor.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z");

    methodVisitor.visitJumpInsn(IFEQ, doneLabel); // if hasNext returned false (0), we're done

    methodVisitor.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;");
    // element is Map.Entry

    methodVisitor.visitInsn(DUP); // for entry.getKey

    int entrySlot = context.newAnonymousSlot();
    methodVisitor.visitVarInsn(ASTORE, entrySlot); // for entry.getValue

    methodVisitor.visitMethodInsn(INVOKEINTERFACE, "java/util/Map$Entry", "getKey", "()Ljava/lang/Object;");
    generateCast(methodVisitor, mapType.getKeyType());
    generateWriteElement(methodVisitor, context, mapType.getKeyType());

    methodVisitor.visitVarInsn(ALOAD, entrySlot);
    methodVisitor.visitMethodInsn(INVOKEINTERFACE, "java/util/Map$Entry", "getValue", "()Ljava/lang/Object;");
    generateCast(methodVisitor, mapType.getValueType());
    generateWriteElement(methodVisitor, context, mapType.getValueType());

    context.release(entrySlot);

    methodVisitor.visitJumpInsn(GOTO, loopLabel);

    methodVisitor.visitLabel(doneLabel);
    methodVisitor.visitInsn(POP); // lingering reference to iterator

    // protocol.writeSetEnd()
    methodVisitor.visitVarInsn(ALOAD, context.getSlot("protocol"));
    methodVisitor.visitMethodInsn(INVOKEVIRTUAL, "com/facebook/thrift/protocol/TProtocol", "writeMapEnd",
            "()V");

    context.release(mapSlot);
}

From source file:mt.swift.Serializer.java

License:Apache License

/**
 * Generates code to write the elements of an iterator, one after another
 *
 * Assumes iterator is at top of stack//from  www .  j  av a 2  s .  c  o m
 *
 * @param methodVisitor
 * @param context
 * @param elementType
 */
private void generateWriteIteratorElements(MethodVisitor methodVisitor, FrameRegisterManager context,
        Type elementType) {
    Label loopLabel = new Label();
    Label doneLabel = new Label();

    methodVisitor.visitLabel(loopLabel);
    methodVisitor.visitInsn(DUP); // for iterator.hasNext()
    methodVisitor.visitInsn(DUP); // for iterator.next()

    // iterator.hasNext?
    methodVisitor.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "hasNext", "()Z");

    methodVisitor.visitJumpInsn(IFEQ, doneLabel); // if hasNext returned false (0), we're done

    methodVisitor.visitMethodInsn(INVOKEINTERFACE, "java/util/Iterator", "next", "()Ljava/lang/Object;");

    generateCast(methodVisitor, elementType);
    generateWriteElement(methodVisitor, context, elementType);

    methodVisitor.visitJumpInsn(GOTO, loopLabel);

    methodVisitor.visitLabel(doneLabel);
    methodVisitor.visitInsn(POP); // lingering reference to iterator
    methodVisitor.visitInsn(POP); // lingering reference to iterator
}

From source file:net.sf.sveditor.core.db.persistence.JITPersistenceDelegateFactory.java

License:Open Source License

private void buildItemDispatchMethods(ClassWriter cw) {
    String classname = "SVDBPersistenceDelegate";
    String full_classname = transform_cls(fTargetPkg) + "/" + classname;

    Label labels[] = new Label[SVDBItemType.values().length];
    int indexes[] = new int[SVDBItemType.values().length];
    Label dflt, endcase;// w ww  . ja va2  s  . c o m

    for (int i = 0; i < SVDBItemType.values().length; i++) {
        indexes[i] = i;
    }

    // writeItem Dispatch method
    MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "writeSVDBItem",
            "(L" + getClassName(ISVDBItemBase.class) + ";)V", null, new String[] { fDBWriteException });
    for (int i = 0; i < SVDBItemType.values().length; i++) {
        labels[i] = new Label();
    }
    dflt = new Label();
    endcase = new Label();

    // Retrieve the object type
    mv.visitVarInsn(ALOAD, WRITE_OBJ_VAR);
    mv.visitMethodInsn(INVOKEINTERFACE, getClassName(ISVDBItemBase.class), "getType",
            "()L" + getClassName(SVDBItemType.class) + ";");
    mv.visitMethodInsn(INVOKEVIRTUAL, getClassName(SVDBItemType.class), "ordinal", "()I");
    mv.visitLookupSwitchInsn(dflt, indexes, labels);
    for (SVDBItemType t : SVDBItemType.values()) {
        Class c = fTypeClassMap.get(t);
        mv.visitLabel(labels[t.ordinal()]);

        mv.visitVarInsn(ALOAD, THIS_VAR);
        mv.visitVarInsn(ALOAD, WRITE_OBJ_VAR);
        mv.visitTypeInsn(CHECKCAST, getClassName(c));
        mv.visitMethodInsn(INVOKESPECIAL, full_classname, "write" + t.name(), "(L" + getClassName(c) + ";)V");
        mv.visitJumpInsn(GOTO, endcase);
    }
    mv.visitLabel(dflt);
    mv.visitLabel(endcase);
    mv.visitInsn(RETURN);
    mv.visitMaxs(16, 16);
    mv.visitEnd();

    // readItem dispatch method
    mv = cw.visitMethod(
            ACC_PUBLIC, "readSVDBItem", "(L" + getClassName(SVDBItemType.class) + ";L"
                    + getClassName(ISVDBChildItem.class) + ";)L" + getClassName(ISVDBItemBase.class) + ";",
            null, new String[] { fDBWriteException });
    for (int i = 0; i < SVDBItemType.values().length; i++) {
        labels[i] = new Label();
    }
    dflt = new Label();
    endcase = new Label();

    mv.visitVarInsn(ALOAD, 1); // object type
    mv.visitMethodInsn(INVOKEVIRTUAL, getClassName(SVDBItemType.class), "ordinal", "()I");
    mv.visitLookupSwitchInsn(dflt, indexes, labels);
    for (SVDBItemType t : SVDBItemType.values()) {
        Class c = fTypeClassMap.get(t);
        mv.visitLabel(labels[t.ordinal()]);

        mv.visitVarInsn(ALOAD, THIS_VAR);
        mv.visitVarInsn(ALOAD, 2); // parent
        mv.visitMethodInsn(INVOKESPECIAL, full_classname, "read" + t.name(),
                "(L" + getClassName(ISVDBChildItem.class) + ";)" + "L" + getClassName(c) + ";");
        mv.visitJumpInsn(GOTO, endcase);
    }
    mv.visitLabel(dflt);
    mv.visitInsn(ACONST_NULL);
    mv.visitLabel(endcase);
    mv.visitInsn(ARETURN);
    mv.visitMaxs(16, 16);
    mv.visitEnd();
}

From source file:net.sf.sveditor.core.db.persistence.JITPersistenceDelegateFactory.java

License:Open Source License

private void buildObjectDispatchMethods(ClassWriter cw) {
    String classname = "SVDBPersistenceDelegate";
    String full_classname = transform_cls(fTargetPkg) + "/" + classname;
    int idx;/* w w  w .j av  a  2  s. c  o  m*/

    Label labels[] = new Label[fClassList.size()];
    int indexes[] = new int[fClassList.size()];
    Label dflt, endcase;

    for (int i = 0; i < fClassList.size(); i++) {
        indexes[i] = i;
    }

    // writeItem Dispatch method
    MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "writeObject",
            "(L" + getClassName(Class.class) + ";" + "L" + getClassName(Object.class) + ";)V", null,
            new String[] { fDBWriteException });
    for (int i = 0; i < fClassList.size(); i++) {
        labels[i] = new Label();
    }
    dflt = new Label();
    endcase = new Label();

    // Find the object index
    mv.visitVarInsn(ALOAD, THIS_VAR);
    mv.visitFieldInsn(GETFIELD, fBaseClass, "fObjectTypeList", "L" + getClassName(List.class) + ";");

    // Class parameter
    // fObjectList field
    mv.visitVarInsn(ALOAD, 1); // cls parameter
    mv.visitMethodInsn(INVOKEINTERFACE, getClassName(List.class), "indexOf",
            "(L" + getClassName(Object.class) + ";)I");
    // Index now on the stack 
    mv.visitLookupSwitchInsn(dflt, indexes, labels);
    idx = 0;
    for (Class c : fClassList) {
        mv.visitLabel(labels[idx]);

        mv.visitVarInsn(ALOAD, THIS_VAR);
        mv.visitVarInsn(ALOAD, 2); // object
        mv.visitTypeInsn(CHECKCAST, getClassName(c));
        mv.visitMethodInsn(INVOKESPECIAL, full_classname, "write" + getClassLeafName(c),
                "(L" + getClassName(c) + ";)V");
        mv.visitJumpInsn(GOTO, endcase);
        idx++;
    }
    mv.visitLabel(dflt);
    mv.visitVarInsn(ALOAD, THIS_VAR);
    mv.visitVarInsn(ALOAD, 2); // object
    mv.visitMethodInsn(INVOKESPECIAL, full_classname, "writeObjectErr",
            "(L" + getClassName(Object.class) + ";)V");

    mv.visitLabel(endcase);
    mv.visitInsn(RETURN);
    mv.visitMaxs(16, 16);
    mv.visitEnd();

    // readItem dispatch method
    mv = cw.visitMethod(
            ACC_PUBLIC, "readObject", "(L" + getClassName(ISVDBChildItem.class) + ";" + "L"
                    + getClassName(Class.class) + ";" + "L" + getClassName(Object.class) + ";)V",
            null, new String[] { fDBWriteException });
    for (int i = 0; i < fClassList.size(); i++) {
        labels[i] = new Label();
    }
    dflt = new Label();
    endcase = new Label();

    // Find the object index
    mv.visitVarInsn(ALOAD, THIS_VAR);
    mv.visitFieldInsn(GETFIELD, fBaseClass, "fObjectTypeList", "L" + getClassName(List.class) + ";");

    // Class parameter
    // fObjectList field
    mv.visitVarInsn(ALOAD, 2); // cls parameter
    mv.visitMethodInsn(INVOKEINTERFACE, getClassName(List.class), "indexOf",
            "(L" + getClassName(Object.class) + ";)I");

    mv.visitLookupSwitchInsn(dflt, indexes, labels);
    idx = 0;
    for (Class c : fClassList) {
        mv.visitLabel(labels[idx]);

        // 
        mv.visitVarInsn(ALOAD, THIS_VAR);
        mv.visitVarInsn(ALOAD, 1); // parent
        mv.visitVarInsn(ALOAD, 3); // object
        mv.visitTypeInsn(CHECKCAST, getClassName(c));
        mv.visitMethodInsn(INVOKESPECIAL, full_classname, "read" + getClassLeafName(c),
                "(L" + getClassName(ISVDBChildItem.class) + ";" + "L" + getClassName(c) + ";)V");
        mv.visitJumpInsn(GOTO, endcase);
        idx++;
    }
    mv.visitLabel(dflt);
    mv.visitVarInsn(ALOAD, THIS_VAR);
    mv.visitVarInsn(ALOAD, 3); // object
    mv.visitMethodInsn(INVOKESPECIAL, full_classname, "readObjectErr",
            "(L" + getClassName(Object.class) + ";)V");
    mv.visitLabel(endcase);
    mv.visitInsn(RETURN);
    mv.visitMaxs(4, 4);
    mv.visitEnd();
}

From source file:net.sourceforge.cobertura.instrument.pass3.AbstractCodeProvider.java

License:GNU General Public License

public void generateCodeThatIncrementsCoberturaCounterIfVariableEqualsAndCleanVariable(
        MethodVisitor nextMethodVisitor, Integer neededJumpCounterIdVariableValue, Integer counterIdToIncrement,
        int lastJumpIdVariableIndex, String className) {

    nextMethodVisitor.visitLdcInsn((int) neededJumpCounterIdVariableValue);
    nextMethodVisitor.visitVarInsn(Opcodes.ILOAD, lastJumpIdVariableIndex);
    Label afterJump = new Label();
    nextMethodVisitor.visitJumpInsn(Opcodes.IF_ICMPNE, afterJump);
    generateCodeThatIncrementsCoberturaCounter(nextMethodVisitor, counterIdToIncrement, className);
    generateCodeThatZeroJumpCounterIdVariable(nextMethodVisitor, lastJumpIdVariableIndex);
    nextMethodVisitor.visitLabel(afterJump);
}

From source file:net.sourceforge.cobertura.instrument.pass3.AtomicArrayCodeProvider.java

License:GNU General Public License

public void generateCINITmethod(MethodVisitor mv, String className, int counters_cnt) {
    mv.visitFieldInsn(Opcodes.GETSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME,
            COBERTURA_COUNTERS_FIELD_TYPE);
    Label l1 = new Label();
    mv.visitJumpInsn(Opcodes.IFNONNULL, l1);

    mv.visitTypeInsn(Opcodes.NEW, Type.getInternalName(AtomicIntegerArray.class));
    mv.visitInsn(Opcodes.DUP);//from   w  ww  .j a v  a2 s .c o  m
    mv.visitLdcInsn(counters_cnt);
    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, Type.getInternalName(AtomicIntegerArray.class), "<init>", "(I)V");
    mv.visitFieldInsn(Opcodes.PUTSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME,
            COBERTURA_COUNTERS_FIELD_TYPE);
    generateRegisterClass(mv, className);
    mv.visitLabel(l1);
}

From source file:net.sourceforge.cobertura.instrument.pass3.AtomicArrayCodeProvider.java

License:GNU General Public License

/**
 * <pre>/*from  w ww. ja  v  a 2  s . c  o  m*/
 * int[] __cobertura_get_and_reset_counters() {
 * int[] res = new int[counters.length()];
 * for(int i=0; i<counters.length(); i++){
 * res[i]=counters.getAndSet(i, 0);
 * }
 * return res;
 * }
 * </pre>
 */
public void generateCoberturaGetAndResetCountersMethod(ClassVisitor cv, String className) {
    MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC,
            COBERTURA_GET_AND_RESET_COUNTERS_METHOD_NAME, "()[I", null, null);

    mv.visitCode();
    mv.visitFieldInsn(Opcodes.GETSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME,
            COBERTURA_COUNTERS_FIELD_TYPE);
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/concurrent/atomic/AtomicIntegerArray", "length",
            "()I");
    mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_INT);
    mv.visitVarInsn(Opcodes.ASTORE, 0);
    mv.visitInsn(Opcodes.ICONST_0);
    mv.visitVarInsn(Opcodes.ISTORE, 1);
    Label l3 = new Label();
    mv.visitJumpInsn(Opcodes.GOTO, l3);
    Label l4 = new Label();
    mv.visitLabel(l4);
    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitVarInsn(Opcodes.ILOAD, 1);
    mv.visitFieldInsn(Opcodes.GETSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME,
            COBERTURA_COUNTERS_FIELD_TYPE);
    mv.visitVarInsn(Opcodes.ILOAD, 1);
    mv.visitInsn(Opcodes.ICONST_0);
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/concurrent/atomic/AtomicIntegerArray", "getAndSet",
            "(II)I");
    mv.visitInsn(Opcodes.IASTORE);
    mv.visitIincInsn(1, 1);
    mv.visitLabel(l3);
    mv.visitVarInsn(Opcodes.ILOAD, 1);
    mv.visitFieldInsn(Opcodes.GETSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME,
            COBERTURA_COUNTERS_FIELD_TYPE);
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/util/concurrent/atomic/AtomicIntegerArray", "length",
            "()I");
    mv.visitJumpInsn(Opcodes.IF_ICMPLT, l4);
    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitInsn(Opcodes.ARETURN);
    mv.visitMaxs(0, 0);//will be recalculated by writer
    mv.visitEnd();
}

From source file:net.sourceforge.cobertura.instrument.pass3.FastArrayCodeProvider.java

License:GNU General Public License

public void generateCINITmethod(MethodVisitor mv, String className, int counters_cnt) {
    mv.visitFieldInsn(Opcodes.GETSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME,
            COBERTURA_COUNTERS_FIELD_TYPE);
    Label l1 = new Label();
    mv.visitJumpInsn(Opcodes.IFNONNULL, l1);
    mv.visitLdcInsn(counters_cnt);//from ww w  .ja va2  s. c  o m
    mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_INT);
    mv.visitFieldInsn(Opcodes.PUTSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME,
            COBERTURA_COUNTERS_FIELD_TYPE);
    generateRegisterClass(mv, className);
    mv.visitLabel(l1);
}

From source file:net.sourceforge.cobertura.instrument.pass3.TestUnitCodeProvider.java

License:GNU General Public License

/**
 * Generates:// ww  w . j  av  a 2s  .c  om
 *   public static void __cobertura_init()
 *   {
 *     if (__cobertura_counters == null)
 *       {
 *         __cobertura_counters = new TestUnitInformationHolder[class.length];
 *       }
 *       TouchCollector.registerClass("mypackage/HelloWorld");
 *   }
 */
public void generateCINITmethod(MethodVisitor mv, String className, int counters_cnt) {
    mv.visitFieldInsn(Opcodes.GETSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME,
            COBERTURA_COUNTERS_FIELD_TYPE);
    Label l1 = new Label();
    mv.visitJumpInsn(Opcodes.IFNONNULL, l1);
    mv.visitLdcInsn(counters_cnt);
    mv.visitTypeInsn(Opcodes.ANEWARRAY, Type.getInternalName(TestUnitInformationHolder.class));
    mv.visitFieldInsn(Opcodes.PUTSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME,
            COBERTURA_COUNTERS_FIELD_TYPE);

    mv.visitInsn(ICONST_0);
    mv.visitVarInsn(ISTORE, 1);
    Label l11 = new Label();
    mv.visitLabel(l11);
    Label l2 = new Label();
    mv.visitJumpInsn(GOTO, l2);
    Label l3 = new Label();
    mv.visitLabel(l3);
    mv.visitLineNumber(24, l3);
    mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] { Opcodes.INTEGER }, 0, null);
    mv.visitFieldInsn(GETSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE);
    mv.visitVarInsn(ILOAD, 1);
    mv.visitTypeInsn(NEW, "net/sourceforge/cobertura/coveragedata/TestUnitInformationHolder");
    mv.visitInsn(DUP);
    mv.visitMethodInsn(INVOKESPECIAL, "net/sourceforge/cobertura/coveragedata/TestUnitInformationHolder",
            "<init>", "()V");
    mv.visitInsn(AASTORE);
    Label l4 = new Label();
    mv.visitLabel(l4);
    mv.visitLineNumber(23, l4);
    mv.visitIincInsn(1, 1);
    mv.visitLabel(l2);
    mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
    mv.visitVarInsn(ILOAD, 1);
    mv.visitFieldInsn(GETSTATIC, className, COBERTURA_COUNTERS_FIELD_NAME, COBERTURA_COUNTERS_FIELD_TYPE);
    mv.visitInsn(ARRAYLENGTH);
    mv.visitJumpInsn(IF_ICMPLT, l3);

    mv.visitLabel(l1);

    generateRegisterClass(mv, className);
}

From source file:net.wpm.reflectasm.ClassAccess.java

License:Open Source License

private static void insertNewInstance(ClassWriter cw, String classNameInternal, ClassInfo info) {
    MethodVisitor mv;
    mv = cw.visitMethod(ACC_PUBLIC + ACC_VARARGS, "newInstance", "(I[Ljava/lang/Object;)Ljava/lang/Object;",
            null, null);//www.j a va  2s  .  c om
    mv.visitCode();

    int n = info.constructorModifiers.length;

    if (n != 0) {
        mv.visitVarInsn(ILOAD, 1);
        Label[] labels = new Label[n];
        for (int i = 0; i < n; i++)
            labels[i] = new Label();
        Label defaultLabel = new Label();
        mv.visitTableSwitchInsn(0, labels.length - 1, defaultLabel, labels);

        StringBuilder buffer = new StringBuilder(128);
        for (int i = 0; i < n; i++) {
            mv.visitLabel(labels[i]);
            if (i == 0)
                mv.visitFrame(Opcodes.F_APPEND, 1, new Object[] { classNameInternal }, 0, null);
            else
                mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);

            mv.visitTypeInsn(NEW, classNameInternal);
            mv.visitInsn(DUP);

            buffer.setLength(0);
            buffer.append('(');

            Class<?>[] paramTypes = info.constructorParameterTypes[i];
            for (int paramIndex = 0; paramIndex < paramTypes.length; paramIndex++) {
                mv.visitVarInsn(ALOAD, 2);
                mv.visitIntInsn(BIPUSH, paramIndex);
                mv.visitInsn(AALOAD);
                Type paramType = Type.getType(paramTypes[paramIndex]);
                unbox(mv, paramType);
                buffer.append(paramType.getDescriptor());
            }
            buffer.append(")V");
            mv.visitMethodInsn(INVOKESPECIAL, classNameInternal, "<init>", buffer.toString(), false);
            mv.visitInsn(ARETURN);
        }
        mv.visitLabel(defaultLabel);
        mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
    }
    mv.visitTypeInsn(NEW, "java/lang/IllegalArgumentException");
    mv.visitInsn(DUP);
    mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
    mv.visitInsn(DUP);
    mv.visitLdcInsn("Constructor not found: ");
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V", false);
    mv.visitVarInsn(ILOAD, 1);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(I)Ljava/lang/StringBuilder;",
            false);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/IllegalArgumentException", "<init>", "(Ljava/lang/String;)V",
            false);
    mv.visitInsn(ATHROW);
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}