Fix KT-8608: Compiler crashes with assertion Restore stack is unavailable

- fix SAVE_STACK_BEFORE_TRY insertion:
  TRYCATCHBLOCK LA, LB, LC
  LA
    NOP
    try_body
  LB
    ...
  LC
    handler_body
should be transformed into:
  LA
    {SAVE_STACK_BEFORE_TRY}
  LA' // new TCB start label
    NOP
    try_body
  LB
    ...
  LC
    handler_body
with all TCBs start labels remapped

- properly wrap exceptions from MandatoryMethodTransformer

 #KT-8608 Fixed
This commit is contained in:
Dmitry Petrov
2015-07-24 10:02:34 +03:00
parent a58f249a01
commit a64f1a86c0
7 changed files with 145 additions and 41 deletions
@@ -0,0 +1,26 @@
inline fun catchAll(x: String, block: () -> Unit): String {
try {
block()
} catch (e: Throwable) {
}
return x
}
inline fun tryTwice(block: () -> Unit) {
try {
block()
try {
block()
} catch (e: Exception) {
}
} catch (e: Exception) {
}
}
fun box(): String {
return catchAll("OK") {
tryTwice {
throw Exception()
}
}
}
@@ -0,0 +1,30 @@
interface Callable {
fun call(b: Boolean)
}
inline fun run(f: () -> Unit) { f() }
class A {
fun foo(): String {
run {
val x = object : Callable {
override fun call(b: Boolean) {
if (b) {
x()
} else {
try {
x()
} catch(t: Throwable) {
}
}
}
}
}
return "OK"
}
private fun x() {}
}
fun box(): String =
A().foo()