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