Example usage for org.objectweb.asm MethodVisitor visitEnd

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

Introduction

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

Prototype

public void visitEnd() 

Source Link

Document

Visits the end of the method.

Usage

From source file:net.orfjackal.retrolambda.defaultmethods.InterfaceModifier.java

License:Open Source License

private void createBridge(Method meth, MethodContainer m) {
    int access = ACC_PUBLIC | ACC_STATIC | ACC_BRIDGE;
    String desc = Helpers.addParam(m.methodDesc, className);
    String returnType = Type.getReturnType(meth).getInternalName();
    desc = Helpers.changeReturnType(desc, returnType);
    MethodVisitor tmp = getHelperClassVisitor().visitMethod(access, m.methodName, desc, m.signature,
            m.exceptions);//from   w ww  .  j av  a 2  s .co  m
    tmp.visitVarInsn(ALOAD, 0);
    int i = 1;
    for (Type arg : Type.getArgumentTypes(m.methodDesc)) {
        tmp.visitVarInsn(arg.getOpcode(ILOAD), i++);
    }
    String mDesc = Helpers.addParam(m.methodDesc, className);
    tmp.visitMethodInsn(INVOKESTATIC, className + "$helper", m.methodName, mDesc, false);
    tmp.visitInsn(ARETURN);
    tmp.visitMaxs(0, 0);
    tmp.visitEnd();
}

From source file:net.orfjackal.retrolambda.defaultmethods.InterfaceModifier.java

License:Open Source License

private ClassWriter mkHelperClassVisitor() {
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    cw.visit(targetByteCode, ACC_PUBLIC + ACC_SUPER, helperClassName(), null, "java/lang/Object", null);
    MethodVisitor mv = cw.visitMethod(ACC_PRIVATE, "<init>", "()V", null, null);
    mv.visitVarInsn(ALOAD, 0);//  w w  w.j  a va  2  s .  c o m
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false);
    mv.visitInsn(RETURN);
    mv.visitMaxs(0, 0);
    mv.visitEnd();
    return cw;
}

From source file:net.orfjackal.retrolambda.lambdas.BackportLambdaClass.java

License:Open Source License

private void makeSingleton() {
    FieldVisitor fv = super.visitField(ACC_PRIVATE | ACC_STATIC | ACC_FINAL, SINGLETON_FIELD_NAME,
            singletonFieldDesc(), null, null);
    fv.visitEnd();//from  w  ww. j  a va 2  s. com

    MethodVisitor mv = super.visitMethod(ACC_STATIC, "<clinit>", "()V", null, null);
    mv.visitCode();
    mv.visitTypeInsn(NEW, lambdaClass);
    mv.visitInsn(DUP);
    mv.visitMethodInsn(INVOKESPECIAL, lambdaClass, "<init>", "()V", false);
    mv.visitFieldInsn(PUTSTATIC, lambdaClass, SINGLETON_FIELD_NAME, singletonFieldDesc());
    mv.visitInsn(RETURN);
    mv.visitMaxs(-1, -1); // rely on ClassWriter.COMPUTE_MAXS
    mv.visitEnd();
}

From source file:net.orfjackal.retrolambda.lambdas.BackportLambdaClass.java

License:Open Source License

private void generateFactoryMethod() {
    MethodVisitor mv = cv.visitMethod(ACC_PUBLIC | ACC_STATIC, factoryMethod.getName(), factoryMethod.getDesc(),
            null, null);//from ww  w .  j  a  va 2 s.c  o m
    mv.visitCode();

    if (isStateless()) {
        mv.visitFieldInsn(GETSTATIC, lambdaClass, SINGLETON_FIELD_NAME, singletonFieldDesc());
        mv.visitInsn(ARETURN);

    } else {
        mv.visitTypeInsn(NEW, lambdaClass);
        mv.visitInsn(DUP);
        int varIndex = 0;
        for (Type type : constructor.getArgumentTypes()) {
            mv.visitVarInsn(type.getOpcode(ILOAD), varIndex);
            varIndex += type.getSize();
        }
        mv.visitMethodInsn(INVOKESPECIAL, lambdaClass, "<init>", constructor.getDescriptor(), false);
        mv.visitInsn(ARETURN);
    }

    mv.visitMaxs(-1, -1); // rely on ClassWriter.COMPUTE_MAXS
    mv.visitEnd();
}

From source file:net.orfjackal.retrolambda.util.Bytecode.java

License:Open Source License

public static void generateDelegateMethod(ClassVisitor cv, int access, Handle method, Handle target) {
    MethodVisitor mv = cv.visitMethod(access, method.getName(), method.getDesc(), null, null);
    mv.visitCode();//ww  w .  j a  v  a2 s  . co  m

    // if the target method is constructor, then we must NEW up the instance inside the delegate method
    if (target.getTag() == H_NEWINVOKESPECIAL) {
        mv.visitTypeInsn(NEW, target.getOwner());
        mv.visitInsn(DUP);
    }

    // we assume one of the methods to be static and the other virtual, i.e. it has an implicit 'this' argument
    Type[] args = longest(Type.getArgumentTypes(method.getDesc()), Type.getArgumentTypes(target.getDesc()));
    int varIndex = 0;
    for (Type arg : args) {
        mv.visitVarInsn(arg.getOpcode(ILOAD), varIndex);
        varIndex += arg.getSize();
    }
    mv.visitMethodInsn(Handles.getOpcode(target), target.getOwner(), target.getName(), target.getDesc(),
            target.getTag() == H_INVOKEINTERFACE);
    mv.visitInsn(Type.getReturnType(method.getDesc()).getOpcode(IRETURN));
    mv.visitMaxs(-1, -1); // rely on ClassWriter.COMPUTE_MAXS
    mv.visitEnd();
}

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);
    // }//from   w ww .  j a  v  a  2s.  c om
    // 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 w  w  .jav a  2 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;/*from   w  w w . j  a  v  a  2s.  co  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 a  v  a  2  s  .  c om*/

    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 w  w  .ja  va 2 s .  co m

    // 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());
    }
}