我什么时候可以在从 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.