Example usage for org.objectweb.asm MethodVisitor visitMaxs

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

Introduction

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

Prototype

public void visitMaxs(final int maxStack, final int maxLocals) 

Source Link

Document

Visits the maximum stack size and the maximum number of local variables of the method.

Usage

From source file:erjang.beam.CompilerVisitor.java

License:Apache License

public static void make_invoketail_method(ClassWriter cw, String full_inner, int arity, int freevars) {
    MethodVisitor mv;
    mv = cw.visitMethod(ACC_PUBLIC | ACC_FINAL, "invoke_tail", EUtil.getSignature(arity - freevars, true), null,
            null);/*from ww  w .j a  v  a 2s  .co m*/
    mv.visitCode();
    for (int i = 0; i < arity - freevars; i++) {
        mv.visitVarInsn(ALOAD, 1);
        mv.visitVarInsn(ALOAD, i + 2);
        mv.visitFieldInsn(PUTFIELD, EPROC_NAME, "arg" + i, EOBJECT_DESC);
    }

    mv.visitVarInsn(ALOAD, 1);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(PUTFIELD, EPROC_NAME, "tail", EFUN_DESCRIPTOR);
    if (EProc.TAIL_MARKER == null) {
        mv.visitInsn(ACONST_NULL);
    } else {
        mv.visitFieldInsn(GETSTATIC, EPROC_NAME, "TAIL_MARKER", EOBJECT_DESC);
    }
    mv.visitInsn(ARETURN);
    mv.visitMaxs(arity + 2, arity + 2);
    mv.visitEnd();
}

From source file:erjang.beam.CompilerVisitor.java

License:Apache License

private static void make_go_method(ClassWriter cw, String outer_name, String mname, String full_inner,
        int arity, boolean proc, int freevars, Type returnType, boolean isTailCall, boolean isPausable) {
    if (!isPausable)
        return;// ww  w .  ja  v  a 2s  . co  m

    MethodVisitor mv;
    mv = cw.visitMethod(ACC_PUBLIC, "go", GO_DESC, null, PAUSABLE_EX);
    mv.visitCode();
    for (int i = 0; i < arity - freevars; i++) {
        mv.visitVarInsn(ALOAD, 1);
        mv.visitFieldInsn(GETFIELD, EPROC_NAME, "arg" + i, EOBJECT_DESC);
        mv.visitVarInsn(ASTORE, i + 2);
    }
    for (int i = 0; i < arity - freevars; i++) {
        mv.visitVarInsn(ALOAD, 1);
        mv.visitInsn(ACONST_NULL);
        mv.visitFieldInsn(PUTFIELD, EPROC_NAME, "arg" + i, EOBJECT_DESC);
    }
    if (proc)
        mv.visitVarInsn(ALOAD, 1);

    for (int i = 0; i < arity - freevars; i++) {
        mv.visitVarInsn(ALOAD, i + 2);
    }

    for (int i = 0; i < freevars; i++) {
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, full_inner, "fv" + i, EOBJECT_DESC);
    }

    mv.visitMethodInsn(INVOKESTATIC, outer_name, mname, EUtil.getSignature(arity, proc, returnType));
    mv.visitInsn(ARETURN);
    mv.visitMaxs(arity + 2, arity + 2);
    mv.visitEnd();

    cw.visitEnd();
}

From source file:erjang.beam.CompilerVisitor.java

License:Apache License

private static void make_go2_method(ClassWriter cw, String outer_name, String mname, String full_inner,
        int arity, boolean proc, int freevars, Type returnType, boolean isTailCall, boolean isPausable) {

    if (isPausable) {
        if (ModuleAnalyzer.log.isLoggable(Level.FINE)) {
            ModuleAnalyzer.log.fine("not generating go2 (pausable) for " + full_inner);
        }// ww w  .ja va  2 s .  com
        return;
    }

    MethodVisitor mv;
    mv = cw.visitMethod(ACC_PUBLIC, "go2", GO_DESC, null, null);
    mv.visitCode();
    for (int i = 0; i < arity - freevars; i++) {
        mv.visitVarInsn(ALOAD, 1);
        mv.visitFieldInsn(GETFIELD, EPROC_NAME, "arg" + i, EOBJECT_DESC);
        mv.visitVarInsn(ASTORE, i + 2);
    }
    for (int i = 0; i < arity - freevars; i++) {
        mv.visitVarInsn(ALOAD, 1);
        mv.visitInsn(ACONST_NULL);
        mv.visitFieldInsn(PUTFIELD, EPROC_NAME, "arg" + i, EOBJECT_DESC);
    }
    if (proc)
        mv.visitVarInsn(ALOAD, 1);

    for (int i = 0; i < arity - freevars; i++) {
        mv.visitVarInsn(ALOAD, i + 2);
    }

    for (int i = 0; i < freevars; i++) {
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, full_inner, "fv" + i, EOBJECT_DESC);
    }

    mv.visitMethodInsn(INVOKESTATIC, outer_name, mname, EUtil.getSignature(arity, proc, returnType));
    mv.visitInsn(ARETURN);
    mv.visitMaxs(arity + 2, arity + 2);
    mv.visitEnd();

    cw.visitEnd();
}

