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.EFun.java

License:Apache License

static void make_encode_method_for_exported(ClassWriter cw, String className, int arity) {
    MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "encode",
            "(" + Type.getDescriptor(EOutputStream.class) + ")V", null, null);
    mv.visitCode();//from   ww w  . jav a  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.ETuple.java

License:Apache License

private static void create_tuple_copy(int i, ClassAdapter cw, String this_class_name, String super_class_name) {
    MethodVisitor mv;
    make_blank_bridge(cw, this_class_name, super_class_name);

    mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "blank", "()L" + this_class_name + ";", null, null);
    mv.visitCode();/*from   w ww .  ja v  a 2 s.co  m*/
    mv.visitTypeInsn(Opcodes.NEW, this_class_name);
    mv.visitInsn(Opcodes.DUP);
    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, this_class_name, "<init>", "()V");

    mv.visitInsn(Opcodes.ARETURN);

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

From source file:erjang.ETuple.java

License:Apache License

private static void make_blank_bridge(ClassAdapter cw, String this_class_name, String super_class_name) {
    MethodVisitor mv;
    mv = cw.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC | Opcodes.ACC_BRIDGE, "blank",
            "()L" + super_class_name + ";", null, null);
    mv.visitCode();/* w w  w  .j  av a  2 s  .  c  o  m*/
    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, this_class_name, "blank", "()L" + this_class_name + ";");
    mv.visitInsn(Opcodes.ARETURN);
    mv.visitMaxs(1, 1);
    mv.visitEnd();
}

From source file:erjang.ETuple.java

License:Apache License

private static void create_tuple_nth(int n_cells, ClassAdapter cw, String this_class_name) {
    MethodVisitor mv;
    mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "elm", "(I)" + ETERM_TYPE.getDescriptor(), null, null);
    mv.visitCode();//from w ww.  ja  v  a  2  s  .co  m

    Label dflt = new Label();
    Label[] labels = new Label[n_cells];
    for (int i = 0; i < n_cells; i++) {
        labels[i] = new Label();
    }

    mv.visitVarInsn(Opcodes.ILOAD, 1);
    mv.visitTableSwitchInsn(1, n_cells, dflt, labels);

    for (int zbase = 0; zbase < n_cells; zbase++) {

        mv.visitLabel(labels[zbase]);

        mv.visitVarInsn(Opcodes.ALOAD, 0); // load this
        String field = "elem" + (zbase + 1);

        mv.visitFieldInsn(Opcodes.GETFIELD, this_class_name, field, ETERM_TYPE.getDescriptor());
        mv.visitInsn(Opcodes.ARETURN);
    }

    mv.visitLabel(dflt);

    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitVarInsn(Opcodes.ILOAD, 1);
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, ETUPLE_NAME, "bad_nth", "(I)" + ETERM_TYPE.getDescriptor());
    mv.visitInsn(Opcodes.ARETURN); // make compiler happy

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

From source file:erjang.ETuple.java

License:Apache License

private static void create_tuple_set(int n_cells, ClassAdapter cw, String this_class_name) {
    MethodVisitor mv;
    mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "set", "(I" + ETERM_TYPE.getDescriptor() + ")V", null, null);
    mv.visitCode();// w w w.  ja  v  a  2 s . c om

    Label dflt = new Label();
    Label[] labels = new Label[n_cells];
    for (int i = 0; i < n_cells; i++) {
        labels[i] = new Label();
    }

    mv.visitVarInsn(Opcodes.ILOAD, 1);
    mv.visitTableSwitchInsn(1, n_cells, dflt, labels);

    for (int zbase = 0; zbase < n_cells; zbase++) {

        mv.visitLabel(labels[zbase]);

        mv.visitVarInsn(Opcodes.ALOAD, 0); // load this
        mv.visitVarInsn(Opcodes.ALOAD, 2); // load term

        String field = "elem" + (zbase + 1);

        mv.visitFieldInsn(Opcodes.PUTFIELD, this_class_name, field, ETERM_TYPE.getDescriptor());
        mv.visitInsn(Opcodes.RETURN);
    }

    mv.visitLabel(dflt);

    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitVarInsn(Opcodes.ILOAD, 1);
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, ETUPLE_NAME, "bad_nth", "(I)" + ETERM_TYPE.getDescriptor());
    mv.visitInsn(Opcodes.POP);
    mv.visitInsn(Opcodes.RETURN); // make compiler happy

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

From source file:erjang.ETuple.java

License:Apache License

private static void create_count(ClassAdapter cw, int n) {
    MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "arity", "()I", null, null);
    mv.visitCode();/*from  w  ww .j  av  a 2s. c  om*/

    if (n <= 5) {
        mv.visitInsn(Opcodes.ICONST_0 + n);
    } else {
        mv.visitLdcInsn(new Integer(n));
    }
    mv.visitInsn(Opcodes.IRETURN);
    mv.visitMaxs(1, 1);
    mv.visitEnd();
}

From source file:erjang.ETuple.java

