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, там тоже есть интересные моменты.
В процессе. Собственно, на оригинальную статью я наткнулся, когда изучал именно компиляцию 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 несколько иного мнения:
V1_6 == 50.0
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 блока, вместо него простыми словами идет копи-паст.
Как то сложно читается, и вроде не тупо через переводчик переведено.
А вообще интересная статья, особенно для воскресного вечера, спасибо.
А вообще интересная статья, особенно для воскресного вечера, спасибо.
try {
return «foo»;
}
Емнип, eclipse на такое вообще ругается, как и на return в finally.
Поразило.
Sign up to leave a comment.
Компиляция Try/Catch/Finally для JVM