Когда я могу получить код операции pop2 в файле .class, скомпилированном из исходного кода Java? - PullRequest
0 голосов
/ 25 апреля 2018

В настоящее время я работаю над декомпилятором Java.

Я прочитал спецификацию JVM и знаю, что pop2 может работать с одним значением стека (значения категории 2) или двумя значениями стека (другие значения категории).

Я просто хочу знать, когда может произойти операция с двумя значениями стека pop2?Может кто-нибудь показать мне некоторый исходный код Java, чей результат компиляции содержит две операции со значениями стека pop2?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Основываясь на моем кратком чтении исходного кода для компилятора javac в Java 8, нет мест , где он будет выдавать POP2 для извлечения значений категории 1 из стека,Если необходимо извлечь два значения категории 1, то компилятором будет выдано два POP байт-кода.

Предостережения:

  • Я смотрел только одну версию OpenJDKjavac компилятор
  • существуют другие (не Sun / Oracle) Java-компиляторы байт-кода
  • байт-коды могут быть сгенерированы или изменены другими способами .... включая обфускаторы кода!

Вероятно, поведение всплывающих двух значений POP2 использовалось в ранних компиляторах байт-кода Java до появления компиляторов JIT.Но теперь, когда у нас есть JIT-компиляторы, в байт-кодовых компиляторах нет смысла , "оптимизирующих" два POP байт-кода до POP2.

0 голосов
/ 25 апреля 2018

POP2 обязательно будет вызван, если вы вставите двойной или длинный, например,

thisMethodReturnsALong (); thisMethodReturnsADouble ();

среди других случаев.

...