Example usage for org.objectweb.asm MethodVisitor visitMaxs

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

Introduction

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

Prototype

public void visitMaxs(final int maxStack, final int maxLocals) 

Source Link

Document

Visits the maximum stack size and the maximum number of local variables of the method.

Usage

From source file:net.sf.cglib.proxy.TestEnhancer.java

License:Apache License

public void testBridgeParameterCheckcast() throws Exception {

    // If the compiler used for Z omits the bridge method, and X is compiled with javac,
    // javac will generate an invokespecial bridge in X.

    // public interface I<A, B> {
    //   public A f(B b);
    // }// w w w.j  a v a2s.  c o  m
    // public abstract class Z<U extends Number> implements I<U, Long> {
    //   public U f(Long id) {
    //     return null;
    //   }
    // }
    // public class X extends Z<Integer> {}

    final Map<String, byte[]> classes = new HashMap<String, byte[]>();

    {
        ClassWriter cw = new ClassWriter(0);
        cw.visit(49, Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT | Opcodes.ACC_INTERFACE, "I",
                "<A:Ljava/lang/Object;B:Ljava/lang/Object;>Ljava/lang/Object;", "java/lang/Object", null);
        {
            MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT, "f",
                    "(Ljava/lang/Object;)Ljava/lang/Object;", "(TB;)TA;", null);
            mv.visitEnd();
        }
        cw.visitEnd();
        classes.put("I.class", cw.toByteArray());
    }
    {
        ClassWriter cw = new ClassWriter(0);
        cw.visit(49, Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER | Opcodes.ACC_ABSTRACT, "Z",
                "<U:Ljava/lang/Number;>Ljava/lang/Object;LI<TU;Ljava/lang/String;>;", "java/lang/Object",
                new String[] { "I" });
        {
            MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
            mv.visitCode();
            mv.visitVarInsn(Opcodes.ALOAD, 0);
            mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
            mv.visitInsn(Opcodes.RETURN);
            mv.visitMaxs(1, 1);
            mv.visitEnd();
        }
        {
            MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "f", "(Ljava/lang/String;)Ljava/lang/Number;",
                    "(Ljava/lang/String;)TU;", null);
            mv.visitCode();
            mv.visitInsn(Opcodes.ACONST_NULL);
            mv.visitInsn(Opcodes.ARETURN);
            mv.visitMaxs(1, 2);
            mv.visitEnd();
        }
        cw.visitEnd();
        classes.put("Z.class", cw.toByteArray());
    }
    {
        ClassWriter cw = new ClassWriter(0);
        cw.visit(49, Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER, "X", "LZ<Ljava/lang/Integer;>;", "Z", null);
        {
            MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
            mv.visitCode();
            mv.visitVarInsn(Opcodes.ALOAD, 0);
            mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "Z", "<init>", "()V", false);
            mv.visitInsn(Opcodes.RETURN);
            mv.visitMaxs(1, 1);
            mv.visitEnd();
        }
        {
            MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_BRIDGE | Opcodes.ACC_SYNTHETIC,
                    "f", "(Ljava/lang/Object;)Ljava/lang/Object;", null, null);
            mv.visitCode();
            mv.visitVarInsn(Opcodes.ALOAD, 0);
            mv.visitVarInsn(Opcodes.ALOAD, 1);
            mv.visitTypeInsn(Opcodes.CHECKCAST, "java/lang/String");
            mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "Z", "f", "(Ljava/lang/String;)Ljava/lang/Number;",
                    false);
            mv.visitInsn(Opcodes.ARETURN);
            mv.visitMaxs(2, 2);
            mv.visitEnd();
        }

        cw.visitEnd();

        classes.put("X.class", cw.toByteArray());
    }

    ClassLoader classLoader = new ClassLoader(getClass().getClassLoader()) {
        @Override
        public InputStream getResourceAsStream(String name) {
            InputStream is = super.getResourceAsStream(name);
            if (is != null) {
                return is;
            }
            if (classes.containsKey(name)) {
                return new ByteArrayInputStream(classes.get(name));
            }
            return null;
        }

        public Class findClass(String name) throws ClassNotFoundException {
            byte[] ba = classes.get(name.replace('.', '/') + ".class");
            if (ba != null) {
                return defineClass(name, ba, 0, ba.length);
            }
            throw new ClassNotFoundException(name);
        }
    };

    List<Class> retTypes = new ArrayList<Class>();
    List<Class> paramTypes = new ArrayList<Class>();
    Interceptor interceptor = new Interceptor(retTypes, paramTypes);

    Enhancer e = new Enhancer();
    e.setClassLoader(classLoader);
    e.setSuperclass(classLoader.loadClass("X"));
    e.setCallback(interceptor);

    Object c = e.create();

    for (Method m : c.getClass().getDeclaredMethods()) {
        if (m.getName().equals("f") && m.getReturnType().equals(Object.class)) {
            m.invoke(c, new Object[] { null });
        }
    }

    // f(Object)Object should bridge to f(Number)String
    assertEquals(Arrays.asList(Object.class, Number.class), retTypes);
    assertEquals(Arrays.asList(Object.class, String.class), paramTypes);
}

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

