== foo == tailrec fun foo() { try { return foo() } catch (e: Throwable) { } } --------------------- L0: 1 2 mark({ try { return foo() } catch (e: Throwable) { } }) mark(try { return foo() } catch (e: Throwable) { }) jmp?(L2) NEXT:[v(e: Throwable), mark({ return foo() })] 3 mark({ return foo() }) jmp?(L2) NEXT:[v(e: Throwable), mark(foo())] mark(foo()) call(foo(), foo) -> ret(*|) L1 NEXT:[] - 2 jmp?(L2) NEXT:[v(e: Throwable), jmp(L3)] PREV:[] - jmp(L3) NEXT:[merge(try { return foo() } catch (e: Throwable) { }|!, !) -> ] PREV:[] L2 [onException]: 3 v(e: Throwable) PREV:[jmp?(L2), jmp?(L2)] magic[FAKE_INITIALIZER](e: Throwable) -> w(e|) 4 mark({ }) read (Unit) 3 jmp(L3) L3 [afterCatches]: 2 merge(try { return foo() } catch (e: Throwable) { }|!, !) -> L1: 1 NEXT:[] PREV:[ret(*|) L1, merge(try { return foo() } catch (e: Throwable) { }|!, !) -> ] error: PREV:[] sink: PREV:[, ] =====================