List of usage examples for org.objectweb.asm MethodVisitor visitVarInsn
public void visitVarInsn(final int opcode, final int var)
From source file:fr.insalyon.citi.golo.compiler.JavaBytecodeUnionGenerator.java
License:Apache License
private void makeHashCode(ClassWriter cw, Union.Value value) { MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "hashCode", "()I", null, null); mv.visitCode();/* w w w . j av a 2s .c o m*/ loadInteger(mv, value.getMembers().size()); mv.visitTypeInsn(ANEWARRAY, "java/lang/Object"); int i = 0; for (String member : value.getMembers()) { mv.visitInsn(DUP); loadInteger(mv, i); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, value.getPackageAndClass().toJVMType(), member, "Ljava/lang/Object;"); mv.visitInsn(AASTORE); } mv.visitMethodInsn(INVOKESTATIC, "java/util/Objects", "hash", "([Ljava/lang/Object;)I", false); mv.visitInsn(IRETURN); mv.visitMaxs(0, 0); mv.visitEnd(); }
From source file:fr.insalyon.citi.golo.compiler.JavaBytecodeUnionGenerator.java
License:Apache License
private void makeValuedConstructor(ClassWriter cw, Union.Value value) { MethodVisitor mv = cw.visitMethod(ACC_PROTECTED, "<init>", argsSignature(value.getMembers().size()) + "V", null, null);//from www . j a v a 2 s . c o m mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, value.getUnion().getPackageAndClass().toJVMType(), "<init>", "()V", false); int idx = 1; for (String member : value.getMembers()) { mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, idx++); mv.visitFieldInsn(PUTFIELD, value.getPackageAndClass().toJVMType(), member, "Ljava/lang/Object;"); } mv.visitInsn(RETURN); mv.visitMaxs(0, 0); mv.visitEnd(); }
From source file:fr.insalyon.citi.golo.runtime.adapters.JavaBytecodeAdapterGenerator.java
License:Apache License
private void makeFrontendOverrides(ClassWriter classWriter, AdapterDefinition adapterDefinition) { for (Method method : getAllVirtualMethods(adapterDefinition)) { int access = isPublic(method.getModifiers()) ? ACC_PUBLIC : ACC_PROTECTED; if (method.isVarArgs()) { access = access & ACC_VARARGS; }/* ww w.j a va 2 s . c om*/ String name = method.getName(); String descriptor = Type.getMethodDescriptor(method); Class<?>[] exceptionTypes = method.getExceptionTypes(); String[] exceptions = new String[exceptionTypes.length]; for (int i = 0; i < exceptionTypes.length; i++) { exceptions[i] = Type.getInternalName(exceptionTypes[i]); } MethodVisitor methodVisitor = classWriter.visitMethod(access, name, descriptor, null, exceptions); methodVisitor.visitCode(); Class<?>[] parameterTypes = method.getParameterTypes(); Type[] indyTypes = new Type[parameterTypes.length + 1]; indyTypes[0] = Type.getType(Object.class); methodVisitor.visitVarInsn(ALOAD, 0); int argIndex = 1; for (int i = 0; i < parameterTypes.length; i++) { argIndex = loadArgument(methodVisitor, parameterTypes[i], argIndex); indyTypes[i + 1] = Type.getType(parameterTypes[i]); } methodVisitor.visitInvokeDynamicInsn(method.getName(), Type.getMethodDescriptor(Type.getReturnType(method), indyTypes), ADAPTER_HANDLE); makeReturn(methodVisitor, method.getReturnType()); methodVisitor.visitMaxs(0, 0); methodVisitor.visitEnd(); } }
From source file:fr.insalyon.citi.golo.runtime.adapters.JavaBytecodeAdapterGenerator.java
License:Apache License
private void makeConstructors(ClassWriter classWriter, AdapterDefinition adapterDefinition) { try {/*w w w . j a v a2 s .com*/ Class<?> parentClass = Class.forName(adapterDefinition.getParent(), true, adapterDefinition.getClassLoader()); for (Constructor constructor : parentClass.getDeclaredConstructors()) { if (Modifier.isPublic(constructor.getModifiers()) || Modifier.isProtected(constructor.getModifiers())) { Class[] parameterTypes = constructor.getParameterTypes(); Type[] adapterParameterTypes = new Type[parameterTypes.length + 1]; adapterParameterTypes[0] = Type.getType(AdapterDefinition.class); for (int i = 1; i < adapterParameterTypes.length; i++) { adapterParameterTypes[i] = Type.getType(parameterTypes[i - 1]); } String descriptor = Type.getMethodDescriptor(Type.VOID_TYPE, adapterParameterTypes); MethodVisitor methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", descriptor, null, null); methodVisitor.visitCode(); methodVisitor.visitVarInsn(ALOAD, 0); methodVisitor.visitVarInsn(ALOAD, 1); methodVisitor.visitFieldInsn(PUTFIELD, jvmType(adapterDefinition.getName()), DEFINITION_FIELD, "Lfr/insalyon/citi/golo/runtime/adapters/AdapterDefinition;"); methodVisitor.visitVarInsn(ALOAD, 0); int argIndex = 2; for (Class parameterType : parameterTypes) { argIndex = loadArgument(methodVisitor, parameterType, argIndex); } methodVisitor.visitMethodInsn(INVOKESPECIAL, Type.getInternalName(parentClass), "<init>", Type.getConstructorDescriptor(constructor)); methodVisitor.visitInsn(RETURN); methodVisitor.visitMaxs(0, 0); methodVisitor.visitEnd(); } } } catch (ClassNotFoundException e) { throw new RuntimeException(e); } }
From source file:fr.insalyon.citi.golo.runtime.adapters.JavaBytecodeAdapterGenerator.java
License:Apache License
private int loadArgument(MethodVisitor methodVisitor, Class<?> type, int index) { if (type.isPrimitive()) { if (type == Integer.TYPE) { methodVisitor.visitVarInsn(ILOAD, index); return index + 1; } else if (type == Boolean.TYPE) { methodVisitor.visitVarInsn(ILOAD, index); return index + 1; } else if (type == Byte.TYPE) { methodVisitor.visitVarInsn(ILOAD, index); return index + 1; } else if (type == Character.TYPE) { methodVisitor.visitVarInsn(ILOAD, index); return index + 1; } else if (type == Short.TYPE) { methodVisitor.visitVarInsn(ILOAD, index); return index + 1; } else if (type == Double.TYPE) { methodVisitor.visitVarInsn(DLOAD, index); return index + 2; } else if (type == Float.TYPE) { methodVisitor.visitVarInsn(FLOAD, index); return index + 1; } else {/* w w w. ja v a 2 s .co m*/ methodVisitor.visitVarInsn(LLOAD, index); return index + 2; } } else { methodVisitor.visitVarInsn(ALOAD, index); return index + 1; } }
From source file:fr.liglab.adele.cilia.dependency.ProxyGenerator.java
License:Apache License
/** * Generates a delegated method./*from ww w.j ava 2s . co m*/ * * @param cw the class writer * @param method the method object to delegate * @param className the generated class name * @param itfName the internal specification class name */ private static void generateDelegator(ClassWriter cw, Method method, String className, String itfName) { String methodName = method.getName(); String desc = Type.getMethodDescriptor(method); String[] exceptions = getInternalClassNames(method.getExceptionTypes()); int modifiers = method.getModifiers() & ~(Modifier.ABSTRACT | Modifier.NATIVE | Modifier.SYNCHRONIZED); Type[] types = Type.getArgumentTypes(method); int freeRoom = 1; for (int t = 0; t < types.length; t++) { freeRoom = freeRoom + types[t].getSize(); } MethodVisitor mv = cw.visitMethod(modifiers, methodName, desc, null, exceptions); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, className, DEPENDENCY, DEPENDENCY_DESC); // The dependency is on the stack. mv.visitMethodInsn(INVOKEVIRTUAL, DEPENDENCY_INTERNAL_NAME, "getService", // Call getService "()Ljava/lang/Object;"); // The service object is on the stack. int varSvc = freeRoom; freeRoom = freeRoom + 1; // Object Reference. mv.visitVarInsn(ASTORE, varSvc); // Store the service object. Label notNull = new Label(); Label isNull = new Label(); mv.visitVarInsn(ALOAD, varSvc); // Load the service mv.visitJumpInsn(IFNONNULL, notNull); // If not null go to not null // Null branch - throw the exception mv.visitLabel(isNull); mv.visitTypeInsn(NEW, "java/lang/RuntimeException"); mv.visitInsn(DUP); mv.visitLdcInsn("No service available"); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/String;)V"); mv.visitInsn(ATHROW); // End of the null branch // Not null, go one the execution mv.visitLabel(notNull); // Invoke the method on the service object. mv.visitVarInsn(ALOAD, varSvc); // Push argument on the stack. int i = 1; // Arguments. (non static method) for (int t = 0; t < types.length; t++) { mv.visitVarInsn(types[t].getOpcode(ILOAD), i); i = i + types[t].getSize(); } // Invocation mv.visitMethodInsn(INVOKEINTERFACE, itfName, methodName, desc); // Return the result Type returnType = Type.getReturnType(desc); if (returnType.getSort() != Type.VOID) { mv.visitInsn(returnType.getOpcode(IRETURN)); } else { mv.visitInsn(RETURN); } // End of the method. mv.visitMaxs(0, 0); mv.visitEnd(); }
From source file:fr.liglab.adele.cilia.dependency.ProxyGenerator.java
License:Apache License
/** * Generates the constructors. The constructor receives a dependency * and set the {@link ProxyGenerator#DEPENDENCY} field. * * @param cw the class writer//from ww w. j av a 2 s.c o m * @param className the generated class name. */ private static void generateConstructor(ClassWriter cw, String className, String parent) { MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", '(' + DEPENDENCY_DESC + ")V", null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); // Load this mv.visitInsn(DUP); // Dup mv.visitMethodInsn(INVOKESPECIAL, parent, "<init>", "()V"); // Call super mv.visitVarInsn(ALOAD, 1); // Load the argument mv.visitFieldInsn(PUTFIELD, className, DEPENDENCY, DEPENDENCY_DESC); // Assign the dependency field mv.visitInsn(RETURN); // Return void mv.visitMaxs(0, 0); mv.visitEnd(); }
From source file:global.namespace.neuron.di.internal.ProxyClassVisitor.java
License:Apache License
private void insertConstructor() { final MethodVisitor mv = cv.visitMethod(ACC_PRIVATE_SYNTHETIC, CONSTRUCTOR_NAME, ACCEPTS_NOTHING_AND_RETURNS_VOID_DESC, null, null); mv.visitCode();//from w w w. j a v a2 s . co m mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, superName, CONSTRUCTOR_NAME, ACCEPTS_NOTHING_AND_RETURNS_VOID_DESC, false); for (final Method method : bindableMethods) { if (0 == (method.getModifiers() & ACC_ABSTRACT)) { final Class<?> declaringClass = method.getDeclaringClass(); final boolean isInterface = declaringClass.isInterface(); final String owner = getInternalName(declaringClass); final String name = method.getName(); final String desc = getMethodDescriptor(method); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 0); mv.visitInvokeDynamicInsn("get", "(" + proxyDesc + ")" + dependencyProviderDesc, metaFactoryHandle, acceptsNothingAndReturnsObjectType, new Handle(H_INVOKESPECIAL, owner, name, desc, isInterface), acceptsNothingAndReturnsObjectType); mv.visitFieldInsn(PUTFIELD, proxyName, name + PROVIDER, dependencyProviderDesc); } } mv.visitInsn(RETURN); mv.visitMaxs(-1, -1); mv.visitEnd(); }
From source file:global.namespace.neuron.di.internal.ProxyClassVisitor.java
License:Apache License
private void insertMethods() { for (final Method method : bindableMethods) { new Object() { final int access = method.getModifiers() & ~ACC_ABSTRACT_NATIVE | ACC_SYNTHETIC; final String name = method.getName(); final String desc = getMethodDescriptor(method); final Class<?> returnType = method.getReturnType(); final String returnTypeName = getInternalName(returnType); final String returnTypeDesc = getDescriptor(returnType); final Class<?> boxedReturnType = boxed(returnType); final String boxedReturnTypeName = getInternalName(boxedReturnType); final String boxedReturnTypeDesc = getDescriptor(boxedReturnType); final int returnOpCode = returnOpCode(method); {// w w w .j a v a2 s. co m generateProxyField(); generateProxyCallMethod(); } void generateProxyField() { cv.visitField(ACC_PRIVATE_SYNTHETIC, name + PROVIDER, dependencyProviderDesc, null, null) .visitEnd(); } void generateProxyCallMethod() { final MethodVisitor mv = beginMethod(name); mv.visitFieldInsn(GETFIELD, proxyName, name + PROVIDER, dependencyProviderDesc); mv.visitMethodInsn(INVOKEINTERFACE, dependencyProviderName, "get", ACCEPTS_NOTHING_AND_RETURNS_OBJECT_DESC, true); if (!boxedReturnType.isAssignableFrom(Object.class)) { mv.visitTypeInsn(CHECKCAST, boxedReturnType.isArray() ? boxedReturnTypeDesc : boxedReturnTypeName); } if (boxedReturnType != returnType) { assert !returnType.isArray(); mv.visitMethodInsn(INVOKEVIRTUAL, boxedReturnTypeName, returnTypeName.concat("Value"), "()".concat(returnTypeDesc), false); } endMethod(mv); } MethodVisitor beginMethod(final String name) { final MethodVisitor mv = cv.visitMethod(access, name, desc, null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); return mv; } void endMethod(final MethodVisitor mv) { mv.visitInsn(returnOpCode); mv.visitMaxs(-1, -1); mv.visitEnd(); } }; } }
From source file:gnu.classpath.tools.rmic.ClassRmicCompiler.java
License:Open Source License
private static void generateClassForNamer(ClassVisitor cls) { MethodVisitor cv = cls.visitMethod(Opcodes.ACC_PRIVATE + Opcodes.ACC_STATIC + Opcodes.ACC_SYNTHETIC, forName,//from w ww .j a v a2 s .c o m Type.getMethodDescriptor(Type.getType(Class.class), new Type[] { Type.getType(String.class) }), null, null); Label start = new Label(); cv.visitLabel(start); cv.visitVarInsn(Opcodes.ALOAD, 0); cv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(Class.class), "forName", Type.getMethodDescriptor(Type.getType(Class.class), new Type[] { Type.getType(String.class) })); cv.visitInsn(Opcodes.ARETURN); Label handler = new Label(); cv.visitLabel(handler); cv.visitVarInsn(Opcodes.ASTORE, 1); cv.visitTypeInsn(Opcodes.NEW, typeArg(NoClassDefFoundError.class)); cv.visitInsn(Opcodes.DUP); cv.visitVarInsn(Opcodes.ALOAD, 1); cv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, Type.getInternalName(ClassNotFoundException.class), "getMessage", Type.getMethodDescriptor(Type.getType(String.class), new Type[] {})); cv.visitMethodInsn(Opcodes.INVOKESPECIAL, Type.getInternalName(NoClassDefFoundError.class), "<init>", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] { Type.getType(String.class) })); cv.visitInsn(Opcodes.ATHROW); cv.visitTryCatchBlock(start, handler, handler, Type.getInternalName(ClassNotFoundException.class)); cv.visitMaxs(-1, -1); }