Pull to refresh

Comments 15

Небольшой нюанс: до версии JVM 1.6 для оператора finally, по всей видимости, использовались подпограммы вместо полной подстановки. Но сейчас мы говорим о версии 1.6, к которой все вышесказанное применимо.

До 1.3 включительно использовалась связка jsr/ret. Где-то посередине 1.4 большинство компиляторов перешли на подстановку — побочным эффектом поломав некоторые приложения, где внезапно окказалась превышена максимальная длина процедуры. Ну а в 1.6 обе эти команды запретили в верификаторе.

покрывать весь try-блок целиком (но не оператор GOTO в конце),

На практике компиляторы халатно относятся к границам. goto, return, athrow и т.п. могут как попадать, так и не попадать в покрываемый промежуток.

Cтатья старая, конечно. Сейчас можно написать к ней обновление с разбором конструкции try-with-resources, там тоже есть интересные моменты.
Спасибо за комментарий, интересно.

Сейчас можно написать к ней обновление с разбором конструкции try-with-resources, там тоже есть интересные моменты.

В процессе. Собственно, на оригинальную статью я наткнулся, когда изучал именно компиляцию try-with-resources.
Ну а в 1.6 обе эти команды запретили в верификаторе.
Поясните свои слова? На данный момент и Java SE 6, и Java SE 7 отлично кушают классы с JSR/RET в методах. Берутся такие классы из древних библиотек, скомпилированных давно-давно.
Они запрещены для классов с версией V1_6 и выше. Пруф: секция A.2. Некоторые создатели языков, которые все еще используют JSR/RET, не могут из-за этого использовать классы 1.7, и, как следствие, инструкцию INVOKEDYNAMIC.
JVMS7 § 4.9.1 несколько иного мнения:
If the class file version number is 51.0 or above, then neither the jsr opcode or
the jsr_w opcode may appear in the code array.

V1_6 == 50.0
Похоже, что Вы правы. Раздел 4.10.2.5 там же:
To implement the try-finally construct, a compiler for the Java programming language that generates class files with version number 50.0 or below may use the exception-handling facilities together with two special instructions: jsr («jump to subroutine») and ret («return from subroutine»).
Я тоже обнаружил что в JVM нет инструкций для реализации finally блока, вместо него простыми словами идет копи-паст.
Как то сложно читается, и вроде не тупо через переводчик переведено.
А вообще интересная статья, особенно для воскресного вечера, спасибо.
Да, действительно, сейчас поставил, попробовал — только в finally ругается.
Давно уже eclipse на трогал, подзабыл малость :)
Странно у меня даже в finally не ругается.
Да я вам поверил, просто интересно у меня не ругается так.
Sign up to leave a comment.

Articles