== foo == fun foo(): Int { var i = 0 try { i = 1 } finally { fun bar() {} return i } } --------------------- L0: 1 2 mark({ var i = 0 try { i = 1 } finally { fun bar() {} return i } }) v(var i = 0) r(0) -> w(i|) mark(try { i = 1 } finally { fun bar() {} return i }) jmp?(L2) NEXT:[mark({ fun bar() {} return i }), mark({ i = 1 })] 3 mark({ i = 1 }) r(1) -> w(i|) 2 jmp?(L2) NEXT:[mark({ fun bar() {} return i }), jmp(L3)] jmp(L3) NEXT:[mark({ fun bar() {} return i })] L2 [onExceptionToFinallyBlock]: L4 [start finally]: 3 mark({ fun bar() {} return i }) PREV:[jmp?(L2), jmp?(L2)] jmp?(L5) NEXT:[r(i) -> , d(fun bar() {})] d(fun bar() {}) NEXT:[] L5 [after local declaration]: r(i) -> PREV:[jmp?(L5)] ret(*|) L1 NEXT:[] L8 [finish finally]: - 2 jmp(error) NEXT:[] PREV:[] L3 [skipFinallyToErrorBlock]: L9 [copy of L2, onExceptionToFinallyBlock]: 3 mark({ fun bar() {} return i }) PREV:[jmp(L3)] jmp?(L10) NEXT:[r(i) -> , d(fun bar() {})] d(fun bar() {}) NEXT:[] L10 [copy of L5, after local declaration]: r(i) -> PREV:[jmp?(L10)] ret(*|) L1 NEXT:[] - 2 merge(try { i = 1 } finally { fun bar() {} return i }|!) -> PREV:[] L1: 1 NEXT:[] PREV:[ret(*|) L1, ret(*|) L1] error: PREV:[] sink: PREV:[, , d(fun bar() {}), d(fun bar() {})] ===================== == bar == fun bar() {} --------------------- L6: 4 5 mark({}) read (Unit) L7: 4 NEXT:[] error: PREV:[] sink: PREV:[, ] ===================== == bar == fun bar() {} --------------------- L2 [copy of L6, null]: 4 5 mark({}) read (Unit) L3 [copy of L7, null]: 4 NEXT:[] L0 [copy of error, null]: PREV:[] L1 [copy of sink, null]: PREV:[, ] =====================