License:Apache License

private static void create_cast(ClassAdapter cw, int n) {
    MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "cast",
            "(L" + ETUPLE_NAME + ";)L" + ETUPLE_NAME + n + ";", null, null);
    mv.visitCode();//  ww  w . j a va2 s.c  o  m

    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, ETUPLE_NAME, "arity", "()I");

    if (n <= 5) {
        mv.visitInsn(Opcodes.ICONST_0 + n);
    } else {
        mv.visitLdcInsn(new Integer(n));
    }

    Label fail = new Label();

    mv.visitJumpInsn(Opcodes.IF_ICMPNE, fail);
    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitTypeInsn(Opcodes.CHECKCAST, ETUPLE_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.ETuple.java

License:Apache License

private static void create_cast2(ClassAdapter cw, int n) {
    MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "cast",
            "(L" + Type.getInternalName(EObject.class) + ";)L" + ETUPLE_NAME + n + ";", null, null);
    mv.visitCode();/*from   ww w. j  av a 2s  .  c o m*/

    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitInsn(Opcodes.DUP);
    mv.visitTypeInsn(Opcodes.INSTANCEOF, ETUPLE_NAME + n);

    Label fail = new Label();

    mv.visitJumpInsn(Opcodes.IFEQ, fail);
    mv.visitVarInsn(Opcodes.ALOAD, 0);
    mv.visitTypeInsn(Opcodes.CHECKCAST, ETUPLE_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.ETuple.java

License:Apache License

private static void create_constructor(ClassAdapter cw, String super_class_name) {
    MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
    mv.visitCode();//from w  w  w .j av a 2s.  c  o m
    mv.visitVarInsn(Opcodes.ALOAD, 0); // load this
    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, super_class_name, "<init>", "()V");
    mv.visitInsn(Opcodes.RETURN);
    mv.visitMaxs(1, 1);
    mv.visitEnd();
}

From source file:formatasm.FormatASM.java

License:Open Source License

public static byte[] generateBytes(String klazz, String subklazz, List<Spec> specs) {
    klazz = klazz.replace('.', '/');
    subklazz = subklazz.replace('.', '/');

    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    MethodVisitor mv;

    cw.visit(V1_7, ACC_PUBLIC + ACC_SUPER, subklazz, null, klazz, null);

    {//from ww w  . j  a v  a  2 s.  c om
        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitMethodInsn(INVOKESPECIAL, klazz, "<init>", "()V");
        mv.visitInsn(RETURN);
        mv.visitMaxs(0, 0);
        mv.visitEnd();
    }

    {
        mv = cw.visitMethod(ACC_PUBLIC + ACC_VARARGS, "format", "([Ljava/lang/Object;)Ljava/lang/String;", null,
                null);

        /// StringBuilder sb = new StringBuilder();
        mv.visitCode();
        mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V");
        mv.visitVarInsn(ASTORE, 2);

        for (Spec spec : specs) {
            switch (spec.type) {
            case CONTENT:
                copyTemplateASM(klazz, mv, spec.begin, spec.end);
                // Skip further processing
                continue;

            case PERCENT:
                mv.visitVarInsn(ALOAD, 2);
                mv.visitIntInsn(BIPUSH, '%');
                mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
                        "(C)Ljava/lang/StringBuilder;");
                mv.visitInsn(POP);
                // Skip further processing
                continue;

            case INT:
                formatIntegerASM(mv, spec);
                break;

            case INT_HEX:
                formatHexidecimalASM(mv, spec);
                break;

            case OCTAL:
                formatOctalASM(mv, spec);
                break;

            case BOOL:
            case CHAR:
                // text = args[?].toString();
                mv.visitVarInsn(ALOAD, 1);
                mv.visitIntInsn(BIPUSH, spec.index);
                mv.visitInsn(AALOAD);
                mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "toString", "()Ljava/lang/String;");
                mv.visitVarInsn(ASTORE, 3);
                break;

            case STRING:
                // text = (String) args[?]
                mv.visitVarInsn(ALOAD, 1);
                mv.visitIntInsn(BIPUSH, spec.index);
                mv.visitInsn(AALOAD);
                mv.visitTypeInsn(CHECKCAST, "java/lang/String");
                mv.visitVarInsn(ASTORE, 3);
                break;

            case DATETIME:
                formatDateTimeASM(mv, spec);
                break;

            default:
                break;
            }

            if (spec.upper && spec.type != Type.DATETIME) {
                toUpperCaseASM(mv);
            }

            if (spec.width > 0 && !spec.leftFlag) {
                addWidthASM(mv, spec);
            }

            appendTextASM(mv);

            if (spec.width > 0 && spec.leftFlag) {
                addWidthASM(mv, spec);
            }
        }

        /// return sb.toString();
        mv.visitVarInsn(ALOAD, 2);
        mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;");
        mv.visitInsn(ARETURN);

        mv.visitMaxs(0, 0);
        mv.visitEnd();
    }
    cw.visitEnd();

    return cw.toByteArray();
}