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:bluejelly.runtime.ModuleLoader.java

License:BSD License

/**
 * Generate a {@link Caf} subclass for the given method information.
 * // w  ww .j av a  2  s.c  om
 * @param module    module declaring the method to process
 * @param ci        code info for the method to process
 * 
 * @return
 *   a {@link Caf} subclass whose <code>fastEnter</code> will call
 *   module.ci.getMethod() with an {@link ExecutionContext} as argument.
 */
@SuppressWarnings("unchecked")
private Class<Caf> generateCaf(Module module, CodeInfo ci) {
    String nodeName = this.genNodeName(ci);
    String cafName = Type.getInternalName(Caf.class);
    String moduleName = Type.getInternalName(module.getClass());
    String methodName = ci.getMethod().getName();

    ClassWriter cw = new ClassWriter(0);
    cw.visit(V1_6, ACC_PUBLIC + ACC_FINAL, nodeName, null, cafName, null);

    {
        String consDesc = Type.getMethodDescriptor(Type.VOID_TYPE,
                new Type[] { Type.getType(Module.class), Type.getType(String.class) });

        MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", consDesc, null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKESPECIAL, cafName, "<init>", consDesc);
        mv.visitInsn(RETURN);
        mv.visitMaxs(3, 3);
        mv.visitEnd();
    }

    this.generateFastEnter(cw, cafName, moduleName, methodName);

    cw.visitEnd();

    byte[] b = cw.toByteArray();
    Class<?> clazz = this.loader.defineClass(nodeName, b);
    return (Class<Caf>) clazz;
}

From source file:bluejelly.runtime.ModuleLoader.java

License:BSD License

/**
 * Generate a {@link Code} subclass for the given method information.
 * //from   ww  w  .j  a  v a2s  .c om
 * @param module    module declaring the method to process
 * @param ci        code info for the method to process
 * 
 * @return          
 *   a {@link Code} subclass whose <code>fastEnter</code> will call
 *   module.ci.getMethod() with an {@link ExecutionContext} as argument.
 */
@SuppressWarnings("unchecked")
private Class<Code> generateCode(Module module, CodeInfo ci) {
    String nodeName = this.genNodeName(ci);
    String codeName = Type.getInternalName(Code.class);
    String moduleName = Type.getInternalName(module.getClass());
    String methodName = ci.getMethod().getName();

    ClassWriter cw = new ClassWriter(0);
    cw.visit(V1_6, ACC_PUBLIC + ACC_FINAL, nodeName, null, codeName, null);

    {
        String consDesc = Type.getMethodDescriptor(Type.VOID_TYPE,
                new Type[] { Type.getType(int.class), Type.getType(Module.class), Type.getType(String.class) });

        MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", consDesc, null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ILOAD, 1);
        mv.visitVarInsn(ALOAD, 2);
        mv.visitVarInsn(ALOAD, 3);
        mv.visitMethodInsn(INVOKESPECIAL, codeName, "<init>", consDesc);
        mv.visitInsn(RETURN);
        mv.visitMaxs(4, 4);
        mv.visitEnd();
    }

    this.generateFastEnter(cw, codeName, moduleName, methodName);

    cw.visitEnd();

    byte[] b = cw.toByteArray();
    Class<?> clazz = this.loader.defineClass(nodeName, b);
    return (Class<Code>) clazz;
}

From source file:bluejelly.runtime.ModuleLoader.java

License:BSD License

/**
 * Override <code>fastEnter</code> method in class being visited
 * by <code>cw</code>, subclass of <code>superName</code>. Method
 * will call <code>methodName</code>. declared in class 
 * <code>moduleName</code>. So , assuming class generated by
 * <code>cw</code> is named <code>X</code>, we will have:
 * /*  w w  w .  ja v  a 2 s . c o  m*/
 * <p>
 * <code>
 * class X extends superName {
 *     public void fastEnter(ExecutionContext ctx) {
 *         ((moduleName)this.module).methodName(ctx);
 *     }
 * }
 * </code>
 * 
 * @param cw            class writer generating class code
 * @param superName     internal name of superclass: Code or Caf
 * @param moduleName    internal name of module class
 * @param methodName    name of method to invoke in module moduleName
 */
