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.beam.CompilerVisitor.java

License:Apache License

/**
 * /*from   ww  w. j a v a2 s  .  c o  m*/
 */
private void generate_classinit() {
    MethodVisitor mv = cv.visitMethod(ACC_STATIC | ACC_PRIVATE, "<clinit>", "()V", null, null);
    mv.visitCode();

    for (Map.Entry<String, String> ent : funs.entrySet()) {

        String field = ent.getKey();
        String clazz = ent.getValue();

        mv.visitTypeInsn(NEW, clazz);
        mv.visitInsn(DUP);
        mv.visitMethodInsn(INVOKESPECIAL, clazz, "<init>", "()V");

        mv.visitFieldInsn(PUTSTATIC, self_type.getInternalName(), field, "L" + funt.get(field) + ";");

    }

    for (Map.Entry<EObject, String> ent : constants.entrySet()) {

        EObject term = ent.getKey();
        term.emit_const(mv);
        mv.visitFieldInsn(Opcodes.PUTSTATIC, self_type.getInternalName(), ent.getValue(),
                Type.getType(term.getClass()).getDescriptor());
    }

    cv.visitField(ACC_STATIC | ACC_PRIVATE, "attributes", ESEQ_TYPE.getDescriptor(), null, null);

    atts.emit_const(mv);
    mv.visitFieldInsn(Opcodes.PUTSTATIC, self_type.getInternalName(), "attributes", ESEQ_TYPE.getDescriptor());

    if (this.module_md5 != null) {
        cv.visitField(ACC_STATIC, "module_md5", EBINARY_TYPE.getDescriptor(), null, null);
        module_md5.emit_const(mv);
        mv.visitFieldInsn(PUTSTATIC, self_type.getInternalName(), "module_md5", EBINARY_TYPE.getDescriptor());
    }

    mv.visitInsn(RETURN);
    mv.visitMaxs(200, 10);
    mv.visitEnd();

    // make the method module_name
    mv = cv.visitMethod(ACC_PROTECTED, "module_name", "()Ljava/lang/String;", null, null);
    mv.visitCode();
    mv.visitLdcInsn(this.module_name.getName());
    mv.visitInsn(ARETURN);
    mv.visitMaxs(1, 1);
    mv.visitEnd();

    // make the method attributes
    mv = cv.visitMethod(ACC_PROTECTED, "attributes", "()" + ESEQ_TYPE.getDescriptor(), null, null);
    mv.visitCode();
    mv.visitFieldInsn(Opcodes.GETSTATIC, self_type.getInternalName(), "attributes", ESEQ_TYPE.getDescriptor());
    mv.visitInsn(ARETURN);
    mv.visitMaxs(1, 1);
    mv.visitEnd();

    // make default constructor
    mv = cv.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
    mv.visitCode();
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, ECOMPILEDMODULE_NAME, "<init>", "()V");
    mv.visitInsn(RETURN);
    mv.visitMaxs(1, 1);
    mv.visitEnd();

    mv = cv.visitMethod(ACC_PUBLIC, "registerImportsAndExports", "()V", null, null);
    mv.visitCode();
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, ECOMPILEDMODULE_NAME, "registerImportsAndExports", "()V");

    for (Lambda l : lambdas_xx.values()) {

        mv.visitTypeInsn(NEW, Type.getInternalName(LocalFunID.class));
        mv.visitInsn(DUP);

        module_name.emit_const(mv);
        l.fun.emit_const(mv);
        push_int(mv, l.arity);
        push_int(mv, l.old_index);
        push_int(mv, l.index);
        push_int(mv, l.old_uniq);
        mv.visitFieldInsn(GETSTATIC, self_type.getInternalName(), "module_md5", EBINARY_TYPE.getDescriptor());

        mv.visitMethodInsn(INVOKESPECIAL, Type.getInternalName(LocalFunID.class), "<init>",
                "(" + EATOM_DESC + EATOM_DESC + "IIII" + EBINARY_TYPE.getDescriptor() + ")V");

        mv.visitInsn(DUP);
        cv.visitField(ACC_STATIC, anon_fun_name(l), Type.getDescriptor(LocalFunID.class), null, null)
                .visitEnd();
        mv.visitFieldInsn(PUTSTATIC, self_type.getInternalName(), anon_fun_name(l),
                Type.getDescriptor(LocalFunID.class));

        String mname = EUtil.getJavaName(l.fun, l.arity - l.freevars);
        String outer_name = self_type.getInternalName();
        String inner_name = "FN_" + mname;
        String full_inner_name = outer_name + "$" + inner_name;

        mv.visitLdcInsn(full_inner_name.replace('/', '.'));

        mv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(Class.class), "forName",
                "(Ljava/lang/String;)Ljava/lang/Class;");

        mv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(EModuleManager.class), "register_lambda",
                "(" + Type.getDescriptor(LocalFunID.class) + Type.getDescriptor(Class.class) + ")V");
    }

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

}