From source file:erjang.EFun.java

License:Apache License

static byte[] gen_fun_class_data(int arity) {

    String self_type = EFUN_TYPE.getInternalName() + arity;

    ClassWriter cw = new ClassWriter(true);
    cw.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT, self_type, null,
            EFUN_TYPE.getInternalName(), null);

    make_invoke_method(cw, self_type, arity);

    CompilerVisitor.make_invoketail_method(cw, self_type, arity, 0);

    MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "arity", "()I", null, null);
    mv.visitCode();//from w w w.  j  a  va 2s .  c  o m
    mv.visitLdcInsn(new Integer(arity));
    mv.visitInsn(Opcodes.IRETURN);
    mv.visitMaxs(2, 2);
    mv.visitEnd();

    mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "invoke", "(" + EPROC_TYPE.getDescriptor()
            + EOBJECT_ARR_TYPE.getDescriptor() + ")" + EOBJECT_TYPE.getDescriptor(), null, PAUSABLE_EX);
    mv.visitCode();
    mv.visitVarInsn(Opcodes.ALOAD, 0); // load this
    mv.visitVarInsn(Opcodes.ALOAD, 1); // load proc
    for (int i = 0; i < arity; i++) {
        mv.visitVarInsn(Opcodes.ALOAD, 2);
        push_int(mv, i);
        mv.visitInsn(Opcodes.AALOAD);
    }

    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, self_type, "invoke", EUtil.getSignature(arity, true));

    mv.visitInsn(Opcodes.ARETURN);
    mv.visitMaxs(arity + 2, arity + 2);
    mv.visitEnd();

    mv = cw.visitMethod(Opcodes.ACC_PROTECTED, "<init>", "()V", null, null);
    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, EFUN_TYPE.getInternalName(), "<init>", "()V");
    mv.visitInsn(Opcodes.RETURN);
    mv.visitMaxs(1, 1);
    mv.visitEnd();

    make_cast_method(cw, arity);

    cw.visitEnd();

    byte[] data = cw.toByteArray();
    return data;
}

From source file:erjang.EFun.java

License:Apache License

public static EFun get_fun_with_handler(String module, String function, int arity, EFunHandler handler,
        ClassLoader loader) {//from w  w  w .ja  va 2s . c  o m
    String signature = module + function + arity;
    Constructor<? extends EFun> h = handlers.get(signature);

    if (h == null) {

        get_fun_class(arity);

        String safe_function = JAVA_ID.matcher(function).matches() ? function : make_valid_java_id(function);
        StringBuffer sb = new StringBuffer();
        String self_type = sb.append(EFUN_TYPE.getInternalName()).append(module).append(safe_function)
                .append("Handler").append(arity).toString();

        ClassWriter cw = new ClassWriter(true);
        String super_class_name = EFUN_TYPE.getInternalName() + arity;
        cw.visit(Opcodes.V1_4, ACC_PUBLIC, self_type, null, super_class_name, null);

        // create handler field
        cw.visitField(ACC_PRIVATE, "handler", EFUNHANDLER_TYPE.getDescriptor(), null, null).visitEnd();
        cw.visitField(ACC_PRIVATE | ACC_FINAL, "module_name", EATOM_DESC, null, null).visitEnd();
        cw.visitField(ACC_PRIVATE | ACC_FINAL, "function_name", EATOM_DESC, null, null).visitEnd();

        // make constructor
        MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(" + EFUNHANDLER_TYPE.getDescriptor() + ")V",
                null, null);
        mv.visitCode();

        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, super_class_name, "<init>", "()V");

        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitFieldInsn(PUTFIELD, self_type, "handler", EFUNHANDLER_TYPE.getDescriptor());
        mv.visitVarInsn(ALOAD, 0);
        mv.visitLdcInsn(module);
        mv.visitMethodInsn(INVOKESTATIC, EATOM_TYPE.getInternalName(), "intern",
                "(Ljava/lang/String;)Lerjang/EAtom;");
        mv.visitFieldInsn(PUTFIELD, self_type, "module_name", EATOM_DESC);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitLdcInsn(function);
        mv.visitMethodInsn(INVOKESTATIC, EATOM_TYPE.getInternalName(), "intern",
                "(Ljava/lang/String;)Lerjang/EAtom;");
        mv.visitFieldInsn(PUTFIELD, self_type, "function_name", EATOM_DESC);

        mv.visitInsn(RETURN);
        mv.visitMaxs(3, 3);
        mv.visitEnd();

        /** forward toString to handler */
        mv = cw.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0); // load self
        mv.visitFieldInsn(GETFIELD, self_type, "handler", EFUNHANDLER_TYPE.getDescriptor());
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "toString", "()Ljava/lang/String;");
        mv.visitInsn(ARETURN);
        mv.visitMaxs(3, 3);
        mv.visitEnd();

        // make invoke_tail method
        //CompilerVisitor.make_invoketail_method(cw, self_type, arity, 0);
        make_invoke_method(cw, self_type, arity);
        make_go_method(cw, self_type, arity);
        make_encode_method(cw, self_type, arity);

        cw.visitEnd();
        byte[] data = cw.toByteArray();

        data = weave(data);

        Class<? extends EFun> clazz = ERT.defineClass(loader, self_type.replace('/', '.'), data);

        try {
            h = clazz.getConstructor(EFunHandler.class);
        } catch (Exception e) {
            throw new Error(e);
        }

        handlers.put(signature, h);
    }

    try {
        return h.newInstance(handler);
    } catch (Exception e) {
        throw new Error(e);
    }
}

