ASM Tree API插入InsnList给出StackOverflowError?

时间:2012-10-31 05:21:18

标签: java compiler-construction jvm bytecode java-bytecode-asm

我正在尝试按照ASM用户手册(http://download.forge.objectweb.org/asm/asm4-guide.pdf)第112页上的委派示例进行操作。到目前为止,我有一些看起来像这样的东西:

class MyMethodAdapter extends MethodVisitor {
    MethodVisitor next;
    public MyMethodAdapter(int access, String name, String desc,
                           String signature, String[] exceptions, MethodVisitor mv) {
        super(
            Opcodes.ASM4,
            new MethodNode(access, name, desc, signature, exceptions)
        );
        next = mv;
    }

    @Override public void visitEnd() {
        MethodNode mn = (MethodNode) mv;

        mn.instructions.insert(new MethodInsnNode(INVOKESTATIC, "runtime/Recorder", "checkBytecodes", "()V"));


        mn.accept(next);
    }
}

不幸的是,当我运行它时,它失败了:

*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at ../../../src/share/instrument/JPLISAgent.c line: 844
*** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at ../../../src/share/instrument/JPLISAgent.c line: 844

Exception: java.lang.StackOverflowError thrown from the UncaughtExceptionHandler in thread "main"

只有当mn.instructions.insert(行存在时才会发生这种情况,因此可能是我的转换管道的其余部分有效。这里有什么我想念的吗?我实际上将我的转换放在手册中标记的// put your transformation code here区域中,结果错误完全无法理解。

add()指令到方法的指令列表的末尾似乎运行正常,但这不是我想要的。我希望新的静态调用是方法体中的第一件事。

1 个答案:

答案 0 :(得分:0)

如果没有堆栈跟踪,很难说这是否与ASM API相关。

您仍然可以使用以下命令在指令列表的开头插入您的电话:

mn.instructions.insertBefore(mn.instructions.getFirst(), 
    new MethodInsnNode(INVOKESTATIC, "runtime/Recorder", "checkBytecodes", "()V"));