== f == fun f() { var foo = 1 try { foo = 2 throw RuntimeException() } catch (e: Throwable) { println(foo) } } --------------------- L0: 1 INIT: in: {} out: {} USE: in: {} out: {} 2 mark({ var foo = 1 try { foo = 2 throw RuntimeException() } catch (e: Throwable) { println(foo) } }) v(var foo = 1) INIT: in: {} out: {foo=D} r(1) -> INIT: in: {foo=D} out: {foo=D} w(foo|) INIT: in: {foo=D} out: {foo=ID} mark(try { foo = 2 throw RuntimeException() } catch (e: Throwable) { println(foo) }) INIT: in: {foo=ID} out: {foo=ID} jmp?(L2) USE: in: {foo=READ} out: {foo=READ} 3 mark({ foo = 2 throw RuntimeException() }) r(2) -> USE: in: {foo=WRITTEN_AFTER_READ} out: {foo=WRITTEN_AFTER_READ} w(foo|) USE: in: {foo=READ} out: {foo=WRITTEN_AFTER_READ} mark(throw RuntimeException()) jmp?(L2) USE: in: {foo=READ} out: {foo=READ} mark(RuntimeException()) call(RuntimeException(), ) -> throw (throw RuntimeException()|) USE: in: {} out: {} - 2 jmp?(L2) - jmp(L3) L2 [onException]: 3 v(e: Throwable) INIT: in: {foo=ID} out: {foo=ID} magic[FAKE_INITIALIZER](e: Throwable) -> INIT: in: {foo=ID} out: {foo=ID} w(e|) INIT: in: {foo=ID} out: {foo=ID} 4 mark({ println(foo) }) INIT: in: {foo=ID} out: {foo=ID} USE: in: {foo=READ} out: {foo=READ} r(foo) -> USE: in: {} out: {foo=READ} mark(println(foo)) magic[UNRESOLVED_CALL](println(foo)|, !) -> 3 jmp(L3) L3 [afterCatches]: 2 merge(try { foo = 2 throw RuntimeException() } catch (e: Throwable) { println(foo) }|!, ) -> L1: 1 INIT: in: {} out: {} error: sink: USE: in: {} out: {} =====================