From source file:erjang.EFun.java

License:Apache License

private static void make_cast_method(ClassWriter cw, int n) {
    MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "cast",
            "(" + EOBJECT_DESC + ")L" + EFUN_NAME + n + ";", null, null);
    mv.visitCode();/*ww w.  jav a2s.c o  m*/

    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitTypeInsn(INSTANCEOF, EFUN_NAME + n);

    Label fail = new Label();

    mv.visitJumpInsn(Opcodes.IFEQ, fail);
    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitTypeInsn(Opcodes.CHECKCAST, EFUN_NAME + n);
    mv.visitInsn(Opcodes.ARETURN);

    mv.visitLabel(fail);
    mv.visitInsn(Opcodes.ACONST_NULL);
    mv.visitInsn(Opcodes.ARETURN);

    mv.visitMaxs(2, 2);
    mv.visitEnd();
}

From source file:erjang.EFun.java

License:Apache License

private static void make_go_method(ClassWriter cw, String self_type, int arity) {
    MethodVisitor mv;
    mv = cw.visitMethod(ACC_PUBLIC, "go", GO_DESC, null, PAUSABLE_EX);
    mv.visitCode();//from   ww w.j a  v  a  2s  . co  m

    for (int i = 0; i < arity; i++) {
        mv.visitVarInsn(ALOAD, 1);
        mv.visitFieldInsn(GETFIELD, EPROC_NAME, "arg" + i, EOBJECT_DESC);
        mv.visitVarInsn(ASTORE, i + 2);
    }
    for (int i = 0; i < arity; i++) {
        mv.visitVarInsn(ALOAD, 1);
        mv.visitInsn(ACONST_NULL);
        mv.visitFieldInsn(PUTFIELD, EPROC_NAME, "arg" + i, EOBJECT_DESC);
    }

    // load handler
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, self_type, "handler", EFUNHANDLER_TYPE.getDescriptor());

    // load proc
    mv.visitVarInsn(ALOAD, 1);

    // create array
    mv.visitLdcInsn(new Integer(arity));
    mv.visitTypeInsn(ANEWARRAY, EOBJECT_TYPE.getInternalName());

    for (int i = 0; i < arity; i++) {
        mv.visitInsn(DUP);
        mv.visitLdcInsn(new Integer(i));
        mv.visitVarInsn(ALOAD, i + 2);
        mv.visitInsn(AASTORE);
    }

    mv.visitMethodInsn(INVOKEINTERFACE, EFUNHANDLER_TYPE.getInternalName(), "invoke",
            "(" + EPROC_TYPE.getDescriptor() + "[" + EOBJECT_DESC + ")" + EOBJECT_DESC);
    mv.visitInsn(ARETURN);
    mv.visitMaxs(arity + 2, arity + 2);
    mv.visitEnd();

    cw.visitEnd();
}

From source file:erjang.EFun.java

License:Apache License

