Example usage for org.objectweb.asm MethodVisitor visitMethodInsn

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

Introduction

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

Prototype

@Deprecated
public void visitMethodInsn(final int opcode, final String owner, final String name, final String descriptor) 

Source Link

Document

Visits a method instruction.

Usage

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);//w  ww.java  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

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.j  a va2  s.  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   www  .jav a 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.EAtom.java

License:Apache License

@Override
public org.objectweb.asm.Type emit_const(MethodVisitor fa) {

    Type type = EATOM_TYPE;/* w  w  w  .  java2 s.  c o m*/

    fa.visitLdcInsn(value);
    fa.visitMethodInsn(Opcodes.INVOKESTATIC, type.getInternalName(), "intern",
            "(" + STRING_TYPE.getDescriptor() + ")" + type.getDescriptor());

    return type;
}

From source file:erjang.EBig.java

License:Apache License

@Override
public org.objectweb.asm.Type emit_const(MethodVisitor fa) {

    Type type = EBIG_TYPE;//  w w w  .j a v  a2  s  . c  o  m

    fa.visitLdcInsn(value.toString());
    fa.visitMethodInsn(Opcodes.INVOKESTATIC, type.getInternalName(), "fromString",
            "(" + STRING_TYPE.getDescriptor() + ")" + type.getDescriptor());

    return type;
}

From source file:erjang.EBigString.java

License:Apache License

@Override
public Type emit_const(MethodVisitor fa) {

    Type type = ESTRING_TYPE;//from  ww  w.  j a va2  s  . c o m

    fa.visitLdcInsn(this.stringValue());
    fa.visitMethodInsn(Opcodes.INVOKESTATIC, type.getInternalName(), "fromString",
            "(" + STRING_TYPE.getDescriptor() + ")" + type.getDescriptor());

    return type;
}

From source file:erjang.EBinary.java

License:Apache License

@Override
public Type emit_const(MethodVisitor fa) {
    char[] chs = new char[byteSize()];
    for (int i = 0; i < byteSize(); i++) {
        chs[i] = (char) (0xff & octetAt(i));
    }/*from   w w  w .ja v a2  s  .c om*/
    String str = new String(chs);

    fa.visitLdcInsn(str);
    fa.visitMethodInsn(Opcodes.INVOKESTATIC, EBINARY_NAME, "fromString",
            "(Ljava/lang/String;)L" + EBINARY_NAME + ";");

    return EBINARY_TYPE;
}

From source file:erjang.EBinList.java

License:Apache License

@Override
public Type emit_const(MethodVisitor fa) {

    Type type = EBINLIST_TYPE;/* ww w. j av a 2 s  .c  o m*/

    char[] ch = new char[len];
    for (int i = 0; i < len; i++) {
        ch[i] = (char) (0xff & (int) data[off + i]);
    }

    fa.visitLdcInsn(new String(ch));
    tail.emit_const(fa);
    fa.visitMethodInsn(Opcodes.INVOKESTATIC, type.getInternalName(), "fromString",
            "(" + STRING_TYPE.getDescriptor() + EOBJECT_DESC + ")" + type.getDescriptor());

    return type;
}