List of usage examples for org.objectweb.asm MethodVisitor visitCode
public void visitCode()
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()); } }