| == foo == |
| fun foo(): Int { |
| var i = 0 |
| try { |
| i = 1 |
| } |
| finally { |
| fun bar() {} |
| return i |
| } |
| } |
| --------------------- |
| L0: |
| 1 <START> |
| 2 mark({ var i = 0 try { i = 1 } finally { fun bar() {} return i } }) |
| v(var i = 0) |
| r(0) -> <v0> |
| w(i|<v0>) |
| 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) -> <v1> |
| w(i|<v1>) |
| 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) -> <v3>, d(fun bar() {})] |
| d(fun bar() {}) NEXT:[<SINK>] |
| L5 [after local declaration]: |
| r(i) -> <v3> PREV:[jmp?(L5)] |
| ret(*|<v3>) L1 NEXT:[<END>] |
| L8 [finish finally]: |
| - 2 jmp(error) NEXT:[<ERROR>] PREV:[] |
| L3 [skipFinallyToErrorBlock]: |
| L9 [copy of L2, onExceptionToFinallyBlock]: |
| 3 mark({ fun bar() {} return i }) PREV:[jmp(L3)] |
| jmp?(L10) NEXT:[r(i) -> <v3>, d(fun bar() {})] |
| d(fun bar() {}) NEXT:[<SINK>] |
| L10 [copy of L5, after local declaration]: |
| r(i) -> <v3> PREV:[jmp?(L10)] |
| ret(*|<v3>) L1 NEXT:[<END>] |
| - 2 merge(try { i = 1 } finally { fun bar() {} return i }|!<v2>) -> <v5> PREV:[] |
| L1: |
| 1 <END> NEXT:[<SINK>] PREV:[ret(*|<v3>) L1, ret(*|<v3>) L1] |
| error: |
| <ERROR> PREV:[] |
| sink: |
| <SINK> PREV:[<ERROR>, <END>, d(fun bar() {}), d(fun bar() {})] |
| ===================== |
| == bar == |
| fun bar() {} |
| --------------------- |
| L6: |
| 4 <START> |
| 5 mark({}) |
| read (Unit) |
| L7: |
| 4 <END> NEXT:[<SINK>] |
| error: |
| <ERROR> PREV:[] |
| sink: |
| <SINK> PREV:[<ERROR>, <END>] |
| ===================== |
| == bar == |
| fun bar() {} |
| --------------------- |
| L2 [copy of L6, null]: |
| 4 <START> |
| 5 mark({}) |
| read (Unit) |
| L3 [copy of L7, null]: |
| 4 <END> NEXT:[<SINK>] |
| L0 [copy of error, null]: |
| <ERROR> PREV:[] |
| L1 [copy of sink, null]: |
| <SINK> PREV:[<ERROR>, <END>] |
| ===================== |