我正忙于使用 ASM 4.1 编写编译器。我需要将中间语言编译成 java 字节码。我发现 ASM 4.1 API 说,“事实上,这些节点必须 (*) 插入到任何指令节点 i 之前,该节点 i 遵循 GOTO 或 THROW 等无条件分支指令,它是跳转指令的目标,或者启动一个异常处理程序块。” 但是,我在 ASM 指南(“ASM 4.0 A Java 字节码工程库”)中找不到 Frame 的用法。谁知道Frame的用法?visitFrame/FrameNode每个参数是什么意思?为什么我使用ASMifier有时会得到“visitFrame(Opcodes.F_APPEND,...)”,而其他时候会得到“visitFrame(Opcodes.F_SAME,...)”?我无法理解!!例如,代码如下:
int a = 2;
int b = 3;
if(a == 3){
System.out.println("hello");
}else{
System.out.println(a);
if(b == 23){
System.out.println("world");
}else{
System.out.println(b);
}
}
通过使用ASMifier,我可以得到结果(对不起,我不能附上图片,因为没有enghou的声誉),并且有这样的指令:“visitFrame(Opcodes.F_APPEND,2, new Object[]{Opcodes.INTEGER , Opcodes.INTEGER}, 0, null)" . 你能告诉我参数的含义吗?
非常感谢。