gpt4 book ai didi

java - ASM(Java的字节码工具)中的Frame如何使用? visitFrame/FrameNode的各个参数是什么意思?

转载 作者:行者123 更新时间:2023-11-30 11:30:34 25 4
gpt4 key购买 nike

我正忙于使用 ASM 4.1 编写编译器。我需要将一种中间语言编译成 java 字节码。我发现 ASM 4.1 API 说,“事实上,这些节点必须 (*) 插入到任何指令节点 i 之前,该指令节点 i 遵循无条件分支指令,例如 GOTO 或 THROW,这是跳转指令的目标,或者启动一个exception handler block。” 但是,我在ASM指南(“ASM 4.0 A Java bytecode engineering library”)中找不到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)”。能告诉我参数的含义吗?

非常感谢。

最佳答案

您可以在下面的链接中找到详细的答案。

Is there a better explanation of stack map frames

Java 1.7 引入了这个选项来加速类验证。框架有两部分:变量类型和堆栈类型。第一帧由方法类型描述、初始 ?STORE 调用和方法返回类型确定。

在每次 GOTO/JUMP 调用后,您需要提供堆栈映射框架的更新描述。为了节省空间,您可以使用 SAME、APPEND 等选项,或者您可以通过指定 FULL 变量类型数组来再次描述所有变量。

例如,在 CATCH 部分,您的 Retrun Stack Type 已从方法返回类型更改为异常类类型以捕获异常。

如果您使用 goto 命令在不同的循环 block 之间跳转,则每个循环的执行 block 可能会对循环中使用的变量使用不同的帧描述。

关于java - ASM(Java的字节码工具)中的Frame如何使用? visitFrame/FrameNode的各个参数是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17727572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com