== foo == fun foo() { "before" try { foo() } catch (e: Exception) { val a = e } finally { val a = 1 } "after" } --------------------- L0: 1 INIT: in: {} out: {} 2 mark({ "before" try { foo() } catch (e: Exception) { val a = e } finally { val a = 1 } "after" }) mark("before") r("before") mark(try { foo() } catch (e: Exception) { val a = e } finally { val a = 1 }) jmp?(L2 [onException]) jmp?(L3 [onExceptionToFinallyBlock]) 3 mark({ foo() }) mark(foo()) call(foo, foo) 2 jmp(L4 [afterCatches]) USE: in: {} out: {} L2 [onException]: 3 v(e: Exception) INIT: in: {} out: {e=D} w(e) INIT: in: {e=D} out: {e=ID} 4 mark({ val a = e }) INIT: in: {e=ID} out: {e=ID} v(val a = e) INIT: in: {e=ID} out: {a=D, e=ID} USE: in: {e=READ} out: {e=READ} r(e) INIT: in: {a=D, e=ID} out: {a=D, e=ID} USE: in: {} out: {e=READ} w(a) INIT: in: {a=D, e=ID} out: {a=ID, e=ID} 3 jmp(L4 [afterCatches]) INIT: in: {e=ID} out: {e=ID} L4 [afterCatches]: 2 jmp(L5 [skipFinallyToErrorBlock]) INIT: in: {} out: {} L3 [onExceptionToFinallyBlock]: L6 [start finally]: 3 mark({ val a = 1 }) v(val a = 1) INIT: in: {} out: {a=D} r(1) INIT: in: {a=D} out: {a=D} w(a) INIT: in: {a=D} out: {a=ID} L7 [finish finally]: 2 jmp(error) INIT: in: {} out: {} L5 [skipFinallyToErrorBlock]: 3 mark({ val a = 1 }) v(val a = 1) INIT: in: {} out: {a=D} r(1) INIT: in: {a=D} out: {a=D} w(a) INIT: in: {a=D} out: {a=ID} 2 mark("after") INIT: in: {} out: {} r("after") L1: 1 error: sink: USE: in: {} out: {} =====================