我什么时候可以在从 Java 源代码编译的 .class 文件中获取 pop2 操作码?
When can I get pop2 opcode in a .class file compiled from Java source code?
我目前正在开发 Java 反编译器。
我看了JVM规范,我知道pop2
可以操作一个栈值(第2类值)或者两个栈值(其他类值)。
我只想知道 pop2
的两个堆栈值操作何时会发生?谁能给我一些 Java 源代码,其编译结果包含 两个堆栈值操作 pop2
?
如果你pop一个double或者long,肯定会调用POP2,比如
thisMethodReturnsALong();
thisMethodReturnsADouble();
在其他情况下。
根据我对 Java 8 中 javac
编译器源代码的简要阅读,没有地方 会发出 POP2
从堆栈中弹出 2 个类别 1 值。如果需要弹出两个类别 1 值,则编译器将发出两个 POP
字节码。
注意事项:
- 我只看过一个版本的 OpenJDK
javac
编译器
- 还有其他 (non-Sun/Oracle) Java 个字节码编译器
- 字节码可以通过其他方式生成或修改....包括代码混淆器!
在 JIT 编译器出现之前,POP2
的两个值 pop 行为似乎被用于早期的 Java 字节码编译器。但是现在我们有了 JIT 编译器,字节码编译器 没有意义 "optimizing" 两个 POP
字节码到一个 POP2
.
我目前正在开发 Java 反编译器。
我看了JVM规范,我知道pop2
可以操作一个栈值(第2类值)或者两个栈值(其他类值)。
我只想知道 pop2
的两个堆栈值操作何时会发生?谁能给我一些 Java 源代码,其编译结果包含 两个堆栈值操作 pop2
?
如果你pop一个double或者long,肯定会调用POP2,比如
thisMethodReturnsALong(); thisMethodReturnsADouble();
在其他情况下。
根据我对 Java 8 中 javac
编译器源代码的简要阅读,没有地方 会发出 POP2
从堆栈中弹出 2 个类别 1 值。如果需要弹出两个类别 1 值,则编译器将发出两个 POP
字节码。
注意事项:
- 我只看过一个版本的 OpenJDK
javac
编译器 - 还有其他 (non-Sun/Oracle) Java 个字节码编译器
- 字节码可以通过其他方式生成或修改....包括代码混淆器!
在 JIT 编译器出现之前,POP2
的两个值 pop 行为似乎被用于早期的 Java 字节码编译器。但是现在我们有了 JIT 编译器,字节码编译器 没有意义 "optimizing" 两个 POP
字节码到一个 POP2
.