Example usage for org.objectweb.asm MethodVisitor visitCode

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

Introduction

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

Prototype

public void visitCode() 

Source Link

Document

Starts the visit of the method's code, if any (i.e.

Usage

From source file:net.openhft.smoothie.SegmentClassGenerator.java

License:Open Source License

private static byte[] classBytes(String segmentClassName, int allocationCapacity) {
    ClassWriter cw = new ClassWriter(0);
    String segmentClassNameWithSlashes = segmentClassName.replace('.', '/');
    cw.visit(52, ACC_PUBLIC + ACC_SUPER, segmentClassNameWithSlashes + allocationCapacity, null,
            segmentClassNameWithSlashes, null);

    for (int i = 1; i < allocationCapacity; i++) {
        FieldVisitor fv;/*from ww w.j ava2s.  c om*/
        fv = cw.visitField(0, "k" + i, "Ljava/lang/Object;", null, null);
        fv.visitEnd();
        fv = cw.visitField(0, "v" + i, "Ljava/lang/Object;", null, null);
        fv.visitEnd();
    }
    {
        MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, segmentClassNameWithSlashes, "<init>", "()V", false);
        mv.visitInsn(RETURN);
        mv.visitMaxs(1, 1);
        mv.visitEnd();
    }
    cw.visitEnd();

    return cw.toByteArray();
}

From source file:net.orfjackal.dimdwarf.aop.AddEqualsAndHashCodeMethodsForEntities.java

License:Open Source License

private void addEqualsMethod() {
    MethodVisitor mv = cv.visitMethod(ACC_PUBLIC, "equals", "(Ljava/lang/Object;)Z", null, null);
    mv.visitCode();
    mv.visitVarInsn(ALOAD, 0);/*from w  w  w. j  a  v  a2s  . c o m*/
    mv.visitVarInsn(ALOAD, 1);
    mv.visitMethodInsn(INVOKESTATIC, entityHelperClass, "equals", "(Ljava/lang/Object;Ljava/lang/Object;)Z");
    mv.visitInsn(IRETURN);
    mv.visitMaxs(2, 2);
    mv.visitEnd();
}

From source file:net.orfjackal.dimdwarf.aop.AddEqualsAndHashCodeMethodsForEntities.java

License:Open Source License

private void addHashCodeMethod() {
    MethodVisitor mv = cv.visitMethod(ACC_PUBLIC, "hashCode", "()I", null, null);
    mv.visitCode();
    mv.visitVarInsn(ALOAD, 0);/*from   w  ww  . j  a v a  2s .  c  o m*/
    mv.visitMethodInsn(INVOKESTATIC, entityHelperClass, "hashCode", "(Ljava/lang/Object;)I");
    mv.visitInsn(IRETURN);
    mv.visitMaxs(1, 1);
    mv.visitEnd();
}

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();//  w w w  . j  a  va 2s  . c  o m

    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   w w  w .j  a v  a 2s  . 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();

    // 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);//from  w w  w  .ja va 2  s .c  o  m
    }

    // 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  2 s.  co  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();
    mv.visitVarInsn(ALOAD, 0);/*from   w  w  w.j av  a 2  s .  co m*/
    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 buildObjectAccessor(ClassWriter cw, Class cls) {
    MethodVisitor mv;

    if (fDebugEn) {
        debug("--> buildAccessor cls=" + cls.getName());
    }/*w ww.  j a va2 s  .c  o  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());
    }
}

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());
    }//from   w  ww .j a  va  2s .c  om

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