License:Open Source License

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

    cw.visit(Opcodes.V1_5, ACC_PROTECTED + ACC_PUBLIC + ACC_SUPER, full_classname, null, fBaseClass, null);
    cw.visitSource(classname + ".java", null);

    MethodVisitor mv;

    // Constructor
    mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
    mv.visitCode();//from  w ww  .jav  a2 s  .  c o m
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, fBaseClass, "<init>", "()V");
    mv.visitInsn(RETURN);
    mv.visitMaxs(1, 1);
    mv.visitEnd();

    buildItemDispatchMethods(cw);
    buildObjectDispatchMethods(cw);
}

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 .j  av a  2  s. c om

    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 ww .ja v 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.sf.sveditor.core.db.persistence.JITPersistenceDelegateFactory.java

License:Open Source License

private void buildObjectAccessor(ClassWriter cw, Class cls) {
    MethodVisitor mv;

    if (fDebugEn) {
        debug("--> buildAccessor cls=" + cls.getName());
    }/*from   w  ww  .  j a v a2  s .c  om*/

    // Constructor
    String tgt_clsname = getClassName(cls);
    String cls_name = getClassLeafName(cls);

    // Read method
    //
    // 0 - this
    // 1 - parent
    // 2 - object
    mv = cw.visitMethod(ACC_PRIVATE, "read" + cls_name, "(L" + fChildItem + ";" + "L" + tgt_clsname + ";)V",
            null, new String[] { fDBFormatException });
    mv.visitCode();
    visit(false, tgt_clsname, mv, cls);
    mv.visitInsn(RETURN);
    mv.visitMaxs(3, 3);
    mv.visitEnd();

    // Write method
    //
    // 0 - this
    // 1 - object
    mv = cw.visitMethod(ACC_PRIVATE, "write" + cls_name,
            // "(L" + tgt_clsname + ";)V",
            "(L" + tgt_clsname + ";)V", null, new String[] { fDBWriteException });
    mv.visitCode();
    visit(true, tgt_clsname, mv, cls);
    mv.visitInsn(RETURN);
    mv.visitMaxs(3, 3);
    mv.visitEnd();

    if (fDebugEn) {
        debug("<-- buildAccessor cls=" + cls.getName());
    }
}

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

License:Open Source License

