我目前正在研究Java反编译器。
我读了JVM规范,我知道pop2
可以操作一个堆栈值(类别2值)或两个堆栈值(其他类别值)。
我只是想知道pop2
的两个堆栈值操作何时会发生?有人能告诉我一些Java源代码,其编译结果包含两个堆栈值操作 pop2
吗?
答案 0 :(得分:2)
如果你弹出一个double或long,肯定会调用POP2,例如
thisMethodReturnsALong(); thisMethodReturnsADouble();
其他案件。
答案 1 :(得分:1)
根据我对Java 8中javac
编译器的源代码的简要介绍,有无地点,它会向{2}类别发出POP2
- 堆栈中的1个值。如果需要弹出两个category-1值,则编译器将发出两个POP
字节码。
注意事项:
javac
编译器在JIT编译器出现之前,POP2
的两个值弹出行为在早期Java字节码编译器中使用似乎是合理的。但是现在我们有了JIT编译器,字节码编译器中的 no point “优化”了两个POP
字节码到POP2
。