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:
Dmitry Petrov
2015-06-26 10:18:42 +03:00
parent 534154e20d
commit 4e42cc6b81
41 changed files with 1572 additions and 455 deletions
@@ -0,0 +1,35 @@
public inline fun fails(block: () -> Unit): Throwable? {
var thrown: Throwable? = null
try {
block()
} catch (e: Throwable) {
thrown = e
}
if (thrown == null)
throw Exception("Expected an exception to be thrown")
return thrown
}
public inline fun throwIt(msg: String) {
throw Exception(msg)
}
fun box(): String {
fails {
throwIt("oops!")
}
var x = 0
try {
fails {
x = 1
}
}
catch (e: Exception) {
x = 2
}
if (x != 2) return "Failed: x==$x"
return "OK"
}