private void buildItemAccessor(ClassWriter cw, SVDBItemType t, Class cls) {
    MethodVisitor mv;

    if (fDebugEn) {
        debug("--> buildAccessor t=" + t.name() + " cls=" + cls.getName());
    }// w  w w .  j a  v  a2 s.  c  o m

    // Constructor
    String item_name = t.name();
    String tgt_clsname = getClassName(cls);

    // Read method
    //
    // 0 - this
    // 1 - parent
    // 2 - object
    mv = cw.visitMethod(ACC_PRIVATE, "read" + item_name, "(L" + fChildItem + ";)L" + tgt_clsname + ";", null,
            new String[] { fDBFormatException });
    mv.visitCode();
    mv.visitTypeInsn(NEW, tgt_clsname); // Create a new class instance
    mv.visitInsn(DUP); // Duplicate handle. One will be consumed by the init call
    mv.visitMethodInsn(INVOKESPECIAL, tgt_clsname, "<init>", "()V");
    //      mv.visitInsn(DUP);               // Duplicate. One will be consumed by store to obj-var
    mv.visitVarInsn(ASTORE, READ_OBJ_VAR); // Store handle to obj-var 
    //      mv.visitVarInsn(ALOAD, THIS_VAR);
    //      mv.visitVarInsn(ALOAD, READ_OBJ_VAR);
    //      mv.visitMethodInsn(INVOKESPECIAL, tgt_clsname, "<init>", "()V");
    //      mv.visit
    //      mv.visitInsn(ACONST_NULL);
    //      mv.visitVarInsn(ASTORE, READ_OBJ_VAR); // Initialize return 
    visit(false, tgt_clsname, mv, cls);
    mv.visitVarInsn(ALOAD, READ_OBJ_VAR); // Setup for return of var0
    mv.visitInsn(ARETURN);
    mv.visitMaxs(3, 3);
    mv.visitEnd();

    // Write method
    //
    // 0 - this
    // 1 - object
    mv = cw.visitMethod(ACC_PRIVATE, "write" + item_name,
            // "(L" + tgt_clsname + ";)V",
            "(L" + tgt_clsname + ";)V", null, new String[] { fDBWriteException });
    mv.visitCode();
    visit(true, tgt_clsname, mv, cls);
    mv.visitInsn(RETURN);
    mv.visitMaxs(3, 3);
    mv.visitEnd();

    if (fDebugEn) {
        debug("<-- buildAccessor t=" + t + " cls=" + cls.getName());
    }
}

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

License:GNU General Public License

/**
 * {@inheritDoc}<br/><br/>// www.j a v a  2  s .  c  om
 * <p/>
 * Generates method (named  {@link #COBERTURA_CLASSMAP_METHOD_NAME}) with such a signature:
 * __cobertura_classmap( {@link LightClassmapListener} listener).</br>
 * <p/>
 * The method informs the listener about all lines, jumps and switches found, and about all counters tracking
 * the constructions.
 */
public void generateCoberturaClassMapMethod(ClassVisitor cv, ClassMap classMap) {

    LinkedList<TouchPointDescriptor> touchPointDescriptors = new LinkedList<TouchPointDescriptor>(
            classMap.getTouchPointsInLineOrder());
    int parts = 0;
    for (int j = 0; touchPointDescriptors.size() > 0; j++) {
        List<TouchPointDescriptor> bufor = new LinkedList<TouchPointDescriptor>();
        for (int i = 0; i < 1000 && touchPointDescriptors.size() > 0; i++) {
            bufor.add(touchPointDescriptors.removeFirst());
        }
        classMapContent(cv, j, bufor);
        parts++;
    }

    MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, COBERTURA_CLASSMAP_METHOD_NAME,
            "(" + Type.getType(LightClassmapListener.class).toString() + ")V", null, null);
    mv.visitCode();
    mv.visitVarInsn(Opcodes.ALOAD, 0);

    mv.visitInsn(Opcodes.DUP);
    mv.visitLdcInsn(classMap.getClassName());
    mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, CLASSMAP_LISTENER_INTERNALNAME, "setClazz",
            "(Ljava/lang/String;)V");

    if (classMap.getSource() != null) {
        mv.visitInsn(Opcodes.DUP);
        mv.visitLdcInsn(classMap.getSource());
        mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, CLASSMAP_LISTENER_INTERNALNAME, "setSource",
                "(Ljava/lang/String;)V");
    }

    for (int i = 0; i < parts; i++) {
        mv.visitInsn(Opcodes.DUP);
        mv.visitMethodInsn(Opcodes.INVOKESTATIC, classMap.getClassName(),
                COBERTURA_CLASSMAP_METHOD_NAME + "_" + i,
                "(" + Type.getType(LightClassmapListener.class).toString() + ")V");
    }

    mv.visitInsn(Opcodes.POP);
    mv.visitInsn(Opcodes.RETURN);
    mv.visitMaxs(0, 0);//will be recalculated by writer
    mv.visitEnd();
}

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

