Save/restore stack in try-expressions (and statements).
Parse TryCatchBlockNode's in generated bytecode, infer stack save/restore points. Save stack to local variables before 'try'. Restore stack after the beginning of try-block, catch-block, and default handler. Integrate before/after inline markers rewriting (otherwise it'll break our stacks). #KT-3309 Fixed
This commit is contained in:
+52
@@ -0,0 +1,52 @@
|
||||
fun cleanup() {}
|
||||
|
||||
inline fun concat(x: String, y: String): String = x + y
|
||||
|
||||
inline fun throws() {
|
||||
try {
|
||||
throw Exception()
|
||||
}
|
||||
finally {
|
||||
cleanup()
|
||||
}
|
||||
}
|
||||
|
||||
inline fun first(x: String, y: String): String = x
|
||||
|
||||
fun box(): String =
|
||||
"" + concat(
|
||||
try { "" } finally { "0" },
|
||||
"" + concat(
|
||||
first(
|
||||
try {
|
||||
try {
|
||||
"O"
|
||||
}
|
||||
finally {
|
||||
"1"
|
||||
}
|
||||
}
|
||||
catch (e: Exception) {
|
||||
throw e
|
||||
}
|
||||
finally {
|
||||
cleanup()
|
||||
},
|
||||
"2"
|
||||
),
|
||||
first(
|
||||
try {
|
||||
throws()
|
||||
throw Exception()
|
||||
"3"
|
||||
}
|
||||
catch (e: Exception) {
|
||||
"K"
|
||||
}
|
||||
finally {
|
||||
cleanup()
|
||||
},
|
||||
"4"
|
||||
)
|
||||
)
|
||||
)
|
||||
Reference in New Issue
Block a user