From source file:erjang.beam.CompilerVisitor.java

License:Apache License

static public byte[] make_invoker(String module, String function, Type self_type, String mname, String fname,
        int arity, boolean proc, boolean exported, Lambda lambda, Type return_type, boolean is_tail_call,
        final boolean is_pausable) {

    int freevars = lambda == null ? 0 : lambda.freevars;

    String outer_name = self_type.getInternalName();
    String inner_name = "FN_" + mname;
    String full_inner_name = outer_name + "$" + inner_name;

    ClassWriter cw = new ClassWriter(true);
    int residual_arity = arity - freevars;
    String super_class_name = EFUN_NAME + residual_arity + (exported ? "Exported" : "");
    if (exported)
        EFun.ensure_exported(residual_arity);
    else//from  w  w w.j a  va  2  s.c  o m
        EFun.ensure(residual_arity);

    cw.visit(V1_6, ACC_FINAL | ACC_PUBLIC, full_inner_name, null, super_class_name, null);

    if (lambda != null) {
        cw.visitField(ACC_STATIC | ACC_PUBLIC | ACC_FINAL, "index", "I", null, new Integer(lambda.index));
        cw.visitField(ACC_STATIC | ACC_PUBLIC | ACC_FINAL, "old_index", "I", null,
                new Integer(lambda.old_index));
        cw.visitField(ACC_STATIC | ACC_PUBLIC | ACC_FINAL, "old_uniq", "I", null, new Integer(lambda.old_uniq));

        /** */
        MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "encode",
                "(" + Type.getDescriptor(EOutputStream.class) + ")V", null, null);
        mv.visitCode();

        mv.visitVarInsn(ALOAD, 1);

        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, full_inner_name, "pid", EPID_TYPE.getDescriptor());
        mv.visitLdcInsn(module);

        mv.visitFieldInsn(GETSTATIC, full_inner_name, "old_index", "I");
        mv.visitInsn(I2L);
        mv.visitLdcInsn(new Integer(arity));
        mv.visitFieldInsn(GETSTATIC, outer_name, "module_md5", EBINARY_TYPE.getDescriptor());

        mv.visitFieldInsn(GETSTATIC, full_inner_name, "index", "I");
        mv.visitInsn(I2L);
        mv.visitFieldInsn(GETSTATIC, full_inner_name, "old_uniq", "I");
        mv.visitInsn(I2L);

        mv.visitLdcInsn(new Integer(freevars));
        mv.visitTypeInsn(ANEWARRAY, EOBJECT_NAME);

        for (int i = 0; i < freevars; i++) {
            mv.visitInsn(DUP);

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

            mv.visitVarInsn(ALOAD, 0); // load self
            mv.visitFieldInsn(GETFIELD, full_inner_name, "fv" + i, EOBJECT_DESC);

            mv.visitInsn(AASTORE);
        }

        mv.visitMethodInsn(INVOKEVIRTUAL, Type.getInternalName(EOutputStream.class), "write_fun",
                "(" + EPID_TYPE.getDescriptor() + "Ljava/lang/String;" + "JI" + EBINARY_TYPE.getDescriptor()
                        + "JJ" + Type.getDescriptor(EObject[].class) + ")V");

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

    make_constructor(cw, module, function, full_inner_name, super_class_name, lambda, exported);

    make_go_method(cw, outer_name, fname, full_inner_name, arity, proc, freevars, return_type, is_tail_call,
            is_pausable);

    make_go2_method(cw, outer_name, fname, full_inner_name, arity, proc, freevars, return_type, is_tail_call,
            is_pausable);

    return cw.toByteArray();

}

From source file:erjang.beam.CompilerVisitor.java

License:Apache License