License:GNU General Public License

private void classMapContent(ClassVisitor cv, int nr, List<TouchPointDescriptor> touchPointDescriptors) {
    MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC,
            COBERTURA_CLASSMAP_METHOD_NAME + "_" + nr,
            "(" + Type.getType(LightClassmapListener.class).toString() + ")V", null, null);
    mv.visitCode();/*  w  w w  .  j ava  2  s  .c o  m*/
    mv.visitVarInsn(Opcodes.ALOAD, 0);
    for (TouchPointDescriptor tpd : touchPointDescriptors) {
        mv.visitInsn(Opcodes.DUP);
        mv.visitLdcInsn(tpd.getLineNumber());
        if (tpd instanceof LineTouchPointDescriptor) {
            mv.visitLdcInsn(((LineTouchPointDescriptor) tpd).getCounterId());
            mv.visitLdcInsn(((LineTouchPointDescriptor) tpd).getMethodName());
            mv.visitLdcInsn(((LineTouchPointDescriptor) tpd).getMethodSignature());
            mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, CLASSMAP_LISTENER_INTERNALNAME, "putLineTouchPoint",
                    "(IILjava/lang/String;Ljava/lang/String;)V");
        } else if (tpd instanceof JumpTouchPointDescriptor) {
            mv.visitLdcInsn(((JumpTouchPointDescriptor) tpd).getCounterIdForTrue());
            mv.visitLdcInsn(((JumpTouchPointDescriptor) tpd).getCounterIdForFalse());
            mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, CLASSMAP_LISTENER_INTERNALNAME, "putJumpTouchPoint",
                    "(III)V");
        } else if (tpd instanceof SwitchTouchPointDescriptor) {
            SwitchTouchPointDescriptor stpd = (SwitchTouchPointDescriptor) tpd;
            final String enum_sign = ((SwitchTouchPointDescriptor) tpd).getEnumType();
            if (enum_sign == null) {
                mv.visitLdcInsn(Integer.MAX_VALUE);
            } else {
                mv.visitMethodInsn(Opcodes.INVOKESTATIC, enum_sign, "values", "()[L" + enum_sign + ";");
                mv.visitInsn(Opcodes.ARRAYLENGTH);
            }
            Collection<Integer> ci = stpd.getCountersForLabels();
            mv.visitLdcInsn(ci.size());//Size of a new table
            mv.visitIntInsn(Opcodes.NEWARRAY, Opcodes.T_INT);
            int i = 0;
            for (Integer counterId : ci) {
                mv.visitInsn(Opcodes.DUP); //First for addition of items, second ad putSwitchTouchPoint parameter (or next loop iteration)
                mv.visitLdcInsn(i);
                mv.visitLdcInsn(counterId);
                mv.visitInsn(Opcodes.IASTORE);
                i++;
            }
            mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, CLASSMAP_LISTENER_INTERNALNAME, "putSwitchTouchPoint",
                    "(II[I)V");
        }
    }
    mv.visitInsn(Opcodes.POP);
    mv.visitInsn(Opcodes.RETURN);
    mv.visitMaxs(0, 0);//will be recalculated by writer
    mv.visitEnd();
}

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

License:GNU General Public License

public void generateCoberturaInitMethod(ClassVisitor cv, String className, int countersCnt) {
    MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, COBERTURA_INIT_METHOD_NAME,
            "()V", null, null);
    mv.visitCode();/*from  www .  ja va 2s. c o m*/
    generateCINITmethod(mv, className, countersCnt);
    mv.visitInsn(Opcodes.RETURN);
    mv.visitMaxs(0, 0); //will be recalculated by writer
    mv.visitEnd();
}

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

License:GNU General Public License

/**
 * <pre>//from ww  w  .  j  a v a  2s. 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();
}