private static void make_invoke_method(ClassWriter cw, String self_type, int arity) {
    MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "invoke", EUtil.getSignature(arity, true), null, PAUSABLE_EX);
    mv.visitCode();//  ww w . jav a2  s  . c  o  m
    mv.visitVarInsn(ALOAD, 0);
    mv.visitVarInsn(ALOAD, 1);
    for (int i = 0; i < arity; i++) {
        mv.visitVarInsn(ALOAD, i + 2);
    }
    mv.visitMethodInsn(INVOKEVIRTUAL, self_type, "invoke_tail", EUtil.getSignature(arity, true));
    mv.visitVarInsn(ASTORE, arity + 2);

    Label done = new Label();
    Label loop = new Label();
    mv.visitLabel(loop);
    mv.visitVarInsn(ALOAD, arity + 2);
    if (EProc.TAIL_MARKER == null) {
        mv.visitJumpInsn(IFNONNULL, done);
    } else {
        mv.visitFieldInsn(GETSTATIC, EPROC_TYPE.getInternalName(), "TAIL_MARKER", EOBJECT_TYPE.getDescriptor());
        mv.visitJumpInsn(IF_ACMPNE, done);
    }

    // load proc
    mv.visitVarInsn(ALOAD, 1);
    mv.visitFieldInsn(GETFIELD, EPROC_TYPE.getInternalName(), "tail", EFUN_TYPE.getDescriptor());
    mv.visitVarInsn(ALOAD, 1);

    mv.visitMethodInsn(INVOKEVIRTUAL, EFUN_TYPE.getInternalName(), "go", GO_DESC);
    mv.visitVarInsn(ASTORE, arity + 2);

    mv.visitJumpInsn(GOTO, loop);

    mv.visitLabel(done);
    mv.visitVarInsn(ALOAD, arity + 2);
    mv.visitInsn(ARETURN);
    mv.visitMaxs(arity + 2, arity + 2);
    mv.visitEnd();
}

From source file:erjang.EFun.java

License:Apache License

static void make_encode_method(ClassWriter cw, String className, int arity) {
    MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "encode",
            "(" + Type.getDescriptor(EOutputStream.class) + ")V", null, null);
    mv.visitCode();/*from   w  w w .j  ava  2 s . c  o m*/

    mv.visitVarInsn(ALOAD, 1);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, className, "module_name", EATOM_DESC);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitFieldInsn(GETFIELD, className, "function_name", EATOM_DESC);
    mv.visitLdcInsn(new Integer(arity));

    mv.visitMethodInsn(INVOKEVIRTUAL, Type.getInternalName(EOutputStream.class), "write_external_fun",
            "(" + EATOM_DESC + EATOM_DESC + "I)V");

    mv.visitInsn(RETURN);
    mv.visitMaxs(4, 1);
    mv.visitEnd();
}

From source file:erjang.EFun.java

License:Apache License

static byte[] get_exported_fun_class_data(int arity) {
    /* Code template:// w  w  w.  j av  a  2 s  . c o m
     * public abstract class EFun{arity}Exported extends EFun{arity} {
     *   protected final EAtom module_name, function_name;
     *   protected EFun{arity}Exported(String m, String f) {
     *     module_name   = EAtom.intern(m);
     *     function_name = EAtom.intern(f);
     *   }
     * }
     */

    ensure(arity); // Ensure presence of superclass.
    String super_type = EFUN_TYPE.getInternalName() + arity;
    String self_type = super_type + "Exported";

    ClassWriter cw = new ClassWriter(true);
    cw.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT, self_type, null, super_type, null);

    cw.visitField(ACC_PROTECTED | ACC_FINAL, "module_name", EATOM_TYPE.getDescriptor(), null, null).visitEnd();

    cw.visitField(ACC_PROTECTED | ACC_FINAL, "function_name", EATOM_TYPE.getDescriptor(), null, null)
            .visitEnd();

    MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PROTECTED, "<init>",
            "(Ljava/lang/String;Ljava/lang/String;)V", null, null);

    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, super_type, "<init>", "()V");

    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitVarInsn(Opcodes.ALOAD, 1);
    mv.visitMethodInsn(Opcodes.INVOKESTATIC, EATOM_TYPE.getInternalName(), "intern",
            "(Ljava/lang/String;)Lerjang/EAtom;");
    mv.visitFieldInsn(Opcodes.PUTFIELD, self_type, "module_name", EATOM_DESC);

    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitVarInsn(Opcodes.ALOAD, 2);
    mv.visitMethodInsn(Opcodes.INVOKESTATIC, EATOM_TYPE.getInternalName(), "intern",
            "(Ljava/lang/String;)Lerjang/EAtom;");
    mv.visitFieldInsn(Opcodes.PUTFIELD, self_type, "function_name", EATOM_DESC);

    mv.visitInsn(Opcodes.RETURN);
    mv.visitMaxs(3, 3);
    mv.visitEnd();

    make_encode_method_for_exported(cw, self_type, arity);

    cw.visitEnd();

    byte[] data = cw.toByteArray();
    return data;
}