private void generateFastEnter(ClassWriter cw, String superName, String moduleName, String methodName) {

    String fieldDesc = Type.getDescriptor(Module.class);
    String methodDesc = "(" + Type.getDescriptor(ExecutionContext.class) + ")V";

    MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "fastEnter", methodDesc, null, null);
    mv.visitCode();
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, superName, "module", fieldDesc);
    mv.visitTypeInsn(CHECKCAST, moduleName);
    mv.visitVarInsn(ALOAD, 1);
    mv.visitMethodInsn(INVOKEVIRTUAL, moduleName, methodName, methodDesc);
    mv.visitInsn(RETURN);
    mv.visitMaxs(2, 2);
    mv.visitEnd();
}

From source file:blusunrize.immersiveengineering.common.util.compat.jei.arcfurnace.ArcFurnaceRecipeWrapper.java

private static Class<? extends ArcFurnaceRecipeWrapper> createSubWrapper(String subtype) throws Exception {
    String entitySuperClassName = Type.getInternalName(ArcFurnaceRecipeWrapper.class);
    String entityProxySubClassName = ArcFurnaceRecipeWrapper.class.getSimpleName().concat(subtype);
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    cw.visit(Opcodes.V1_6, Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER, entityProxySubClassName, null,
            entitySuperClassName, null);
    cw.visitSource(entityProxySubClassName.concat(".java"), null);
    //create constructor
    String methodDescriptor = "(L" + Type.getInternalName(ArcFurnaceRecipe.class) + ";)V";
    MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", methodDescriptor, null, null);
    mv.visitCode();/*w  w w . ja  v  a2  s .  c  o m*/
    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitVarInsn(Opcodes.ALOAD, 1);
    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, entitySuperClassName, "<init>", methodDescriptor, false);
    mv.visitInsn(Opcodes.RETURN);
    mv.visitMaxs(0, 0);
    mv.visitEnd();
    cw.visitEnd();
    return (Class<? extends ArcFurnaceRecipeWrapper>) new ProxyClassLoader(
            Thread.currentThread().getContextClassLoader(), cw.toByteArray())
                    .loadClass(entityProxySubClassName.replaceAll("/", "."));
}

From source file:boilerplate.processor.adapters.EqualsAdapter.java

License:Open Source License

private void addEqualsMethod(List<FieldInfo> fields) {
    // CODE: public boolean equals(Object obj) {
    MethodVisitor mv = cv.visitMethod(ACC_PUBLIC, "equals", "(Ljava/lang/Object;)Z", null, null);
    mv.visitCode();//from  w w  w .j  a  va  2 s.co  m

    // CODE: if (this == obj) return true;
    mv.visitVarInsn(ALOAD, 0);
    mv.visitVarInsn(ALOAD, 1);
    Label l0 = new Label();
    mv.visitJumpInsn(IF_ACMPNE, l0);
    mv.visitInsn(ICONST_1);
    mv.visitInsn(IRETURN);
    mv.visitLabel(l0);
    mv.visitFrame(F_SAME, 0, null, 0, null);

    // CODE: if (!(obj instanceof Foo)) return false;
    mv.visitVarInsn(ALOAD, 1);
    mv.visitTypeInsn(INSTANCEOF, typeInfo.type);
    Label l1 = new Label();
    mv.visitJumpInsn(IFNE, l1);
    mv.visitInsn(ICONST_0);
    mv.visitInsn(IRETURN);
    mv.visitLabel(l1);
    mv.visitFrame(F_SAME, 0, null, 0, null);

    // CODE: final Foo other = (Foo) obj;
    mv.visitVarInsn(ALOAD, 1);
    mv.visitTypeInsn(CHECKCAST, typeInfo.type);
    mv.visitVarInsn(ASTORE, 2);

    for (FieldInfo info : fields) {
        addTest(mv, info);
    }

    // CODE: return true; }
    mv.visitInsn(ICONST_1);
    mv.visitInsn(IRETURN);
    mv.visitMaxs(1, 2);
    mv.visitEnd();
}

From source file:boilerplate.processor.adapters.EqualsAdapter.java

License:Open Source License

private void addHashCodeMethod(List<FieldInfo> fields) {
    // CODE: public int hashCode() {
    MethodVisitor mv = cv.visitMethod(ACC_PUBLIC, "hashCode", "()I", null, null);
    mv.visitCode();/*from w  w w . j  av  a2 s. c o m*/

    // CODE: final int prime = 31;
    mv.visitIntInsn(BIPUSH, 31);
    mv.visitVarInsn(ISTORE, 1);
    mv.visitInsn(ICONST_1);

    // CODE: int result = 1;
    mv.visitVarInsn(ISTORE, 2);

    for (FieldInfo fieldInfo : fields) {
        addCalculation(mv, fieldInfo);
    }

    // CODE: return result; }
    mv.visitVarInsn(ILOAD, 2);
    mv.visitInsn(IRETURN);
    mv.visitMaxs(1, 3);
    mv.visitEnd();
}

