Example usage for org.objectweb.asm MethodVisitor visitCode

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

Introduction

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

Prototype

public void visitCode() 

Source Link

Document

Starts the visit of the method's code, if any (i.e.

Usage

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

    for (int i = 0; i < arity; i++) {
        mv.visitVarInsn(ALOAD, 1);// w  ww . ja  v  a  2 s . c  om
        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();
    mv.visitVarInsn(ALOAD, 0);//from w  ww. j a v a 2s  . com
    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();

    mv.visitVarInsn(ALOAD, 1);/*from  w  w  w. j a va  2s.c o m*/
    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 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();

    mv.visitVarInsn(ALOAD, 1);/* w ww  .j  a v a2 s  .  c  o  m*/
    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();
    mv.visitTypeInsn(Opcodes.NEW, this_class_name);
    mv.visitInsn(Opcodes.DUP);//  w  w  w .  j  a  va2 s  . c  o m
    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();
    mv.visitVarInsn(Opcodes.ALOAD, 0);/*from   w  w w.ja v  a 2  s .c  o  m*/
    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();

    Label dflt = new Label();
    Label[] labels = new Label[n_cells];
    for (int i = 0; i < n_cells; i++) {
        labels[i] = new Label();
    }//from  ww  w . j  a va 2  s .  co  m

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

    Label dflt = new Label();
    Label[] labels = new Label[n_cells];
    for (int i = 0; i < n_cells; i++) {
        labels[i] = new Label();
    }/*from   w  w w .j  a v a2 s. co  m*/

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

    if (n <= 5) {
        mv.visitInsn(Opcodes.ICONST_0 + n);
    } else {/* w ww .  java  2s  .c  o  m*/
        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();

    mv.visitVarInsn(Opcodes.ALOAD, 0);/*from   www  .ja v a 2  s .c om*/
    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();
}