== t1 == fun t1() { try { 1 } finally { 2 } } --------------------- L0: NEXT:[r(try { 1 } finally { 2 }) ] PREV:[] r(try { 1 } finally { 2 }) NEXT:[jmp?(L2 [onExceptionToFinallyBlock])] PREV:[] jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[r(2), r(1)] PREV:[r(try { 1 } finally { 2 }) ] r(1) NEXT:[jmp(L3 [skipFinallyToErrorBlock])] PREV:[jmp?(L2 [onExceptionToFinallyBlock])] jmp(L3 [skipFinallyToErrorBlock]) NEXT:[r(2)] PREV:[r(1)] L2 [onExceptionToFinallyBlock]: L4 [start finally]: r(2) NEXT:[jmp(error)] PREV:[jmp?(L2 [onExceptionToFinallyBlock])] L5 [finish finally]: jmp(error) NEXT:[] PREV:[r(2)] L3 [skipFinallyToErrorBlock]: r(2) NEXT:[] PREV:[jmp(L3 [skipFinallyToErrorBlock])] L1: NEXT:[] PREV:[r(2)] error: NEXT:[] PREV:[jmp(error)] sink: NEXT:[] PREV:[, ] ===================== == t2 == fun t2() { try { 1 if (2 > 3) { return } } finally { 2 } } --------------------- L0: NEXT:[r(try { 1 if (2 > 3) { retur..)] PREV:[] r(try { 1 if (2 > 3) { return } } finally { 2 }) NEXT:[jmp?(L2 [onExceptionToFinallyBlock])] PREV:[] jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[r(2), r(1)] PREV:[r(try { 1 if (2 > 3) { retur..)] r(1) NEXT:[r(2)] PREV:[jmp?(L2 [onExceptionToFinallyBlock])] r(2) NEXT:[r(3)] PREV:[r(1)] r(3) NEXT:[r(>)] PREV:[r(2)] r(>) NEXT:[r(2 > 3)] PREV:[r(3)] r(2 > 3) NEXT:[jf(L3)] PREV:[r(>)] jf(L3) NEXT:[read (Unit), r(2)] PREV:[r(2 > 3)] L4 [start finally]: r(2) NEXT:[ret L1] PREV:[jf(L3)] L5 [finish finally]: ret L1 NEXT:[] PREV:[r(2)] - jmp(L6) NEXT:[jmp(L7 [skipFinallyToErrorBlock])] PREV:[] L3: read (Unit) NEXT:[jmp(L7 [skipFinallyToErrorBlock])] PREV:[jf(L3)] L6: jmp(L7 [skipFinallyToErrorBlock]) NEXT:[r(2)] PREV:[read (Unit)] L2 [onExceptionToFinallyBlock]: r(2) NEXT:[jmp(error)] PREV:[jmp?(L2 [onExceptionToFinallyBlock])] jmp(error) NEXT:[] PREV:[r(2)] L7 [skipFinallyToErrorBlock]: r(2) NEXT:[] PREV:[jmp(L7 [skipFinallyToErrorBlock])] L1: NEXT:[] PREV:[ret L1, r(2)] error: NEXT:[] PREV:[jmp(error)] sink: NEXT:[] PREV:[, ] ===================== == t3 == fun t3() { try { 1 @{ () => if (2 > 3) { return@ } } } finally { 2 } } --------------------- L0: NEXT:[r(try { 1 @{ () => if (2 > 3..)] PREV:[] r(try { 1 @{ () => if (2 > 3) { return@ } } } finally { 2 }) NEXT:[jmp?(L2 [onExceptionToFinallyBlock])] PREV:[] jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[r(2), r(1)] PREV:[r(try { 1 @{ () => if (2 > 3..)] r(1) NEXT:[jmp?(L3)] PREV:[jmp?(L2 [onExceptionToFinallyBlock])] jmp?(L3) NEXT:[r({ () => if (2 > 3) { retur..), d({ () => if (2 > 3) { retur..)] PREV:[r(1)] d({ () => if (2 > 3) { return@ } }) NEXT:[] PREV:[jmp?(L3)] L3: r({ () => if (2 > 3) { return@ } }) NEXT:[jmp(L8 [skipFinallyToErrorBlock])] PREV:[jmp?(L3)] jmp(L8 [skipFinallyToErrorBlock]) NEXT:[r(2)] PREV:[r({ () => if (2 > 3) { retur..)] L2 [onExceptionToFinallyBlock]: L9 [start finally]: r(2) NEXT:[jmp(error)] PREV:[jmp?(L2 [onExceptionToFinallyBlock])] L10 [finish finally]: jmp(error) NEXT:[] PREV:[r(2)] L8 [skipFinallyToErrorBlock]: r(2) NEXT:[] PREV:[jmp(L8 [skipFinallyToErrorBlock])] L1: NEXT:[] PREV:[r(2)] error: NEXT:[] PREV:[jmp(error)] sink: NEXT:[] PREV:[, , d({ () => if (2 > 3) { retur..)] L4: NEXT:[r(())] PREV:[] r(()) NEXT:[r(2)] PREV:[] r(2) NEXT:[r(3)] PREV:[r(())] r(3) NEXT:[r(>)] PREV:[r(2)] r(>) NEXT:[r(2 > 3)] PREV:[r(3)] r(2 > 3) NEXT:[jf(L6)] PREV:[r(>)] jf(L6) NEXT:[read (Unit), ret L5] PREV:[r(2 > 3)] ret L5 NEXT:[] PREV:[jf(L6)] - jmp(L7) NEXT:[] PREV:[] L6: read (Unit) NEXT:[] PREV:[jf(L6)] L5: L7: NEXT:[] PREV:[ret L5, read (Unit)] error: NEXT:[] PREV:[] sink: NEXT:[] PREV:[, ] ===================== == anonymous_0 == { () => if (2 > 3) { return@ } } --------------------- L4: NEXT:[r(())] PREV:[] r(()) NEXT:[r(2)] PREV:[] r(2) NEXT:[r(3)] PREV:[r(())] r(3) NEXT:[r(>)] PREV:[r(2)] r(>) NEXT:[r(2 > 3)] PREV:[r(3)] r(2 > 3) NEXT:[jf(L6)] PREV:[r(>)] jf(L6) NEXT:[read (Unit), ret L5] PREV:[r(2 > 3)] ret L5 NEXT:[] PREV:[jf(L6)] - jmp(L7) NEXT:[] PREV:[] L6: read (Unit) NEXT:[] PREV:[jf(L6)] L5: L7: NEXT:[] PREV:[ret L5, read (Unit)] error: NEXT:[] PREV:[] sink: NEXT:[] PREV:[, ] ===================== == t4 == fun t4() { @{ () => try { 1 if (2 > 3) { return@ } } finally { 2 } } } --------------------- L0: NEXT:[jmp?(L2)] PREV:[] jmp?(L2) NEXT:[r({ () => try { 1 if (2 > 3)..), d({ () => try { 1 if (2 > 3)..)] PREV:[] d({ () => try { 1 if (2 > 3) { return@ } } finally { 2 } }) NEXT:[] PREV:[jmp?(L2)] L2: r({ () => try { 1 if (2 > 3) { return@ } } finally { 2 } }) NEXT:[] PREV:[jmp?(L2)] L1: NEXT:[] PREV:[r({ () => try { 1 if (2 > 3)..)] error: NEXT:[] PREV:[] sink: NEXT:[] PREV:[, , d({ () => try { 1 if (2 > 3)..)] L3: NEXT:[r(())] PREV:[] r(()) NEXT:[r(try { 1 if (2 > 3) { retur..)] PREV:[] r(try { 1 if (2 > 3) { return@ } } finally { 2 }) NEXT:[jmp?(L5 [onExceptionToFinallyBlock])] PREV:[r(())] jmp?(L5 [onExceptionToFinallyBlock]) NEXT:[r(2), r(1)] PREV:[r(try { 1 if (2 > 3) { retur..)] r(1) NEXT:[r(2)] PREV:[jmp?(L5 [onExceptionToFinallyBlock])] r(2) NEXT:[r(3)] PREV:[r(1)] r(3) NEXT:[r(>)] PREV:[r(2)] r(>) NEXT:[r(2 > 3)] PREV:[r(3)] r(2 > 3) NEXT:[jf(L6)] PREV:[r(>)] jf(L6) NEXT:[read (Unit), r(2)] PREV:[r(2 > 3)] L7 [start finally]: r(2) NEXT:[ret L4] PREV:[jf(L6)] L8 [finish finally]: ret L4 NEXT:[] PREV:[r(2)] - jmp(L9) NEXT:[jmp(L10 [skipFinallyToErrorBlock])] PREV:[] L6: read (Unit) NEXT:[jmp(L10 [skipFinallyToErrorBlock])] PREV:[jf(L6)] L9: jmp(L10 [skipFinallyToErrorBlock]) NEXT:[r(2)] PREV:[read (Unit)] L5 [onExceptionToFinallyBlock]: r(2) NEXT:[jmp(error)] PREV:[jmp?(L5 [onExceptionToFinallyBlock])] jmp(error) NEXT:[] PREV:[r(2)] L10 [skipFinallyToErrorBlock]: r(2) NEXT:[] PREV:[jmp(L10 [skipFinallyToErrorBlock])] L4: NEXT:[] PREV:[ret L4, r(2)] error: NEXT:[] PREV:[jmp(error)] sink: NEXT:[] PREV:[, ] ===================== == anonymous_1 == { () => try { 1 if (2 > 3) { return@ } } finally { 2 } } --------------------- L3: NEXT:[r(())] PREV:[] r(()) NEXT:[r(try { 1 if (2 > 3) { retur..)] PREV:[] r(try { 1 if (2 > 3) { return@ } } finally { 2 }) NEXT:[jmp?(L5 [onExceptionToFinallyBlock])] PREV:[r(())] jmp?(L5 [onExceptionToFinallyBlock]) NEXT:[r(2), r(1)] PREV:[r(try { 1 if (2 > 3) { retur..)] r(1) NEXT:[r(2)] PREV:[jmp?(L5 [onExceptionToFinallyBlock])] r(2) NEXT:[r(3)] PREV:[r(1)] r(3) NEXT:[r(>)] PREV:[r(2)] r(>) NEXT:[r(2 > 3)] PREV:[r(3)] r(2 > 3) NEXT:[jf(L6)] PREV:[r(>)] jf(L6) NEXT:[read (Unit), r(2)] PREV:[r(2 > 3)] L7 [start finally]: r(2) NEXT:[ret L4] PREV:[jf(L6)] L8 [finish finally]: ret L4 NEXT:[] PREV:[r(2)] - jmp(L9) NEXT:[jmp(L10 [skipFinallyToErrorBlock])] PREV:[] L6: read (Unit) NEXT:[jmp(L10 [skipFinallyToErrorBlock])] PREV:[jf(L6)] L9: jmp(L10 [skipFinallyToErrorBlock]) NEXT:[r(2)] PREV:[read (Unit)] L5 [onExceptionToFinallyBlock]: r(2) NEXT:[jmp(error)] PREV:[jmp?(L5 [onExceptionToFinallyBlock])] jmp(error) NEXT:[] PREV:[r(2)] L10 [skipFinallyToErrorBlock]: r(2) NEXT:[] PREV:[jmp(L10 [skipFinallyToErrorBlock])] L4: NEXT:[] PREV:[ret L4, r(2)] error: NEXT:[] PREV:[jmp(error)] sink: NEXT:[] PREV:[, ] ===================== == t5 == fun t5() { @ while(true) { try { 1 if (2 > 3) { break @ } } finally { 2 } } } --------------------- L0: NEXT:[r(while(true) { try { 1 if (..)] PREV:[] r(while(true) { try { 1 if (2 > 3) { break @ } } finally { 2 } }) NEXT:[r(true)] PREV:[] L2 [loop entry point]: L5 [condition entry point]: r(true) NEXT:[r(try { 1 if (2 > 3) { break..)] PREV:[r(while(true) { try { 1 if (..), jmp(L2 [loop entry point])] L4 [body entry point]: r(try { 1 if (2 > 3) { break @ } } finally { 2 }) NEXT:[jmp?(L6 [onExceptionToFinallyBlock])] PREV:[r(true)] jmp?(L6 [onExceptionToFinallyBlock]) NEXT:[r(2), r(1)] PREV:[r(try { 1 if (2 > 3) { break..)] r(1) NEXT:[r(2)] PREV:[jmp?(L6 [onExceptionToFinallyBlock])] r(2) NEXT:[r(3)] PREV:[r(1)] r(3) NEXT:[r(>)] PREV:[r(2)] r(>) NEXT:[r(2 > 3)] PREV:[r(3)] r(2 > 3) NEXT:[jf(L7)] PREV:[r(>)] jf(L7) NEXT:[read (Unit), r(2)] PREV:[r(2 > 3)] L8 [start finally]: r(2) NEXT:[jmp(L3 [loop exit point])] PREV:[jf(L7)] L9 [finish finally]: jmp(L3 [loop exit point]) NEXT:[read (Unit)] PREV:[r(2)] - jmp(L10) NEXT:[jmp(L11 [skipFinallyToErrorBlock])] PREV:[] L7: read (Unit) NEXT:[jmp(L11 [skipFinallyToErrorBlock])] PREV:[jf(L7)] L10: jmp(L11 [skipFinallyToErrorBlock]) NEXT:[r(2)] PREV:[read (Unit)] L6 [onExceptionToFinallyBlock]: r(2) NEXT:[jmp(error)] PREV:[jmp?(L6 [onExceptionToFinallyBlock])] jmp(error) NEXT:[] PREV:[r(2)] L11 [skipFinallyToErrorBlock]: r(2) NEXT:[jmp(L2 [loop entry point])] PREV:[jmp(L11 [skipFinallyToErrorBlock])] jmp(L2 [loop entry point]) NEXT:[r(true)] PREV:[r(2)] L3 [loop exit point]: read (Unit) NEXT:[] PREV:[jmp(L3 [loop exit point])] L1: NEXT:[] PREV:[read (Unit)] error: NEXT:[] PREV:[jmp(error)] sink: NEXT:[] PREV:[, ] ===================== == t6 == fun t6() { try { @ while(true) { 1 if (2 > 3) { break @ } } 5 } finally { 2 } } --------------------- L0: NEXT:[r(try { @ while(true) { 1 if..)] PREV:[] r(try { @ while(true) { 1 if (2 > 3) { break @ } } 5 } finally { 2 }) NEXT:[jmp?(L2 [onExceptionToFinallyBlock])] PREV:[] jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[r(2), r(while(true) { 1 if (2 > 3)..)] PREV:[r(try { @ while(true) { 1 if..)] r(while(true) { 1 if (2 > 3) { break @ } }) NEXT:[r(true)] PREV:[jmp?(L2 [onExceptionToFinallyBlock])] L3 [loop entry point]: L6 [condition entry point]: r(true) NEXT:[r(1)] PREV:[r(while(true) { 1 if (2 > 3)..), jmp(L3 [loop entry point])] L5 [body entry point]: r(1) NEXT:[r(2)] PREV:[r(true)] r(2) NEXT:[r(3)] PREV:[r(1)] r(3) NEXT:[r(>)] PREV:[r(2)] r(>) NEXT:[r(2 > 3)] PREV:[r(3)] r(2 > 3) NEXT:[jf(L7)] PREV:[r(>)] jf(L7) NEXT:[read (Unit), jmp(L4 [loop exit point])] PREV:[r(2 > 3)] jmp(L4 [loop exit point]) NEXT:[read (Unit)] PREV:[jf(L7)] - jmp(L8) NEXT:[jmp(L3 [loop entry point])] PREV:[] L7: read (Unit) NEXT:[jmp(L3 [loop entry point])] PREV:[jf(L7)] L8: jmp(L3 [loop entry point]) NEXT:[r(true)] PREV:[read (Unit)] L4 [loop exit point]: read (Unit) NEXT:[r(5)] PREV:[jmp(L4 [loop exit point])] r(5) NEXT:[jmp(L9 [skipFinallyToErrorBlock])] PREV:[read (Unit)] jmp(L9 [skipFinallyToErrorBlock]) NEXT:[r(2)] PREV:[r(5)] L2 [onExceptionToFinallyBlock]: L10 [start finally]: r(2) NEXT:[jmp(error)] PREV:[jmp?(L2 [onExceptionToFinallyBlock])] L11 [finish finally]: jmp(error) NEXT:[] PREV:[r(2)] L9 [skipFinallyToErrorBlock]: r(2) NEXT:[] PREV:[jmp(L9 [skipFinallyToErrorBlock])] L1: NEXT:[] PREV:[r(2)] error: NEXT:[] PREV:[jmp(error)] sink: NEXT:[] PREV:[, ] ===================== == t7 == fun t7() { try { @ while(true) { 1 if (2 > 3) { break @ } } } finally { 2 } } --------------------- L0: NEXT:[r(try { @ while(true) { 1 if..)] PREV:[] r(try { @ while(true) { 1 if (2 > 3) { break @ } } } finally { 2 }) NEXT:[jmp?(L2 [onExceptionToFinallyBlock])] PREV:[] jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[r(2), r(while(true) { 1 if (2 > 3)..)] PREV:[r(try { @ while(true) { 1 if..)] r(while(true) { 1 if (2 > 3) { break @ } }) NEXT:[r(true)] PREV:[jmp?(L2 [onExceptionToFinallyBlock])] L3 [loop entry point]: L6 [condition entry point]: r(true) NEXT:[r(1)] PREV:[r(while(true) { 1 if (2 > 3)..), jmp(L3 [loop entry point])] L5 [body entry point]: r(1) NEXT:[r(2)] PREV:[r(true)] r(2) NEXT:[r(3)] PREV:[r(1)] r(3) NEXT:[r(>)] PREV:[r(2)] r(>) NEXT:[r(2 > 3)] PREV:[r(3)] r(2 > 3) NEXT:[jf(L7)] PREV:[r(>)] jf(L7) NEXT:[read (Unit), jmp(L4 [loop exit point])] PREV:[r(2 > 3)] jmp(L4 [loop exit point]) NEXT:[read (Unit)] PREV:[jf(L7)] - jmp(L8) NEXT:[jmp(L3 [loop entry point])] PREV:[] L7: read (Unit) NEXT:[jmp(L3 [loop entry point])] PREV:[jf(L7)] L8: jmp(L3 [loop entry point]) NEXT:[r(true)] PREV:[read (Unit)] L4 [loop exit point]: read (Unit) NEXT:[jmp(L9 [skipFinallyToErrorBlock])] PREV:[jmp(L4 [loop exit point])] jmp(L9 [skipFinallyToErrorBlock]) NEXT:[r(2)] PREV:[read (Unit)] L2 [onExceptionToFinallyBlock]: L10 [start finally]: r(2) NEXT:[jmp(error)] PREV:[jmp?(L2 [onExceptionToFinallyBlock])] L11 [finish finally]: jmp(error) NEXT:[] PREV:[r(2)] L9 [skipFinallyToErrorBlock]: r(2) NEXT:[] PREV:[jmp(L9 [skipFinallyToErrorBlock])] L1: NEXT:[] PREV:[r(2)] error: NEXT:[] PREV:[jmp(error)] sink: NEXT:[] PREV:[, ] ===================== == t8 == fun t8(a : Int) { @ for (i in 1..a) { try { 1 if (2 > 3) { continue @ } } finally { 2 } } } --------------------- L0: NEXT:[v(a : Int)] PREV:[] v(a : Int) NEXT:[w(a)] PREV:[] w(a) NEXT:[r(for (i in 1..a) { try { 1 ..)] PREV:[v(a : Int)] r(for (i in 1..a) { try { 1 if (2 > 3) { continue @ } } finally { 2 } }) NEXT:[r(1)] PREV:[w(a)] r(1) NEXT:[r(a)] PREV:[r(for (i in 1..a) { try { 1 ..)] r(a) NEXT:[r(..)] PREV:[r(1)] r(..) NEXT:[r(1..a)] PREV:[r(a)] r(1..a) NEXT:[v(i)] PREV:[r(..)] v(i) NEXT:[w(i)] PREV:[r(1..a)] w(i) NEXT:[jmp?(L2)] PREV:[v(i)] L3: jmp?(L2) NEXT:[read (Unit), r(try { 1 if (2 > 3) { conti..)] PREV:[w(i)] L4 [loop entry point]: L5 [body entry point]: r(try { 1 if (2 > 3) { continue @ } } finally { 2 }) NEXT:[jmp?(L6 [onExceptionToFinallyBlock])] PREV:[jmp?(L2), jmp(L4 [loop entry point]), jmp?(L4 [loop entry point])] jmp?(L6 [onExceptionToFinallyBlock]) NEXT:[r(2), r(1)] PREV:[r(try { 1 if (2 > 3) { conti..)] r(1) NEXT:[r(2)] PREV:[jmp?(L6 [onExceptionToFinallyBlock])] r(2) NEXT:[r(3)] PREV:[r(1)] r(3) NEXT:[r(>)] PREV:[r(2)] r(>) NEXT:[r(2 > 3)] PREV:[r(3)] r(2 > 3) NEXT:[jf(L7)] PREV:[r(>)] jf(L7) NEXT:[read (Unit), r(2)] PREV:[r(2 > 3)] L8 [start finally]: r(2) NEXT:[jmp(L4 [loop entry point])] PREV:[jf(L7)] L9 [finish finally]: jmp(L4 [loop entry point]) NEXT:[r(try { 1 if (2 > 3) { conti..)] PREV:[r(2)] - jmp(L10) NEXT:[jmp(L11 [skipFinallyToErrorBlock])] PREV:[] L7: read (Unit) NEXT:[jmp(L11 [skipFinallyToErrorBlock])] PREV:[jf(L7)] L10: jmp(L11 [skipFinallyToErrorBlock]) NEXT:[r(2)] PREV:[read (Unit)] L6 [onExceptionToFinallyBlock]: r(2) NEXT:[jmp(error)] PREV:[jmp?(L6 [onExceptionToFinallyBlock])] jmp(error) NEXT:[] PREV:[r(2)] L11 [skipFinallyToErrorBlock]: r(2) NEXT:[jmp?(L4 [loop entry point])] PREV:[jmp(L11 [skipFinallyToErrorBlock])] jmp?(L4 [loop entry point]) NEXT:[r(try { 1 if (2 > 3) { conti..), read (Unit)] PREV:[r(2)] L2: read (Unit) NEXT:[] PREV:[jmp?(L2), jmp?(L4 [loop entry point])] L1: NEXT:[] PREV:[read (Unit)] error: NEXT:[] PREV:[jmp(error)] sink: NEXT:[] PREV:[, ] ===================== == t9 == fun t9(a : Int) { try { @ for (i in 1..a) { 1 if (2 > 3) { continue @ } } 5 } finally { 2 } } --------------------- L0: NEXT:[v(a : Int)] PREV:[] v(a : Int) NEXT:[w(a)] PREV:[] w(a) NEXT:[r(try { @ for (i in 1..a) { ..)] PREV:[v(a : Int)] r(try { @ for (i in 1..a) { 1 if (2 > 3) { continue @ } } 5 } finally { 2 }) NEXT:[jmp?(L2 [onExceptionToFinallyBlock])] PREV:[w(a)] jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[r(2), r(for (i in 1..a) { 1 if (2 ..)] PREV:[r(try { @ for (i in 1..a) { ..)] r(for (i in 1..a) { 1 if (2 > 3) { continue @ } }) NEXT:[r(1)] PREV:[jmp?(L2 [onExceptionToFinallyBlock])] r(1) NEXT:[r(a)] PREV:[r(for (i in 1..a) { 1 if (2 ..)] r(a) NEXT:[r(..)] PREV:[r(1)] r(..) NEXT:[r(1..a)] PREV:[r(a)] r(1..a) NEXT:[v(i)] PREV:[r(..)] v(i) NEXT:[w(i)] PREV:[r(1..a)] w(i) NEXT:[jmp?(L3)] PREV:[v(i)] L4: jmp?(L3) NEXT:[read (Unit), r(1)] PREV:[w(i)] L5 [loop entry point]: L6 [body entry point]: r(1) NEXT:[r(2)] PREV:[jmp?(L3), jmp(L5 [loop entry point]), jmp?(L5 [loop entry point])] r(2) NEXT:[r(3)] PREV:[r(1)] r(3) NEXT:[r(>)] PREV:[r(2)] r(>) NEXT:[r(2 > 3)] PREV:[r(3)] r(2 > 3) NEXT:[jf(L7)] PREV:[r(>)] jf(L7) NEXT:[read (Unit), jmp(L5 [loop entry point])] PREV:[r(2 > 3)] jmp(L5 [loop entry point]) NEXT:[r(1)] PREV:[jf(L7)] - jmp(L8) NEXT:[jmp?(L5 [loop entry point])] PREV:[] L7: read (Unit) NEXT:[jmp?(L5 [loop entry point])] PREV:[jf(L7)] L8: jmp?(L5 [loop entry point]) NEXT:[r(1), read (Unit)] PREV:[read (Unit)] L3: read (Unit) NEXT:[r(5)] PREV:[jmp?(L3), jmp?(L5 [loop entry point])] r(5) NEXT:[jmp(L9 [skipFinallyToErrorBlock])] PREV:[read (Unit)] jmp(L9 [skipFinallyToErrorBlock]) NEXT:[r(2)] PREV:[r(5)] L2 [onExceptionToFinallyBlock]: L10 [start finally]: r(2) NEXT:[jmp(error)] PREV:[jmp?(L2 [onExceptionToFinallyBlock])] L11 [finish finally]: jmp(error) NEXT:[] PREV:[r(2)] L9 [skipFinallyToErrorBlock]: r(2) NEXT:[] PREV:[jmp(L9 [skipFinallyToErrorBlock])] L1: NEXT:[] PREV:[r(2)] error: NEXT:[] PREV:[jmp(error)] sink: NEXT:[] PREV:[, ] ===================== == t10 == fun t10(a : Int) { try { @ for (i in 1..a) { 1 if (2 > 3) { continue @ } } } finally { 2 } } --------------------- L0: NEXT:[v(a : Int)] PREV:[] v(a : Int) NEXT:[w(a)] PREV:[] w(a) NEXT:[r(try { @ for (i in 1..a) { ..)] PREV:[v(a : Int)] r(try { @ for (i in 1..a) { 1 if (2 > 3) { continue @ } } } finally { 2 }) NEXT:[jmp?(L2 [onExceptionToFinallyBlock])] PREV:[w(a)] jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[r(2), r(for (i in 1..a) { 1 if (2 ..)] PREV:[r(try { @ for (i in 1..a) { ..)] r(for (i in 1..a) { 1 if (2 > 3) { continue @ } }) NEXT:[r(1)] PREV:[jmp?(L2 [onExceptionToFinallyBlock])] r(1) NEXT:[r(a)] PREV:[r(for (i in 1..a) { 1 if (2 ..)] r(a) NEXT:[r(..)] PREV:[r(1)] r(..) NEXT:[r(1..a)] PREV:[r(a)] r(1..a) NEXT:[v(i)] PREV:[r(..)] v(i) NEXT:[w(i)] PREV:[r(1..a)] w(i) NEXT:[jmp?(L3)] PREV:[v(i)] L4: jmp?(L3) NEXT:[read (Unit), r(1)] PREV:[w(i)] L5 [loop entry point]: L6 [body entry point]: r(1) NEXT:[r(2)] PREV:[jmp?(L3), jmp(L5 [loop entry point]), jmp?(L5 [loop entry point])] r(2) NEXT:[r(3)] PREV:[r(1)] r(3) NEXT:[r(>)] PREV:[r(2)] r(>) NEXT:[r(2 > 3)] PREV:[r(3)] r(2 > 3) NEXT:[jf(L7)] PREV:[r(>)] jf(L7) NEXT:[read (Unit), jmp(L5 [loop entry point])] PREV:[r(2 > 3)] jmp(L5 [loop entry point]) NEXT:[r(1)] PREV:[jf(L7)] - jmp(L8) NEXT:[jmp?(L5 [loop entry point])] PREV:[] L7: read (Unit) NEXT:[jmp?(L5 [loop entry point])] PREV:[jf(L7)] L8: jmp?(L5 [loop entry point]) NEXT:[r(1), read (Unit)] PREV:[read (Unit)] L3: read (Unit) NEXT:[jmp(L9 [skipFinallyToErrorBlock])] PREV:[jmp?(L3), jmp?(L5 [loop entry point])] jmp(L9 [skipFinallyToErrorBlock]) NEXT:[r(2)] PREV:[read (Unit)] L2 [onExceptionToFinallyBlock]: L10 [start finally]: r(2) NEXT:[jmp(error)] PREV:[jmp?(L2 [onExceptionToFinallyBlock])] L11 [finish finally]: jmp(error) NEXT:[] PREV:[r(2)] L9 [skipFinallyToErrorBlock]: r(2) NEXT:[] PREV:[jmp(L9 [skipFinallyToErrorBlock])] L1: NEXT:[] PREV:[r(2)] error: NEXT:[] PREV:[jmp(error)] sink: NEXT:[] PREV:[, ] ===================== == t11 == fun t11() { try { return 1 } finally { return 2 } } --------------------- L0: NEXT:[r(try { return 1 } finally {..)] PREV:[] r(try { return 1 } finally { return 2 }) NEXT:[jmp?(L2 [onExceptionToFinallyBlock])] PREV:[] jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[r(2), r(1)] PREV:[r(try { return 1 } finally {..)] r(1) NEXT:[r(2)] PREV:[jmp?(L2 [onExceptionToFinallyBlock])] L3 [start finally]: r(2) NEXT:[ret(*) L1] PREV:[r(1)] ret(*) L1 NEXT:[] PREV:[r(2)] L4 [finish finally]: - ret(*) L1 NEXT:[] PREV:[] - jmp(L5 [skipFinallyToErrorBlock]) NEXT:[r(2)] PREV:[] L2 [onExceptionToFinallyBlock]: r(2) NEXT:[ret(*) L1] PREV:[jmp?(L2 [onExceptionToFinallyBlock])] ret(*) L1 NEXT:[] PREV:[r(2)] - jmp(error) NEXT:[] PREV:[] L5 [skipFinallyToErrorBlock]: - r(2) NEXT:[ret(*) L1] PREV:[] - ret(*) L1 NEXT:[] PREV:[] L1: NEXT:[] PREV:[ret(*) L1, ret(*) L1] error: NEXT:[] PREV:[] sink: NEXT:[] PREV:[, ] ===================== == t12 == fun t12() : Int { try { return 1 } finally { doSmth(3) } } --------------------- L0: NEXT:[r(try { return 1 } finally {..)] PREV:[] r(try { return 1 } finally { doSmth(3) }) NEXT:[jmp?(L2 [onExceptionToFinallyBlock])] PREV:[] jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[r(3), r(1)] PREV:[r(try { return 1 } finally {..)] r(1) NEXT:[r(3)] PREV:[jmp?(L2 [onExceptionToFinallyBlock])] L3 [start finally]: r(3) NEXT:[r(doSmth)] PREV:[r(1)] r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] r(doSmth(3)) NEXT:[ret(*) L1] PREV:[r(doSmth)] L4 [finish finally]: ret(*) L1 NEXT:[] PREV:[r(doSmth(3))] - jmp(L5 [skipFinallyToErrorBlock]) NEXT:[r(3)] PREV:[] L2 [onExceptionToFinallyBlock]: r(3) NEXT:[r(doSmth)] PREV:[jmp?(L2 [onExceptionToFinallyBlock])] r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] r(doSmth(3)) NEXT:[jmp(error)] PREV:[r(doSmth)] jmp(error) NEXT:[] PREV:[r(doSmth(3))] L5 [skipFinallyToErrorBlock]: - r(3) NEXT:[r(doSmth)] PREV:[] - r(doSmth) NEXT:[r(doSmth(3))] PREV:[] - r(doSmth(3)) NEXT:[] PREV:[] L1: NEXT:[] PREV:[ret(*) L1] error: NEXT:[] PREV:[jmp(error)] sink: NEXT:[] PREV:[, ] ===================== == t13 == fun t13() : Int { try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } finally { doSmth(3) } } --------------------- L0: NEXT:[r(try { return 1 } catch (e:..)] PREV:[] r(try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } finally { doSmth(3) }) NEXT:[jmp?(L2 [onException])] PREV:[] jmp?(L2 [onException]) NEXT:[v(e: UnsupportedOperationException), jmp?(L3 [onExceptionToFinallyBlock])] PREV:[r(try { return 1 } catch (e:..)] jmp?(L3 [onExceptionToFinallyBlock]) NEXT:[r(3), r(1)] PREV:[jmp?(L2 [onException])] r(1) NEXT:[r(3)] PREV:[jmp?(L3 [onExceptionToFinallyBlock])] L4 [start finally]: r(3) NEXT:[r(doSmth)] PREV:[r(1)] r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] r(doSmth(3)) NEXT:[ret(*) L1] PREV:[r(doSmth)] L5 [finish finally]: ret(*) L1 NEXT:[] PREV:[r(doSmth(3))] - jmp(L6 [afterCatches]) NEXT:[jmp(L7 [skipFinallyToErrorBlock])] PREV:[] L2 [onException]: v(e: UnsupportedOperationException) NEXT:[w(e)] PREV:[jmp?(L2 [onException])] w(e) NEXT:[r(2)] PREV:[v(e: UnsupportedOperationException)] r(2) NEXT:[r(doSmth)] PREV:[w(e)] r(doSmth) NEXT:[r(doSmth(2))] PREV:[r(2)] r(doSmth(2)) NEXT:[jmp(L6 [afterCatches])] PREV:[r(doSmth)] jmp(L6 [afterCatches]) NEXT:[jmp(L7 [skipFinallyToErrorBlock])] PREV:[r(doSmth(2))] L6 [afterCatches]: jmp(L7 [skipFinallyToErrorBlock]) NEXT:[r(3)] PREV:[jmp(L6 [afterCatches])] L3 [onExceptionToFinallyBlock]: r(3) NEXT:[r(doSmth)] PREV:[jmp?(L3 [onExceptionToFinallyBlock])] r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] r(doSmth(3)) NEXT:[jmp(error)] PREV:[r(doSmth)] jmp(error) NEXT:[] PREV:[r(doSmth(3))] L7 [skipFinallyToErrorBlock]: r(3) NEXT:[r(doSmth)] PREV:[jmp(L7 [skipFinallyToErrorBlock])] r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] r(doSmth(3)) NEXT:[] PREV:[r(doSmth)] L1: NEXT:[] PREV:[ret(*) L1, r(doSmth(3))] error: NEXT:[] PREV:[jmp(error)] sink: NEXT:[] PREV:[, ] ===================== == t14 == fun t14() : Int { try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } } --------------------- L0: NEXT:[r(try { return 1 } catch (e:..)] PREV:[] r(try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) }) NEXT:[jmp?(L2 [onException])] PREV:[] jmp?(L2 [onException]) NEXT:[v(e: UnsupportedOperationException), r(1)] PREV:[r(try { return 1 } catch (e:..)] r(1) NEXT:[ret(*) L1] PREV:[jmp?(L2 [onException])] ret(*) L1 NEXT:[] PREV:[r(1)] - jmp(L3 [afterCatches]) NEXT:[] PREV:[] L2 [onException]: v(e: UnsupportedOperationException) NEXT:[w(e)] PREV:[jmp?(L2 [onException])] w(e) NEXT:[r(2)] PREV:[v(e: UnsupportedOperationException)] r(2) NEXT:[r(doSmth)] PREV:[w(e)] r(doSmth) NEXT:[r(doSmth(2))] PREV:[r(2)] r(doSmth(2)) NEXT:[jmp(L3 [afterCatches])] PREV:[r(doSmth)] jmp(L3 [afterCatches]) NEXT:[] PREV:[r(doSmth(2))] L1: L3 [afterCatches]: NEXT:[] PREV:[ret(*) L1, jmp(L3 [afterCatches])] error: NEXT:[] PREV:[] sink: NEXT:[] PREV:[, ] ===================== == t15 == fun t15() : Int { try { return 1 } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) } } --------------------- L0: NEXT:[r(try { return 1 } catch (e:..)] PREV:[] r(try { return 1 } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) }) NEXT:[jmp?(L2 [onException])] PREV:[] jmp?(L2 [onException]) NEXT:[v(e: UnsupportedOperationException), jmp?(L3 [onExceptionToFinallyBlock])] PREV:[r(try { return 1 } catch (e:..)] jmp?(L3 [onExceptionToFinallyBlock]) NEXT:[r(3), r(1)] PREV:[jmp?(L2 [onException])] r(1) NEXT:[r(3)] PREV:[jmp?(L3 [onExceptionToFinallyBlock])] L4 [start finally]: r(3) NEXT:[r(doSmth)] PREV:[r(1)] r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] r(doSmth(3)) NEXT:[ret(*) L1] PREV:[r(doSmth)] L5 [finish finally]: ret(*) L1 NEXT:[] PREV:[r(doSmth(3))] - jmp(L6 [afterCatches]) NEXT:[jmp(L7 [skipFinallyToErrorBlock])] PREV:[] L2 [onException]: v(e: UnsupportedOperationException) NEXT:[w(e)] PREV:[jmp?(L2 [onException])] w(e) NEXT:[r(2)] PREV:[v(e: UnsupportedOperationException)] r(2) NEXT:[r(3)] PREV:[w(e)] r(3) NEXT:[r(doSmth)] PREV:[r(2)] r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] r(doSmth(3)) NEXT:[ret(*) L1] PREV:[r(doSmth)] ret(*) L1 NEXT:[] PREV:[r(doSmth(3))] - jmp(L6 [afterCatches]) NEXT:[jmp(L7 [skipFinallyToErrorBlock])] PREV:[] L6 [afterCatches]: - jmp(L7 [skipFinallyToErrorBlock]) NEXT:[r(3)] PREV:[] L3 [onExceptionToFinallyBlock]: r(3) NEXT:[r(doSmth)] PREV:[jmp?(L3 [onExceptionToFinallyBlock])] r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] r(doSmth(3)) NEXT:[jmp(error)] PREV:[r(doSmth)] jmp(error) NEXT:[] PREV:[r(doSmth(3))] L7 [skipFinallyToErrorBlock]: - r(3) NEXT:[r(doSmth)] PREV:[] - r(doSmth) NEXT:[r(doSmth(3))] PREV:[] - r(doSmth(3)) NEXT:[] PREV:[] L1: NEXT:[] PREV:[ret(*) L1, ret(*) L1] error: NEXT:[] PREV:[jmp(error)] sink: NEXT:[] PREV:[, ] ===================== == t16 == fun t16() : Int { try { doSmth(1) } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) } } --------------------- L0: NEXT:[r(try { doSmth(1) } catch (e..)] PREV:[] r(try { doSmth(1) } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) }) NEXT:[jmp?(L2 [onException])] PREV:[] jmp?(L2 [onException]) NEXT:[v(e: UnsupportedOperationException), jmp?(L3 [onExceptionToFinallyBlock])] PREV:[r(try { doSmth(1) } catch (e..)] jmp?(L3 [onExceptionToFinallyBlock]) NEXT:[r(3), r(1)] PREV:[jmp?(L2 [onException])] r(1) NEXT:[r(doSmth)] PREV:[jmp?(L3 [onExceptionToFinallyBlock])] r(doSmth) NEXT:[r(doSmth(1))] PREV:[r(1)] r(doSmth(1)) NEXT:[jmp(L4 [afterCatches])] PREV:[r(doSmth)] jmp(L4 [afterCatches]) NEXT:[jmp(L7 [skipFinallyToErrorBlock])] PREV:[r(doSmth(1))] L2 [onException]: v(e: UnsupportedOperationException) NEXT:[w(e)] PREV:[jmp?(L2 [onException])] w(e) NEXT:[r(2)] PREV:[v(e: UnsupportedOperationException)] r(2) NEXT:[r(3)] PREV:[w(e)] L5 [start finally]: r(3) NEXT:[r(doSmth)] PREV:[r(2)] r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] r(doSmth(3)) NEXT:[ret(*) L1] PREV:[r(doSmth)] L6 [finish finally]: ret(*) L1 NEXT:[] PREV:[r(doSmth(3))] - jmp(L4 [afterCatches]) NEXT:[jmp(L7 [skipFinallyToErrorBlock])] PREV:[] L4 [afterCatches]: jmp(L7 [skipFinallyToErrorBlock]) NEXT:[r(3)] PREV:[jmp(L4 [afterCatches])] L3 [onExceptionToFinallyBlock]: r(3) NEXT:[r(doSmth)] PREV:[jmp?(L3 [onExceptionToFinallyBlock])] r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] r(doSmth(3)) NEXT:[jmp(error)] PREV:[r(doSmth)] jmp(error) NEXT:[] PREV:[r(doSmth(3))] L7 [skipFinallyToErrorBlock]: r(3) NEXT:[r(doSmth)] PREV:[jmp(L7 [skipFinallyToErrorBlock])] r(doSmth) NEXT:[r(doSmth(3))] PREV:[r(3)] r(doSmth(3)) NEXT:[] PREV:[r(doSmth)] L1: NEXT:[] PREV:[ret(*) L1, r(doSmth(3))] error: NEXT:[] PREV:[jmp(error)] sink: NEXT:[] PREV:[, ] ===================== == doSmth == fun doSmth(i: Int) { } --------------------- L0: NEXT:[v(i: Int)] PREV:[] v(i: Int) NEXT:[w(i)] PREV:[] w(i) NEXT:[read (Unit)] PREV:[v(i: Int)] read (Unit) NEXT:[] PREV:[w(i)] L1: NEXT:[] PREV:[read (Unit)] error: NEXT:[] PREV:[] sink: NEXT:[] PREV:[, ] =====================