From source file:boilerplate.processor.adapters.ToStringAdapter.java

License:Open Source License

private void addMethod() {
    List<String> fieldNames = new ArrayList<String>(typeInfo.fields.size());
    Map<String, FieldInfo> fields = new HashMap<String, FieldInfo>(typeInfo.fields.size());
    boolean hasAnnotatedFields = typeInfo.hasAnnotatedFields();
    for (FieldInfo info : typeInfo.fields) {
        if (!(hasAnnotatedFields ^ info.mark == Mark.INCLUDE)) {
            fieldNames.add(info.name);//from   w  w  w  .  j  a va  2 s  .co  m
            fields.put(info.name, info);
        }
    }
    Collections.sort(fieldNames);

    MethodVisitor mv = cv.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null);
    mv.visitCode();
    mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
    mv.visitInsn(DUP);
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V");
    mv.visitVarInsn(ASTORE, 1);
    for (String name : fieldNames) {
        FieldInfo info = fields.get(name);
        addField(mv, info);
    }
    mv.visitVarInsn(ALOAD, 1);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;");
    mv.visitInsn(ARETURN);
    mv.visitMaxs(4, 2);
    mv.visitEnd();
}

From source file:boilerplate.processor.adapters.ToStringMethodInsertion.java

License:Open Source License

public void generateCode(MethodVisitor mv, TypeInfo typeInfo, FieldInfo fieldInfo) {
    mv.visitVarInsn(ALOAD, 1);
    mv.visitLdcInsn(fieldInfo.name);//ww  w.  j a va2 s  .c om
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, typeInfo.type, fieldInfo.name, fieldInfo.type.getDescriptor());
    mv.visitMethodInsn(INVOKESTATIC, "boilerplate/tostring/ToStringUtils", methodName, methodSignature);
}

From source file:br.usp.each.saeg.badua.core.internal.instr.IntegerInitProbe.java

License:Open Source License

@Override
public void accept(final MethodVisitor mv) {
    mv.visitInsn(Opcodes.ICONST_0);//from   w w  w.  ja v a2s  . c  o  m
    mv.visitVarInsn(Opcodes.ISTORE, vCovered);
    mv.visitInsn(Opcodes.ICONST_0);
    mv.visitVarInsn(Opcodes.ISTORE, vAlive);
    mv.visitInsn(Opcodes.ICONST_M1);
    mv.visitVarInsn(Opcodes.ISTORE, vSleepy);
}

From source file:br.usp.each.saeg.badua.core.internal.instr.IntegerProbe.java

License:Open Source License

@Override
public void accept(final MethodVisitor mv) {

    // update covered
    if (potcov != 0) {
        mv.visitVarInsn(Opcodes.ILOAD, vAlive);

        if (!singlePredecessor && potcovpuse != 0) {
            mv.visitVarInsn(Opcodes.ILOAD, vSleepy);
            mv.visitInsn(Opcodes.IAND);/*from  www  .  ja  va2s  .  c  o  m*/
        }

        InstrSupport.push(mv, (int) potcov);
        mv.visitInsn(Opcodes.IAND);
        mv.visitVarInsn(Opcodes.ILOAD, vCovered);
        mv.visitInsn(Opcodes.IOR);
        mv.visitVarInsn(Opcodes.ISTORE, vCovered);
    }

    // update alive
    if (disabled != 0) {
        InstrSupport.push(mv, ~(int) disabled);
        mv.visitVarInsn(Opcodes.ILOAD, vAlive);
        mv.visitInsn(Opcodes.IAND);
    }
    if (born != 0) {
        if (disabled == 0) {
            mv.visitVarInsn(Opcodes.ILOAD, vAlive);
        }
        InstrSupport.push(mv, (int) born);
        mv.visitInsn(Opcodes.IOR);
    }
    if (disabled != 0 || born != 0) {
        mv.visitVarInsn(Opcodes.ISTORE, vAlive);
    }

    // update sleepy
    InstrSupport.push(mv, ~(int) sleepy);
    mv.visitVarInsn(Opcodes.ISTORE, vSleepy);

}