== 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} magic[FAKE_INITIALIZER](e: Exception) -> INIT: in: {e=D} 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 merge(try { foo() } catch (e: Exception) { val a = e } finally { val a = 1 }|, !) -> INIT: in: {} out: {} mark("after") r("after") -> L1: 1 error: sink: USE: in: {} out: {} =====================