private static void make_constructor(ClassWriter cw, String module_name, String function_name,
        String full_inner_name, String super_class_name, Lambda lambda, boolean exported) {
    StringBuilder sb = new StringBuilder("(");
    int freevars = lambda == null ? 0 : lambda.freevars;
    if (lambda != null) {
        sb.append(EPID_TYPE.getDescriptor());
        cw.visitField(ACC_PUBLIC | ACC_FINAL, "pid", EPID_TYPE.getDescriptor(), null, null);
    }//from w  w w  . j  a v  a 2 s .c o m
    // create the free vars
    for (int i = 0; i < freevars; i++) {
        cw.visitField(ACC_PUBLIC | ACC_FINAL, "fv" + i, EOBJECT_DESC, null, null);
        sb.append(EOBJECT_DESC);
    }
    sb.append(")V");

    MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", sb.toString(), null, null);
    mv.visitCode();

    mv.visitVarInsn(ALOAD, 0);
    if (exported) {
        mv.visitLdcInsn(module_name);
        mv.visitLdcInsn(function_name);
        mv.visitMethodInsn(INVOKESPECIAL, super_class_name, "<init>",
                "(Ljava/lang/String;Ljava/lang/String;)V");
    } else {
        mv.visitMethodInsn(INVOKESPECIAL, super_class_name, "<init>", "()V");
    }

    if (lambda != null) {
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitFieldInsn(PUTFIELD, full_inner_name, "pid", EPID_TYPE.getDescriptor());

    }

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

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

    if (lambda != null) {
        mv = cw.visitMethod(ACC_PROTECTED, "get_env", "()" + ESEQ_DESC, null, null);
        mv.visitCode();
        mv.visitFieldInsn(GETSTATIC, ERT_NAME, "NIL", ENIL_TYPE.getDescriptor());
        for (int i = freevars - 1; i >= 0; i--) {
            mv.visitVarInsn(ALOAD, 0);
            mv.visitFieldInsn(GETFIELD, full_inner_name, "fv" + i, EOBJECT_DESC);
            mv.visitMethodInsn(INVOKEVIRTUAL, ESEQ_NAME, "cons", "(" + EOBJECT_DESC + ")" + ESEQ_DESC);
        }
        mv.visitInsn(ARETURN);
        mv.visitMaxs(3, 3);
        mv.visitEnd();

        mv = cw.visitMethod(ACC_PROTECTED, "get_pid", "()" + EOBJECT_DESC, null, null);
        mv.visitCode();
        mv.visitVarInsn(ALOAD, 0);
        mv.visitFieldInsn(GETFIELD, full_inner_name, "pid", EPID_TYPE.getDescriptor());
        mv.visitInsn(ARETURN);
        mv.visitMaxs(3, 3);
        mv.visitEnd();

        mv = cw.visitMethod(ACC_PROTECTED, "get_id", "()" + Type.getDescriptor(FunID.class), null, null);
        mv.visitCode();
        mv.visitFieldInsn(GETSTATIC, full_inner_name.substring(0, full_inner_name.indexOf('$')),
                anon_fun_name(lambda), Type.getDescriptor(LocalFunID.class));
        mv.visitInsn(ARETURN);
        mv.visitMaxs(3, 3);
        mv.visitEnd();

    }
}

From source file:erjang.beam.CompilerVisitor.java

License:Apache License

private static void make_invoke_method(ClassWriter cw, String outer_name, String mname, int arity, boolean proc,
        int freevars, Type returnType, boolean isTailCall) {
    MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "invoke", EUtil.getSignature(arity - freevars, true), null,
            PAUSABLE_EX);/*from  w w w .ja v a 2 s  .  c o m*/
    mv.visitCode();
    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, outer_name + "$FN_" + mname, "fv" + i, EOBJECT_DESC);
    }
    mv.visitMethodInsn(INVOKESTATIC, outer_name, mname, EUtil.getSignature(arity, proc, returnType));

    if (isTailCall) {
        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_NAME, "TAIL_MARKER", EOBJECT_DESC);
            mv.visitJumpInsn(IF_ACMPNE, done);
        }

        // load proc
        mv.visitVarInsn(ALOAD, 1);
        mv.visitFieldInsn(GETFIELD, EPROC_NAME, "tail", EFUN_DESCRIPTOR);
        mv.visitVarInsn(ALOAD, 1);

        mv.visitMethodInsn(INVOKEVIRTUAL, EFUN_NAME, "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.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);/*  w ww .  j  a  v a  2s. c  om*/
    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;// w  ww.  ja v a  2s. c o  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);
        }/*from w w w  .  j  ava  2 s.c o m*/
        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();
    mv.visitLdcInsn(new Integer(arity));
    mv.visitInsn(Opcodes.IRETURN);/*w  ww.j av  a2 s  .com*/
    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  . j  av  a2 s  .c  om
    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();

    mv.visitVarInsn(Opcodes.ALOAD, 0);// w  w  w .  j  a va2s  .  c om
    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();
}