Example usage for org.objectweb.asm MethodVisitor visitVarInsn

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

Introduction

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

Prototype

public void visitVarInsn(final int opcode, final int var) 

Source Link

Document

Visits a local variable instruction.

Usage

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