== test == fun test() : Unit { try { test() } catch (any : Exception) { test() } finally { test() } } --------------------- L0: 1 2 mark({ try { test() } catch (any : Exception) { test() } finally { test() } }) mark(try { test() } catch (any : Exception) { test() } finally { test() }) jmp?(L2) NEXT:[v(any : Exception), jmp?(L3)] jmp?(L3) NEXT:[mark({ test() }), mark({ test() })] 3 mark({ test() }) mark(test()) call(test(), test) -> 2 jmp?(L2) NEXT:[v(any : Exception), jmp?(L3)] jmp?(L3) NEXT:[mark({ test() }), jmp(L4)] jmp(L4) NEXT:[jmp(L5)] L2 [onException]: 3 v(any : Exception) PREV:[jmp?(L2), jmp?(L2)] magic[FAKE_INITIALIZER](any : Exception) -> w(any|) 4 mark({ test() }) mark(test()) call(test(), test) -> 3 jmp(L4) L4 [afterCatches]: 2 jmp(L5) NEXT:[mark({ test() })] PREV:[jmp(L4), jmp(L4)] L3 [onExceptionToFinallyBlock]: L6 [start finally]: 3 mark({ test() }) PREV:[jmp?(L3), jmp?(L3)] mark(test()) call(test(), test) -> L7 [finish finally]: 2 jmp(error) NEXT:[] L5 [skipFinallyToErrorBlock]: L8 [copy of L3, onExceptionToFinallyBlock]: 3 mark({ test() }) PREV:[jmp(L5)] mark(test()) call(test(), test) -> 2 merge(try { test() } catch (any : Exception) { test() } finally { test() }|, ) -> L1: 1 NEXT:[] error: PREV:[jmp(error)] sink: PREV:[, ] =====================