Pseudocode: Generate fake values for Unit/Nothing-typed expressions
This commit is contained in:
@@ -143,12 +143,13 @@ L4:
|
||||
jf(L6|<v2>) NEXT:[read (Unit), mark({ return@l })]
|
||||
6 mark({ return@l })
|
||||
ret L5 NEXT:[<END>]
|
||||
- 5 jmp(L7) NEXT:[<END>] PREV:[]
|
||||
- 5 jmp(L7) NEXT:[ret(*|!<v3>) L5] PREV:[]
|
||||
L6:
|
||||
read (Unit) PREV:[jf(L6|<v2>)]
|
||||
L5:
|
||||
L7:
|
||||
4 <END> NEXT:[<SINK>] PREV:[ret L5, read (Unit)]
|
||||
4 ret(*|!<v3>) L5
|
||||
L5:
|
||||
<END> NEXT:[<SINK>] PREV:[ret L5, ret(*|!<v3>) L5]
|
||||
error:
|
||||
<ERROR> PREV:[]
|
||||
sink:
|
||||
@@ -227,8 +228,9 @@ L5 [onExceptionToFinallyBlock]:
|
||||
L10 [skipFinallyToErrorBlock]:
|
||||
7 mark({ 2 }) PREV:[jmp(L10 [skipFinallyToErrorBlock])]
|
||||
r(2) -> <v4>
|
||||
3 ret(*|!<v5>) L4
|
||||
L4:
|
||||
3 <END> NEXT:[<SINK>] PREV:[ret L4, r(2) -> <v4>]
|
||||
<END> NEXT:[<SINK>] PREV:[ret L4, ret(*|!<v5>) L4]
|
||||
error:
|
||||
<ERROR> PREV:[jmp(error)]
|
||||
sink:
|
||||
@@ -342,17 +344,17 @@ L8:
|
||||
3 jmp(L3 [loop entry point]) NEXT:[r(true) -> <v0>]
|
||||
L4 [loop exit point]:
|
||||
read (Unit) PREV:[jmp(L4 [loop exit point])]
|
||||
r(5) -> <v6>
|
||||
r(5) -> <v8>
|
||||
2 jmp(L9 [skipFinallyToErrorBlock]) NEXT:[mark({ 2 })]
|
||||
L2 [onExceptionToFinallyBlock]:
|
||||
L10 [start finally]:
|
||||
3 mark({ 2 }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])]
|
||||
r(2) -> <v7>
|
||||
r(2) -> <v9>
|
||||
L11 [finish finally]:
|
||||
2 jmp(error) NEXT:[<ERROR>]
|
||||
L9 [skipFinallyToErrorBlock]:
|
||||
3 mark({ 2 }) PREV:[jmp(L9 [skipFinallyToErrorBlock])]
|
||||
r(2) -> <v7>
|
||||
r(2) -> <v9>
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -408,12 +410,12 @@ L4 [loop exit point]:
|
||||
L2 [onExceptionToFinallyBlock]:
|
||||
L10 [start finally]:
|
||||
3 mark({ 2 }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])]
|
||||
r(2) -> <v6>
|
||||
r(2) -> <v8>
|
||||
L11 [finish finally]:
|
||||
2 jmp(error) NEXT:[<ERROR>]
|
||||
L9 [skipFinallyToErrorBlock]:
|
||||
3 mark({ 2 }) PREV:[jmp(L9 [skipFinallyToErrorBlock])]
|
||||
r(2) -> <v6>
|
||||
r(2) -> <v8>
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -547,17 +549,17 @@ L8:
|
||||
4 jmp?(L5 [loop entry point]) NEXT:[magic[LOOP_RANGE_ITERATION](1..a|<v3>) -> <v4>, read (Unit)]
|
||||
L3:
|
||||
read (Unit) PREV:[jmp?(L3), jmp?(L5 [loop entry point])]
|
||||
3 r(5) -> <v9>
|
||||
3 r(5) -> <v11>
|
||||
2 jmp(L9 [skipFinallyToErrorBlock]) NEXT:[mark({ 2 })]
|
||||
L2 [onExceptionToFinallyBlock]:
|
||||
L10 [start finally]:
|
||||
3 mark({ 2 }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])]
|
||||
r(2) -> <v10>
|
||||
r(2) -> <v12>
|
||||
L11 [finish finally]:
|
||||
2 jmp(error) NEXT:[<ERROR>]
|
||||
L9 [skipFinallyToErrorBlock]:
|
||||
3 mark({ 2 }) PREV:[jmp(L9 [skipFinallyToErrorBlock])]
|
||||
r(2) -> <v10>
|
||||
r(2) -> <v12>
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -622,12 +624,12 @@ L3:
|
||||
L2 [onExceptionToFinallyBlock]:
|
||||
L10 [start finally]:
|
||||
3 mark({ 2 }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])]
|
||||
r(2) -> <v9>
|
||||
r(2) -> <v11>
|
||||
L11 [finish finally]:
|
||||
2 jmp(error) NEXT:[<ERROR>]
|
||||
L9 [skipFinallyToErrorBlock]:
|
||||
3 mark({ 2 }) PREV:[jmp(L9 [skipFinallyToErrorBlock])]
|
||||
r(2) -> <v9>
|
||||
r(2) -> <v11>
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -735,8 +737,8 @@ L0:
|
||||
1 <START>
|
||||
2 mark({ try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } finally { doSmth(3) } })
|
||||
mark(try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } finally { doSmth(3) })
|
||||
jmp?(L2 [onException]) NEXT:[v(e: UnsupportedOperationException), jmp?(L3 [onExceptionToFinallyBlock])]
|
||||
jmp?(L3 [onExceptionToFinallyBlock]) NEXT:[mark({ doSmth(3) }), mark({ return 1 })]
|
||||
jmp?(L2 [onException]) NEXT:[v(e: UnsupportedOperationException), jmp?(L3 [onExceptionToFinallyBlock])]
|
||||
jmp?(L3 [onExceptionToFinallyBlock]) NEXT:[mark({ doSmth(3) }), mark({ return 1 })]
|
||||
3 mark({ return 1 })
|
||||
r(1) -> <v0>
|
||||
L4 [start finally]:
|
||||
@@ -745,36 +747,37 @@ L4 [start finally]:
|
||||
mark(doSmth(3))
|
||||
call(doSmth(3), doSmth|<v1>) -> <v2>
|
||||
L5 [finish finally]:
|
||||
3 ret(*|<v0>) L1 NEXT:[<END>]
|
||||
- 2 jmp(L6 [afterCatches]) NEXT:[jmp(L7 [skipFinallyToErrorBlock])] PREV:[]
|
||||
3 ret(*|<v0>) L1 NEXT:[<END>]
|
||||
- 2 jmp(L6 [afterCatches]) NEXT:[jmp(L7 [skipFinallyToErrorBlock])] PREV:[]
|
||||
L2 [onException]:
|
||||
3 v(e: UnsupportedOperationException) PREV:[jmp?(L2 [onException])]
|
||||
magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v3>
|
||||
w(e|<v3>)
|
||||
3 v(e: UnsupportedOperationException) PREV:[jmp?(L2 [onException])]
|
||||
magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v4>
|
||||
w(e|<v4>)
|
||||
4 mark({ doSmth(2) })
|
||||
r(2) -> <v4>
|
||||
r(2) -> <v5>
|
||||
mark(doSmth(2))
|
||||
call(doSmth(2), doSmth|<v4>) -> <v5>
|
||||
call(doSmth(2), doSmth|<v5>) -> <v6>
|
||||
3 jmp(L6 [afterCatches])
|
||||
L6 [afterCatches]:
|
||||
2 jmp(L7 [skipFinallyToErrorBlock]) NEXT:[mark({ doSmth(3) })]
|
||||
2 jmp(L7 [skipFinallyToErrorBlock]) NEXT:[mark({ doSmth(3) })]
|
||||
L3 [onExceptionToFinallyBlock]:
|
||||
4 mark({ doSmth(3) }) PREV:[jmp?(L3 [onExceptionToFinallyBlock])]
|
||||
4 mark({ doSmth(3) }) PREV:[jmp?(L3 [onExceptionToFinallyBlock])]
|
||||
r(3) -> <v1>
|
||||
mark(doSmth(3))
|
||||
call(doSmth(3), doSmth|<v1>) -> <v2>
|
||||
2 jmp(error) NEXT:[<ERROR>]
|
||||
2 jmp(error) NEXT:[<ERROR>]
|
||||
L7 [skipFinallyToErrorBlock]:
|
||||
4 mark({ doSmth(3) }) PREV:[jmp(L7 [skipFinallyToErrorBlock])]
|
||||
4 mark({ doSmth(3) }) PREV:[jmp(L7 [skipFinallyToErrorBlock])]
|
||||
r(3) -> <v1>
|
||||
mark(doSmth(3))
|
||||
call(doSmth(3), doSmth|<v1>) -> <v2>
|
||||
2 merge(try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } finally { doSmth(3) }|!<v3>, <v6>) -> <v7>
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v0>) L1, call(doSmth(3), doSmth|<v1>) -> <v2>]
|
||||
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v0>) L1, merge(try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } finally { doSmth(3) }|!<v3>, <v6>) -> <v7>]
|
||||
error:
|
||||
<ERROR> PREV:[jmp(error)]
|
||||
<ERROR> PREV:[jmp(error)]
|
||||
sink:
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
=====================
|
||||
== t14 ==
|
||||
fun t14() : Int {
|
||||
@@ -790,27 +793,28 @@ L0:
|
||||
1 <START>
|
||||
2 mark({ try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } })
|
||||
mark(try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) })
|
||||
jmp?(L2 [onException]) NEXT:[v(e: UnsupportedOperationException), mark({ return 1 })]
|
||||
jmp?(L2 [onException]) NEXT:[v(e: UnsupportedOperationException), mark({ return 1 })]
|
||||
3 mark({ return 1 })
|
||||
r(1) -> <v0>
|
||||
ret(*|<v0>) L1 NEXT:[<END>]
|
||||
- 2 jmp(L3 [afterCatches]) NEXT:[<END>] PREV:[]
|
||||
ret(*|<v0>) L1 NEXT:[<END>]
|
||||
- 2 jmp(L3 [afterCatches]) NEXT:[merge(try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) }|!<v1>, <v4>) -> <v5>] PREV:[]
|
||||
L2 [onException]:
|
||||
3 v(e: UnsupportedOperationException) PREV:[jmp?(L2 [onException])]
|
||||
magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v1>
|
||||
w(e|<v1>)
|
||||
3 v(e: UnsupportedOperationException) PREV:[jmp?(L2 [onException])]
|
||||
magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v2>
|
||||
w(e|<v2>)
|
||||
4 mark({ doSmth(2) })
|
||||
r(2) -> <v2>
|
||||
r(2) -> <v3>
|
||||
mark(doSmth(2))
|
||||
call(doSmth(2), doSmth|<v2>) -> <v3>
|
||||
call(doSmth(2), doSmth|<v3>) -> <v4>
|
||||
3 jmp(L3 [afterCatches])
|
||||
L1:
|
||||
L3 [afterCatches]:
|
||||
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v0>) L1, jmp(L3 [afterCatches])]
|
||||
2 merge(try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) }|!<v1>, <v4>) -> <v5>
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v0>) L1, merge(try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) }|!<v1>, <v4>) -> <v5>]
|
||||
error:
|
||||
<ERROR> PREV:[]
|
||||
<ERROR> PREV:[]
|
||||
sink:
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
=====================
|
||||
== t15 ==
|
||||
fun t15() : Int {
|
||||
@@ -829,8 +833,8 @@ L0:
|
||||
1 <START>
|
||||
2 mark({ try { return 1 } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) } })
|
||||
mark(try { return 1 } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) })
|
||||
jmp?(L2 [onException]) NEXT:[v(e: UnsupportedOperationException), jmp?(L3 [onExceptionToFinallyBlock])]
|
||||
jmp?(L3 [onExceptionToFinallyBlock]) NEXT:[mark({ doSmth(3) }), mark({ return 1 })]
|
||||
jmp?(L2 [onException]) NEXT:[v(e: UnsupportedOperationException), jmp?(L3 [onExceptionToFinallyBlock])]
|
||||
jmp?(L3 [onExceptionToFinallyBlock]) NEXT:[mark({ doSmth(3) }), mark({ return 1 })]
|
||||
3 mark({ return 1 })
|
||||
r(1) -> <v0>
|
||||
L4 [start finally]:
|
||||
@@ -839,39 +843,40 @@ L4 [start finally]:
|
||||
mark(doSmth(3))
|
||||
call(doSmth(3), doSmth|<v1>) -> <v2>
|
||||
L5 [finish finally]:
|
||||
3 ret(*|<v0>) L1 NEXT:[<END>]
|
||||
- 2 jmp(L6 [afterCatches]) NEXT:[jmp(L7 [skipFinallyToErrorBlock])] PREV:[]
|
||||
3 ret(*|<v0>) L1 NEXT:[<END>]
|
||||
- 2 jmp(L6 [afterCatches]) NEXT:[jmp(L7 [skipFinallyToErrorBlock])] PREV:[]
|
||||
L2 [onException]:
|
||||
3 v(e: UnsupportedOperationException) PREV:[jmp?(L2 [onException])]
|
||||
magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v3>
|
||||
w(e|<v3>)
|
||||
3 v(e: UnsupportedOperationException) PREV:[jmp?(L2 [onException])]
|
||||
magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v4>
|
||||
w(e|<v4>)
|
||||
4 mark({ return 2 })
|
||||
r(2) -> <v4>
|
||||
r(2) -> <v5>
|
||||
mark({ doSmth(3) })
|
||||
r(3) -> <v1>
|
||||
mark(doSmth(3))
|
||||
call(doSmth(3), doSmth|<v1>) -> <v2>
|
||||
ret(*|<v4>) L1 NEXT:[<END>]
|
||||
- 3 jmp(L6 [afterCatches]) PREV:[]
|
||||
ret(*|<v5>) L1 NEXT:[<END>]
|
||||
- 3 jmp(L6 [afterCatches]) PREV:[]
|
||||
L6 [afterCatches]:
|
||||
- 2 jmp(L7 [skipFinallyToErrorBlock]) NEXT:[mark({ doSmth(3) })] PREV:[]
|
||||
- 2 jmp(L7 [skipFinallyToErrorBlock]) NEXT:[mark({ doSmth(3) })] PREV:[]
|
||||
L3 [onExceptionToFinallyBlock]:
|
||||
4 mark({ doSmth(3) }) PREV:[jmp?(L3 [onExceptionToFinallyBlock])]
|
||||
4 mark({ doSmth(3) }) PREV:[jmp?(L3 [onExceptionToFinallyBlock])]
|
||||
r(3) -> <v1>
|
||||
mark(doSmth(3))
|
||||
call(doSmth(3), doSmth|<v1>) -> <v2>
|
||||
2 jmp(error) NEXT:[<ERROR>]
|
||||
2 jmp(error) NEXT:[<ERROR>]
|
||||
L7 [skipFinallyToErrorBlock]:
|
||||
- 4 mark({ doSmth(3) }) PREV:[]
|
||||
- r(3) -> <v1> PREV:[]
|
||||
- mark(doSmth(3)) PREV:[]
|
||||
- call(doSmth(3), doSmth|<v1>) -> <v2> PREV:[]
|
||||
- 4 mark({ doSmth(3) }) PREV:[]
|
||||
- r(3) -> <v1> PREV:[]
|
||||
- mark(doSmth(3)) PREV:[]
|
||||
- call(doSmth(3), doSmth|<v1>) -> <v2> PREV:[]
|
||||
- 2 merge(try { return 1 } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) }|!<v3>, !<v6>) -> <v7> PREV:[]
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v0>) L1, ret(*|<v4>) L1]
|
||||
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v0>) L1, ret(*|<v5>) L1]
|
||||
error:
|
||||
<ERROR> PREV:[jmp(error)]
|
||||
<ERROR> PREV:[jmp(error)]
|
||||
sink:
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
=====================
|
||||
== t16 ==
|
||||
fun t16() : Int {
|
||||
@@ -890,15 +895,15 @@ L0:
|
||||
1 <START>
|
||||
2 mark({ try { doSmth(1) } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) } })
|
||||
mark(try { doSmth(1) } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) })
|
||||
jmp?(L2 [onException]) NEXT:[v(e: UnsupportedOperationException), jmp?(L3 [onExceptionToFinallyBlock])]
|
||||
jmp?(L3 [onExceptionToFinallyBlock]) NEXT:[mark({ doSmth(3) }), mark({ doSmth(1) })]
|
||||
jmp?(L2 [onException]) NEXT:[v(e: UnsupportedOperationException), jmp?(L3 [onExceptionToFinallyBlock])]
|
||||
jmp?(L3 [onExceptionToFinallyBlock]) NEXT:[mark({ doSmth(3) }), mark({ doSmth(1) })]
|
||||
3 mark({ doSmth(1) })
|
||||
r(1) -> <v0>
|
||||
mark(doSmth(1))
|
||||
call(doSmth(1), doSmth|<v0>) -> <v1>
|
||||
2 jmp(L4 [afterCatches]) NEXT:[jmp(L7 [skipFinallyToErrorBlock])]
|
||||
2 jmp(L4 [afterCatches]) NEXT:[jmp(L7 [skipFinallyToErrorBlock])]
|
||||
L2 [onException]:
|
||||
3 v(e: UnsupportedOperationException) PREV:[jmp?(L2 [onException])]
|
||||
3 v(e: UnsupportedOperationException) PREV:[jmp?(L2 [onException])]
|
||||
magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v2>
|
||||
w(e|<v2>)
|
||||
4 mark({ return 2 })
|
||||
@@ -909,27 +914,28 @@ L5 [start finally]:
|
||||
mark(doSmth(3))
|
||||
call(doSmth(3), doSmth|<v4>) -> <v5>
|
||||
L6 [finish finally]:
|
||||
4 ret(*|<v3>) L1 NEXT:[<END>]
|
||||
- 3 jmp(L4 [afterCatches]) PREV:[]
|
||||
4 ret(*|<v3>) L1 NEXT:[<END>]
|
||||
- 3 jmp(L4 [afterCatches]) PREV:[]
|
||||
L4 [afterCatches]:
|
||||
2 jmp(L7 [skipFinallyToErrorBlock]) NEXT:[mark({ doSmth(3) })] PREV:[jmp(L4 [afterCatches])]
|
||||
2 jmp(L7 [skipFinallyToErrorBlock]) NEXT:[mark({ doSmth(3) })] PREV:[jmp(L4 [afterCatches])]
|
||||
L3 [onExceptionToFinallyBlock]:
|
||||
5 mark({ doSmth(3) }) PREV:[jmp?(L3 [onExceptionToFinallyBlock])]
|
||||
5 mark({ doSmth(3) }) PREV:[jmp?(L3 [onExceptionToFinallyBlock])]
|
||||
r(3) -> <v4>
|
||||
mark(doSmth(3))
|
||||
call(doSmth(3), doSmth|<v4>) -> <v5>
|
||||
2 jmp(error) NEXT:[<ERROR>]
|
||||
2 jmp(error) NEXT:[<ERROR>]
|
||||
L7 [skipFinallyToErrorBlock]:
|
||||
5 mark({ doSmth(3) }) PREV:[jmp(L7 [skipFinallyToErrorBlock])]
|
||||
5 mark({ doSmth(3) }) PREV:[jmp(L7 [skipFinallyToErrorBlock])]
|
||||
r(3) -> <v4>
|
||||
mark(doSmth(3))
|
||||
call(doSmth(3), doSmth|<v4>) -> <v5>
|
||||
2 merge(try { doSmth(1) } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) }|<v1>, !<v6>) -> <v7>
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v3>) L1, call(doSmth(3), doSmth|<v4>) -> <v5>]
|
||||
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v3>) L1, merge(try { doSmth(1) } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) }|<v1>, !<v6>) -> <v7>]
|
||||
error:
|
||||
<ERROR> PREV:[jmp(error)]
|
||||
<ERROR> PREV:[jmp(error)]
|
||||
sink:
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
=====================
|
||||
== doSmth ==
|
||||
fun doSmth(i: Int) {
|
||||
|
||||
@@ -26,12 +26,18 @@ fun t2() {
|
||||
}
|
||||
}
|
||||
---------------------
|
||||
1 <v0>: * NEW: r(1) -> <v0>
|
||||
2 <v1>: {<: Comparable<Int>} NEW: r(2) -> <v1>
|
||||
3 <v2>: Int NEW: r(3) -> <v2>
|
||||
2 > 3 <v3>: Boolean NEW: call(2 > 3, compareTo|<v1>, <v2>) -> <v3>
|
||||
2 <v4>: * NEW: r(2) -> <v4>
|
||||
{ 2 } <v4>: * COPY
|
||||
1 <v0>: * NEW: r(1) -> <v0>
|
||||
2 <v1>: {<: Comparable<Int>} NEW: r(2) -> <v1>
|
||||
3 <v2>: Int NEW: r(3) -> <v2>
|
||||
2 > 3 <v3>: Boolean NEW: call(2 > 3, compareTo|<v1>, <v2>) -> <v3>
|
||||
return !<v5>: *
|
||||
{ return } !<v5>: * COPY
|
||||
if (2 > 3) { return } !<v5>: * COPY
|
||||
{ 1 if (2 > 3) { return } } !<v5>: * COPY
|
||||
2 <v4>: * NEW: r(2) -> <v4>
|
||||
{ 2 } <v4>: * COPY
|
||||
try { 1 if (2 > 3) { return } } finally { 2 } !<v5>: * COPY
|
||||
{ try { 1 if (2 > 3) { return } } finally { 2 } } !<v5>: * COPY
|
||||
=====================
|
||||
== t3 ==
|
||||
fun t3() {
|
||||
@@ -63,9 +69,13 @@ try { 1 @l{ () -> if (2 > 3) { return@l } } } finally { 2 } <v1>: * COPY
|
||||
}
|
||||
}
|
||||
---------------------
|
||||
2 <v0>: {<: Comparable<Int>} NEW: r(2) -> <v0>
|
||||
3 <v1>: Int NEW: r(3) -> <v1>
|
||||
2 > 3 <v2>: Boolean NEW: call(2 > 3, compareTo|<v0>, <v1>) -> <v2>
|
||||
2 <v0>: {<: Comparable<Int>} NEW: r(2) -> <v0>
|
||||
3 <v1>: Int NEW: r(3) -> <v1>
|
||||
2 > 3 <v2>: Boolean NEW: call(2 > 3, compareTo|<v0>, <v1>) -> <v2>
|
||||
return@l !<v3>: *
|
||||
{ return@l } !<v3>: * COPY
|
||||
if (2 > 3) { return@l } !<v3>: * COPY
|
||||
if (2 > 3) { return@l } !<v3>: * COPY
|
||||
=====================
|
||||
== t4 ==
|
||||
fun t4() {
|
||||
@@ -97,12 +107,18 @@ fun t4() {
|
||||
}
|
||||
}
|
||||
---------------------
|
||||
1 <v0>: * NEW: r(1) -> <v0>
|
||||
2 <v1>: {<: Comparable<Int>} NEW: r(2) -> <v1>
|
||||
3 <v2>: Int NEW: r(3) -> <v2>
|
||||
2 > 3 <v3>: Boolean NEW: call(2 > 3, compareTo|<v1>, <v2>) -> <v3>
|
||||
2 <v4>: * NEW: r(2) -> <v4>
|
||||
{ 2 } <v4>: * COPY
|
||||
1 <v0>: * NEW: r(1) -> <v0>
|
||||
2 <v1>: {<: Comparable<Int>} NEW: r(2) -> <v1>
|
||||
3 <v2>: Int NEW: r(3) -> <v2>
|
||||
2 > 3 <v3>: Boolean NEW: call(2 > 3, compareTo|<v1>, <v2>) -> <v3>
|
||||
return@l !<v5>: *
|
||||
{ return@l } !<v5>: * COPY
|
||||
if (2 > 3) { return@l } !<v5>: * COPY
|
||||
{ 1 if (2 > 3) { return@l } } !<v5>: * COPY
|
||||
2 <v4>: * NEW: r(2) -> <v4>
|
||||
{ 2 } <v4>: * COPY
|
||||
try { 1 if (2 > 3) { return@l } } finally { 2 } !<v5>: * COPY
|
||||
try { 1 if (2 > 3) { return@l } } finally { 2 } !<v5>: * COPY
|
||||
=====================
|
||||
== t5 ==
|
||||
fun t5() {
|
||||
@@ -118,14 +134,23 @@ fun t5() {
|
||||
}
|
||||
}
|
||||
---------------------
|
||||
<v1>: * NEW: magic[VALUE_CONSUMER](true|<v0>) -> <v1>
|
||||
true <v0>: Boolean NEW: r(true) -> <v0>
|
||||
1 <v2>: * NEW: r(1) -> <v2>
|
||||
2 <v3>: {<: Comparable<Int>} NEW: r(2) -> <v3>
|
||||
3 <v4>: Int NEW: r(3) -> <v4>
|
||||
2 > 3 <v5>: Boolean NEW: call(2 > 3, compareTo|<v3>, <v4>) -> <v5>
|
||||
2 <v6>: * NEW: r(2) -> <v6>
|
||||
{ 2 } <v6>: * COPY
|
||||
<v1>: * NEW: magic[VALUE_CONSUMER](true|<v0>) -> <v1>
|
||||
true <v0>: Boolean NEW: r(true) -> <v0>
|
||||
1 <v2>: * NEW: r(1) -> <v2>
|
||||
2 <v3>: {<: Comparable<Int>} NEW: r(2) -> <v3>
|
||||
3 <v4>: Int NEW: r(3) -> <v4>
|
||||
2 > 3 <v5>: Boolean NEW: call(2 > 3, compareTo|<v3>, <v4>) -> <v5>
|
||||
break @l !<v7>: *
|
||||
{ break @l } !<v7>: * COPY
|
||||
if (2 > 3) { break @l } !<v7>: * COPY
|
||||
{ 1 if (2 > 3) { break @l } } !<v7>: * COPY
|
||||
2 <v6>: * NEW: r(2) -> <v6>
|
||||
{ 2 } <v6>: * COPY
|
||||
try { 1 if (2 > 3) { break @l } } finally { 2 } !<v7>: * COPY
|
||||
{ try { 1 if (2 > 3) { break @l } } finally { 2 } } !<v7>: * COPY
|
||||
while(true) { try { 1 if (2 > 3) { break @l } } finally { 2 } } !<v8>: *
|
||||
@l while(true) { try { 1 if (2 > 3) { break @l } } finally { 2 } } !<v8>: * COPY
|
||||
{ @l while(true) { try { 1 if (2 > 3) { break @l } } finally { 2 } } } !<v8>: * COPY
|
||||
=====================
|
||||
== t6 ==
|
||||
fun t6() {
|
||||
@@ -148,12 +173,18 @@ true <v0>:
|
||||
2 <v3>: {<: Comparable<Int>} NEW: r(2) -> <v3>
|
||||
3 <v4>: Int NEW: r(3) -> <v4>
|
||||
2 > 3 <v5>: Boolean NEW: call(2 > 3, compareTo|<v3>, <v4>) -> <v5>
|
||||
5 <v6>: * NEW: r(5) -> <v6>
|
||||
{ @l while(true) { 1 if (2 > 3) { break @l } } 5 } <v6>: * COPY
|
||||
2 <v7>: * NEW: r(2) -> <v7>
|
||||
{ 2 } <v7>: * COPY
|
||||
try { @l while(true) { 1 if (2 > 3) { break @l } } 5 } finally { 2 } <v6>: * COPY
|
||||
{ try { @l while(true) { 1 if (2 > 3) { break @l } } 5 } finally { 2 } } <v6>: * COPY
|
||||
break @l !<v6>: *
|
||||
{ break @l } !<v6>: * COPY
|
||||
if (2 > 3) { break @l } !<v6>: * COPY
|
||||
{ 1 if (2 > 3) { break @l } } !<v6>: * COPY
|
||||
while(true) { 1 if (2 > 3) { break @l } } !<v7>: *
|
||||
@l while(true) { 1 if (2 > 3) { break @l } } !<v7>: * COPY
|
||||
5 <v8>: * NEW: r(5) -> <v8>
|
||||
{ @l while(true) { 1 if (2 > 3) { break @l } } 5 } <v8>: * COPY
|
||||
2 <v9>: * NEW: r(2) -> <v9>
|
||||
{ 2 } <v9>: * COPY
|
||||
try { @l while(true) { 1 if (2 > 3) { break @l } } 5 } finally { 2 } <v8>: * COPY
|
||||
{ try { @l while(true) { 1 if (2 > 3) { break @l } } 5 } finally { 2 } } <v8>: * COPY
|
||||
=====================
|
||||
== t7 ==
|
||||
fun t7() {
|
||||
@@ -169,14 +200,23 @@ fun t7() {
|
||||
}
|
||||
}
|
||||
---------------------
|
||||
<v1>: * NEW: magic[VALUE_CONSUMER](true|<v0>) -> <v1>
|
||||
true <v0>: Boolean NEW: r(true) -> <v0>
|
||||
1 <v2>: * NEW: r(1) -> <v2>
|
||||
2 <v3>: {<: Comparable<Int>} NEW: r(2) -> <v3>
|
||||
3 <v4>: Int NEW: r(3) -> <v4>
|
||||
2 > 3 <v5>: Boolean NEW: call(2 > 3, compareTo|<v3>, <v4>) -> <v5>
|
||||
2 <v6>: * NEW: r(2) -> <v6>
|
||||
{ 2 } <v6>: * COPY
|
||||
<v1>: * NEW: magic[VALUE_CONSUMER](true|<v0>) -> <v1>
|
||||
true <v0>: Boolean NEW: r(true) -> <v0>
|
||||
1 <v2>: * NEW: r(1) -> <v2>
|
||||
2 <v3>: {<: Comparable<Int>} NEW: r(2) -> <v3>
|
||||
3 <v4>: Int NEW: r(3) -> <v4>
|
||||
2 > 3 <v5>: Boolean NEW: call(2 > 3, compareTo|<v3>, <v4>) -> <v5>
|
||||
break @l !<v6>: *
|
||||
{ break @l } !<v6>: * COPY
|
||||
if (2 > 3) { break @l } !<v6>: * COPY
|
||||
{ 1 if (2 > 3) { break @l } } !<v6>: * COPY
|
||||
while(true) { 1 if (2 > 3) { break @l } } !<v7>: *
|
||||
@l while(true) { 1 if (2 > 3) { break @l } } !<v7>: * COPY
|
||||
{ @l while(true) { 1 if (2 > 3) { break @l } } } !<v7>: * COPY
|
||||
2 <v8>: * NEW: r(2) -> <v8>
|
||||
{ 2 } <v8>: * COPY
|
||||
try { @l while(true) { 1 if (2 > 3) { break @l } } } finally { 2 } !<v7>: * COPY
|
||||
{ try { @l while(true) { 1 if (2 > 3) { break @l } } } finally { 2 } } !<v7>: * COPY
|
||||
=====================
|
||||
== t8 ==
|
||||
fun t8(a : Int) {
|
||||
@@ -192,17 +232,26 @@ fun t8(a : Int) {
|
||||
}
|
||||
}
|
||||
---------------------
|
||||
<v0>: Int NEW: magic[FAKE_INITIALIZER](a : Int) -> <v0>
|
||||
<v4>: Int NEW: magic[LOOP_RANGE_ITERATION](1..a|<v3>) -> <v4>
|
||||
1 <v1>: Int NEW: r(1) -> <v1>
|
||||
a <v2>: Int NEW: r(a) -> <v2>
|
||||
1..a <v3>: {<: Iterable<Int>} NEW: call(1..a, rangeTo|<v1>, <v2>) -> <v3>
|
||||
1 <v5>: * NEW: r(1) -> <v5>
|
||||
2 <v6>: {<: Comparable<Int>} NEW: r(2) -> <v6>
|
||||
3 <v7>: Int NEW: r(3) -> <v7>
|
||||
2 > 3 <v8>: Boolean NEW: call(2 > 3, compareTo|<v6>, <v7>) -> <v8>
|
||||
2 <v9>: * NEW: r(2) -> <v9>
|
||||
{ 2 } <v9>: * COPY
|
||||
<v0>: Int NEW: magic[FAKE_INITIALIZER](a : Int) -> <v0>
|
||||
<v4>: Int NEW: magic[LOOP_RANGE_ITERATION](1..a|<v3>) -> <v4>
|
||||
1 <v1>: Int NEW: r(1) -> <v1>
|
||||
a <v2>: Int NEW: r(a) -> <v2>
|
||||
1..a <v3>: {<: Iterable<Int>} NEW: call(1..a, rangeTo|<v1>, <v2>) -> <v3>
|
||||
1 <v5>: * NEW: r(1) -> <v5>
|
||||
2 <v6>: {<: Comparable<Int>} NEW: r(2) -> <v6>
|
||||
3 <v7>: Int NEW: r(3) -> <v7>
|
||||
2 > 3 <v8>: Boolean NEW: call(2 > 3, compareTo|<v6>, <v7>) -> <v8>
|
||||
continue @l !<v10>: *
|
||||
{ continue @l } !<v10>: * COPY
|
||||
if (2 > 3) { continue @l } !<v10>: * COPY
|
||||
{ 1 if (2 > 3) { continue @l } } !<v10>: * COPY
|
||||
2 <v9>: * NEW: r(2) -> <v9>
|
||||
{ 2 } <v9>: * COPY
|
||||
try { 1 if (2 > 3) { continue @l } } finally { 2 } !<v10>: * COPY
|
||||
{ try { 1 if (2 > 3) { continue @l } } finally { 2 } } !<v10>: * COPY
|
||||
for (i in 1..a) { try { 1 if (2 > 3) { continue @l } } finally { 2 } } !<v11>: *
|
||||
@l for (i in 1..a) { try { 1 if (2 > 3) { continue @l } } finally { 2 } } !<v11>: * COPY
|
||||
{ @l for (i in 1..a) { try { 1 if (2 > 3) { continue @l } } finally { 2 } } } !<v11>: * COPY
|
||||
=====================
|
||||
== t9 ==
|
||||
fun t9(a : Int) {
|
||||
@@ -228,12 +277,18 @@ a
|
||||
2 <v6>: {<: Comparable<Int>} NEW: r(2) -> <v6>
|
||||
3 <v7>: Int NEW: r(3) -> <v7>
|
||||
2 > 3 <v8>: Boolean NEW: call(2 > 3, compareTo|<v6>, <v7>) -> <v8>
|
||||
5 <v9>: * NEW: r(5) -> <v9>
|
||||
{ @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 } <v9>: * COPY
|
||||
2 <v10>: * NEW: r(2) -> <v10>
|
||||
{ 2 } <v10>: * COPY
|
||||
try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 } finally { 2 } <v9>: * COPY
|
||||
{ try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 } finally { 2 } } <v9>: * COPY
|
||||
continue @l !<v9>: *
|
||||
{ continue @l } !<v9>: * COPY
|
||||
if (2 > 3) { continue @l } !<v9>: * COPY
|
||||
{ 1 if (2 > 3) { continue @l } } !<v9>: * COPY
|
||||
for (i in 1..a) { 1 if (2 > 3) { continue @l } } !<v10>: *
|
||||
@l for (i in 1..a) { 1 if (2 > 3) { continue @l } } !<v10>: * COPY
|
||||
5 <v11>: * NEW: r(5) -> <v11>
|
||||
{ @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 } <v11>: * COPY
|
||||
2 <v12>: * NEW: r(2) -> <v12>
|
||||
{ 2 } <v12>: * COPY
|
||||
try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 } finally { 2 } <v11>: * COPY
|
||||
{ try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 } finally { 2 } } <v11>: * COPY
|
||||
=====================
|
||||
== t10 ==
|
||||
fun t10(a : Int) {
|
||||
@@ -249,17 +304,26 @@ fun t10(a : Int) {
|
||||
}
|
||||
}
|
||||
---------------------
|
||||
<v0>: Int NEW: magic[FAKE_INITIALIZER](a : Int) -> <v0>
|
||||
<v4>: Int NEW: magic[LOOP_RANGE_ITERATION](1..a|<v3>) -> <v4>
|
||||
1 <v1>: Int NEW: r(1) -> <v1>
|
||||
a <v2>: Int NEW: r(a) -> <v2>
|
||||
1..a <v3>: {<: Iterable<Int>} NEW: call(1..a, rangeTo|<v1>, <v2>) -> <v3>
|
||||
1 <v5>: * NEW: r(1) -> <v5>
|
||||
2 <v6>: {<: Comparable<Int>} NEW: r(2) -> <v6>
|
||||
3 <v7>: Int NEW: r(3) -> <v7>
|
||||
2 > 3 <v8>: Boolean NEW: call(2 > 3, compareTo|<v6>, <v7>) -> <v8>
|
||||
2 <v9>: * NEW: r(2) -> <v9>
|
||||
{ 2 } <v9>: * COPY
|
||||
<v0>: Int NEW: magic[FAKE_INITIALIZER](a : Int) -> <v0>
|
||||
<v4>: Int NEW: magic[LOOP_RANGE_ITERATION](1..a|<v3>) -> <v4>
|
||||
1 <v1>: Int NEW: r(1) -> <v1>
|
||||
a <v2>: Int NEW: r(a) -> <v2>
|
||||
1..a <v3>: {<: Iterable<Int>} NEW: call(1..a, rangeTo|<v1>, <v2>) -> <v3>
|
||||
1 <v5>: * NEW: r(1) -> <v5>
|
||||
2 <v6>: {<: Comparable<Int>} NEW: r(2) -> <v6>
|
||||
3 <v7>: Int NEW: r(3) -> <v7>
|
||||
2 > 3 <v8>: Boolean NEW: call(2 > 3, compareTo|<v6>, <v7>) -> <v8>
|
||||
continue @l !<v9>: *
|
||||
{ continue @l } !<v9>: * COPY
|
||||
if (2 > 3) { continue @l } !<v9>: * COPY
|
||||
{ 1 if (2 > 3) { continue @l } } !<v9>: * COPY
|
||||
for (i in 1..a) { 1 if (2 > 3) { continue @l } } !<v10>: *
|
||||
@l for (i in 1..a) { 1 if (2 > 3) { continue @l } } !<v10>: * COPY
|
||||
{ @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } } !<v10>: * COPY
|
||||
2 <v11>: * NEW: r(2) -> <v11>
|
||||
{ 2 } <v11>: * COPY
|
||||
try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } } finally { 2 } !<v10>: * COPY
|
||||
{ try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } } finally { 2 } } !<v10>: * COPY
|
||||
=====================
|
||||
== t11 ==
|
||||
fun t11() {
|
||||
@@ -271,8 +335,14 @@ fun t11() {
|
||||
}
|
||||
}
|
||||
---------------------
|
||||
1 <v0>: {<: Unit} NEW: r(1) -> <v0>
|
||||
2 <v1>: {<: Unit} NEW: r(2) -> <v1>
|
||||
1 <v0>: Unit NEW: r(1) -> <v0>
|
||||
return 1 !<v3>: *
|
||||
{ return 1 } !<v3>: * COPY
|
||||
2 <v1>: Unit NEW: r(2) -> <v1>
|
||||
return 2 !<v2>: *
|
||||
{ return 2 } !<v2>: * COPY
|
||||
try { return 1 } finally { return 2 } !<v3>: * COPY
|
||||
{ try { return 1 } finally { return 2 } } !<v3>: * COPY
|
||||
=====================
|
||||
== t12 ==
|
||||
fun t12() : Int {
|
||||
@@ -284,10 +354,14 @@ fun t12() : Int {
|
||||
}
|
||||
}
|
||||
---------------------
|
||||
1 <v0>: Int NEW: r(1) -> <v0>
|
||||
3 <v1>: Int NEW: r(3) -> <v1>
|
||||
doSmth(3) <v2>: * NEW: call(doSmth(3), doSmth|<v1>) -> <v2>
|
||||
{ doSmth(3) } <v2>: * COPY
|
||||
1 <v0>: Int NEW: r(1) -> <v0>
|
||||
return 1 !<v3>: *
|
||||
{ return 1 } !<v3>: * COPY
|
||||
3 <v1>: Int NEW: r(3) -> <v1>
|
||||
doSmth(3) <v2>: * NEW: call(doSmth(3), doSmth|<v1>) -> <v2>
|
||||
{ doSmth(3) } <v2>: * COPY
|
||||
try { return 1 } finally { doSmth(3) } !<v3>: * COPY
|
||||
{ try { return 1 } finally { doSmth(3) } } !<v3>: * COPY
|
||||
=====================
|
||||
== t13 ==
|
||||
fun t13() : Int {
|
||||
@@ -302,16 +376,18 @@ fun t13() : Int {
|
||||
}
|
||||
}
|
||||
---------------------
|
||||
<v3>: {<: UnsupportedOperationException} NEW: magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v3>
|
||||
1 <v0>: Int NEW: r(1) -> <v0>
|
||||
2 <v4>: Int NEW: r(2) -> <v4>
|
||||
doSmth(2) <v5>: * NEW: call(doSmth(2), doSmth|<v4>) -> <v5>
|
||||
{ doSmth(2) } <v5>: * COPY
|
||||
3 <v1>: Int NEW: r(3) -> <v1>
|
||||
doSmth(3) <v2>: * NEW: call(doSmth(3), doSmth|<v1>) -> <v2>
|
||||
{ doSmth(3) } <v2>: * COPY
|
||||
try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } finally { doSmth(3) } <v5>: * COPY
|
||||
{ try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } finally { doSmth(3) } } <v5>: * COPY
|
||||
<v4>: {<: UnsupportedOperationException} NEW: magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v4>
|
||||
1 <v0>: Int NEW: r(1) -> <v0>
|
||||
return 1 !<v3>: *
|
||||
{ return 1 } !<v3>: * COPY
|
||||
2 <v5>: Int NEW: r(2) -> <v5>
|
||||
doSmth(2) <v6>: * NEW: call(doSmth(2), doSmth|<v5>) -> <v6>
|
||||
{ doSmth(2) } <v6>: * COPY
|
||||
3 <v1>: Int NEW: r(3) -> <v1>
|
||||
doSmth(3) <v2>: * NEW: call(doSmth(3), doSmth|<v1>) -> <v2>
|
||||
{ doSmth(3) } <v2>: * COPY
|
||||
try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } finally { doSmth(3) } <v7>: * NEW: merge(try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } finally { doSmth(3) }|!<v3>, <v6>) -> <v7>
|
||||
{ try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } finally { doSmth(3) } } <v7>: * COPY
|
||||
=====================
|
||||
== t14 ==
|
||||
fun t14() : Int {
|
||||
@@ -323,13 +399,15 @@ fun t14() : Int {
|
||||
}
|
||||
}
|
||||
---------------------
|
||||
<v1>: {<: UnsupportedOperationException} NEW: magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v1>
|
||||
1 <v0>: Int NEW: r(1) -> <v0>
|
||||
2 <v2>: Int NEW: r(2) -> <v2>
|
||||
doSmth(2) <v3>: * NEW: call(doSmth(2), doSmth|<v2>) -> <v3>
|
||||
{ doSmth(2) } <v3>: * COPY
|
||||
try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } <v3>: * COPY
|
||||
{ try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } } <v3>: * COPY
|
||||
<v2>: {<: UnsupportedOperationException} NEW: magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v2>
|
||||
1 <v0>: Int NEW: r(1) -> <v0>
|
||||
return 1 !<v1>: *
|
||||
{ return 1 } !<v1>: * COPY
|
||||
2 <v3>: Int NEW: r(2) -> <v3>
|
||||
doSmth(2) <v4>: * NEW: call(doSmth(2), doSmth|<v3>) -> <v4>
|
||||
{ doSmth(2) } <v4>: * COPY
|
||||
try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } <v5>: * NEW: merge(try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) }|!<v1>, <v4>) -> <v5>
|
||||
{ try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } } <v5>: * COPY
|
||||
=====================
|
||||
== t15 ==
|
||||
fun t15() : Int {
|
||||
@@ -344,12 +422,18 @@ fun t15() : Int {
|
||||
}
|
||||
}
|
||||
---------------------
|
||||
<v3>: {<: UnsupportedOperationException} NEW: magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v3>
|
||||
1 <v0>: Int NEW: r(1) -> <v0>
|
||||
2 <v4>: Int NEW: r(2) -> <v4>
|
||||
3 <v1>: Int NEW: r(3) -> <v1>
|
||||
doSmth(3) <v2>: * NEW: call(doSmth(3), doSmth|<v1>) -> <v2>
|
||||
{ doSmth(3) } <v2>: * COPY
|
||||
<v4>: {<: UnsupportedOperationException} NEW: magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v4>
|
||||
1 <v0>: Int NEW: r(1) -> <v0>
|
||||
return 1 !<v3>: *
|
||||
{ return 1 } !<v3>: * COPY
|
||||
2 <v5>: Int NEW: r(2) -> <v5>
|
||||
return 2 !<v6>: *
|
||||
{ return 2 } !<v6>: * COPY
|
||||
3 <v1>: Int NEW: r(3) -> <v1>
|
||||
doSmth(3) <v2>: * NEW: call(doSmth(3), doSmth|<v1>) -> <v2>
|
||||
{ doSmth(3) } <v2>: * COPY
|
||||
try { return 1 } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) } <v7>: * NEW: merge(try { return 1 } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) }|!<v3>, !<v6>) -> <v7>
|
||||
{ try { return 1 } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) } } <v7>: * COPY
|
||||
=====================
|
||||
== t16 ==
|
||||
fun t16() : Int {
|
||||
@@ -364,16 +448,18 @@ fun t16() : Int {
|
||||
}
|
||||
}
|
||||
---------------------
|
||||
<v2>: {<: UnsupportedOperationException} NEW: magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v2>
|
||||
1 <v0>: Int NEW: r(1) -> <v0>
|
||||
doSmth(1) <v1>: * NEW: call(doSmth(1), doSmth|<v0>) -> <v1>
|
||||
{ doSmth(1) } <v1>: * COPY
|
||||
2 <v3>: Int NEW: r(2) -> <v3>
|
||||
3 <v4>: Int NEW: r(3) -> <v4>
|
||||
doSmth(3) <v5>: * NEW: call(doSmth(3), doSmth|<v4>) -> <v5>
|
||||
{ doSmth(3) } <v5>: * COPY
|
||||
try { doSmth(1) } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) } <v1>: * COPY
|
||||
{ try { doSmth(1) } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) } } <v1>: * COPY
|
||||
<v2>: {<: UnsupportedOperationException} NEW: magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v2>
|
||||
1 <v0>: Int NEW: r(1) -> <v0>
|
||||
doSmth(1) <v1>: * NEW: call(doSmth(1), doSmth|<v0>) -> <v1>
|
||||
{ doSmth(1) } <v1>: * COPY
|
||||
2 <v3>: Int NEW: r(2) -> <v3>
|
||||
return 2 !<v6>: *
|
||||
{ return 2 } !<v6>: * COPY
|
||||
3 <v4>: Int NEW: r(3) -> <v4>
|
||||
doSmth(3) <v5>: * NEW: call(doSmth(3), doSmth|<v4>) -> <v5>
|
||||
{ doSmth(3) } <v5>: * COPY
|
||||
try { doSmth(1) } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) } <v7>: * NEW: merge(try { doSmth(1) } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) }|<v1>, !<v6>) -> <v7>
|
||||
{ try { doSmth(1) } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) } } <v7>: * COPY
|
||||
=====================
|
||||
== doSmth ==
|
||||
fun doSmth(i: Int) {
|
||||
|
||||
@@ -110,7 +110,7 @@ L6 [skipFinallyToErrorBlock]:
|
||||
3 mark({ return 1 }) PREV:[jmp(L6 [skipFinallyToErrorBlock])]
|
||||
r(1) -> <v5>
|
||||
ret(*|<v5>) L1 NEXT:[<END>]
|
||||
- 2 merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { return 1 }|<v0>, <v2>, <v4>) -> <v6> PREV:[]
|
||||
- 2 merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { return 1 }|<v0>, <v2>, <v4>) -> <v7> PREV:[]
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v5>) L1, ret(*|<v5>) L1]
|
||||
error:
|
||||
@@ -142,30 +142,30 @@ L0:
|
||||
2 mark({ while (cond()) { try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } } })
|
||||
L2 [loop entry point]:
|
||||
L5 [condition entry point]:
|
||||
mark(cond()) PREV:[mark({ while (cond()) { try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } } }), jmp(L2 [loop entry point]), jmp(L2 [loop entry point])]
|
||||
mark(cond()) PREV:[mark({ while (cond()) { try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } } }), jmp(L2 [loop entry point]), jmp(L2 [loop entry point])]
|
||||
call(cond(), cond) -> <v0>
|
||||
mark(while (cond()) { try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } })
|
||||
jf(L3 [loop exit point]|<v0>) NEXT:[read (Unit), mark({ try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } })]
|
||||
jf(L3 [loop exit point]|<v0>) NEXT:[read (Unit), mark({ try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } })]
|
||||
L4 [body entry point]:
|
||||
3 mark({ try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } })
|
||||
mark(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue })
|
||||
jmp?(L6 [onException]) NEXT:[jmp?(L9 [catch 0]), jmp?(L7 [onExceptionToFinallyBlock])]
|
||||
jmp?(L7 [onExceptionToFinallyBlock]) NEXT:[mark({ if (cond()) return else continue }), mark({ doSmth() })]
|
||||
jmp?(L6 [onException]) NEXT:[jmp?(L9 [catch 0]), jmp?(L7 [onExceptionToFinallyBlock])]
|
||||
jmp?(L7 [onExceptionToFinallyBlock]) NEXT:[mark({ if (cond()) return else continue }), mark({ doSmth() })]
|
||||
4 mark({ doSmth() })
|
||||
mark(doSmth())
|
||||
call(doSmth(), doSmth) -> <v1>
|
||||
3 jmp(L8 [afterCatches]) NEXT:[jmp(L10 [skipFinallyToErrorBlock])]
|
||||
3 jmp(L8 [afterCatches]) NEXT:[jmp(L10 [skipFinallyToErrorBlock])]
|
||||
L6 [onException]:
|
||||
jmp?(L9 [catch 0]) NEXT:[v(e: Exception), v(e: NullPointerException)] PREV:[jmp?(L6 [onException])]
|
||||
jmp?(L9 [catch 0]) NEXT:[v(e: Exception), v(e: NullPointerException)] PREV:[jmp?(L6 [onException])]
|
||||
4 v(e: NullPointerException)
|
||||
magic[FAKE_INITIALIZER](e: NullPointerException) -> <v2>
|
||||
w(e|<v2>)
|
||||
5 mark({ doSmth1() })
|
||||
mark(doSmth1())
|
||||
call(doSmth1(), doSmth1) -> <v3>
|
||||
4 jmp(L8 [afterCatches]) NEXT:[jmp(L10 [skipFinallyToErrorBlock])]
|
||||
4 jmp(L8 [afterCatches]) NEXT:[jmp(L10 [skipFinallyToErrorBlock])]
|
||||
L9 [catch 0]:
|
||||
v(e: Exception) PREV:[jmp?(L9 [catch 0])]
|
||||
v(e: Exception) PREV:[jmp?(L9 [catch 0])]
|
||||
magic[FAKE_INITIALIZER](e: Exception) -> <v4>
|
||||
w(e|<v4>)
|
||||
5 mark({ doSmth2() })
|
||||
@@ -173,40 +173,42 @@ L9 [catch 0]:
|
||||
call(doSmth2(), doSmth2) -> <v5>
|
||||
4 jmp(L8 [afterCatches])
|
||||
L8 [afterCatches]:
|
||||
3 jmp(L10 [skipFinallyToErrorBlock]) NEXT:[mark({ if (cond()) return else continue })] PREV:[jmp(L8 [afterCatches]), jmp(L8 [afterCatches]), jmp(L8 [afterCatches])]
|
||||
3 jmp(L10 [skipFinallyToErrorBlock]) NEXT:[mark({ if (cond()) return else continue })] PREV:[jmp(L8 [afterCatches]), jmp(L8 [afterCatches]), jmp(L8 [afterCatches])]
|
||||
L7 [onExceptionToFinallyBlock]:
|
||||
L11 [start finally]:
|
||||
4 mark({ if (cond()) return else continue }) PREV:[jmp?(L7 [onExceptionToFinallyBlock])]
|
||||
4 mark({ if (cond()) return else continue }) PREV:[jmp?(L7 [onExceptionToFinallyBlock])]
|
||||
mark(if (cond()) return else continue)
|
||||
mark(cond())
|
||||
call(cond(), cond) -> <v6>
|
||||
jf(L12|<v6>) NEXT:[jmp(L2 [loop entry point]), ret L1]
|
||||
ret L1 NEXT:[<END>]
|
||||
- jmp(L13) NEXT:[jmp(error)] PREV:[]
|
||||
jf(L12|<v6>) NEXT:[jmp(L2 [loop entry point]), ret L1]
|
||||
ret L1 NEXT:[<END>]
|
||||
- jmp(L13) NEXT:[merge(if (cond()) return else continue|!<v7>, !<v8>) -> <v9>] PREV:[]
|
||||
L12:
|
||||
jmp(L2 [loop entry point]) NEXT:[mark(cond())] PREV:[jf(L12|<v6>)]
|
||||
jmp(L2 [loop entry point]) NEXT:[mark(cond())] PREV:[jf(L12|<v6>)]
|
||||
L13:
|
||||
- merge(if (cond()) return else continue|!<v7>, !<v8>) -> <v9> PREV:[]
|
||||
L14 [finish finally]:
|
||||
- 3 jmp(error) NEXT:[<ERROR>] PREV:[]
|
||||
- 3 jmp(error) NEXT:[<ERROR>] PREV:[]
|
||||
L10 [skipFinallyToErrorBlock]:
|
||||
4 mark({ if (cond()) return else continue }) PREV:[jmp(L10 [skipFinallyToErrorBlock])]
|
||||
4 mark({ if (cond()) return else continue }) PREV:[jmp(L10 [skipFinallyToErrorBlock])]
|
||||
mark(if (cond()) return else continue)
|
||||
mark(cond())
|
||||
call(cond(), cond) -> <v6>
|
||||
jf(copy L12|<v6>) NEXT:[jmp(L2 [loop entry point]), ret L1]
|
||||
ret L1 NEXT:[<END>]
|
||||
- jmp(copy L13) NEXT:[merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue }|<v1>, <v3>, <v5>) -> <v7>] PREV:[]
|
||||
jmp(L2 [loop entry point]) NEXT:[mark(cond())] PREV:[jf(copy L12|<v6>)]
|
||||
- 3 merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue }|<v1>, <v3>, <v5>) -> <v7> PREV:[]
|
||||
- 2 jmp(L2 [loop entry point]) NEXT:[mark(cond())] PREV:[]
|
||||
jf(copy L12|<v6>) NEXT:[jmp(L2 [loop entry point]), ret L1]
|
||||
ret L1 NEXT:[<END>]
|
||||
- jmp(copy L13) NEXT:[merge(if (cond()) return else continue|!<v7>, !<v8>) -> <v9>] PREV:[]
|
||||
jmp(L2 [loop entry point]) NEXT:[mark(cond())] PREV:[jf(copy L12|<v6>)]
|
||||
- merge(if (cond()) return else continue|!<v7>, !<v8>) -> <v9> PREV:[]
|
||||
- 3 merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue }|<v1>, <v3>, <v5>) -> <v10> PREV:[]
|
||||
- 2 jmp(L2 [loop entry point]) NEXT:[mark(cond())] PREV:[]
|
||||
L3 [loop exit point]:
|
||||
read (Unit) PREV:[jf(L3 [loop exit point]|<v0>)]
|
||||
read (Unit) PREV:[jf(L3 [loop exit point]|<v0>)]
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>] PREV:[ret L1, ret L1, read (Unit)]
|
||||
1 <END> NEXT:[<SINK>] PREV:[ret L1, ret L1, read (Unit)]
|
||||
error:
|
||||
<ERROR> PREV:[]
|
||||
<ERROR> PREV:[]
|
||||
sink:
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
=====================
|
||||
== testCopy3 ==
|
||||
fun testCopy3() {
|
||||
@@ -276,7 +278,7 @@ L6 [skipFinallyToErrorBlock]:
|
||||
jf(copy L9 [loop exit point]|<v5>) NEXT:[read (Unit), jmp(copy L8 [loop entry point])]
|
||||
jmp(copy L8 [loop entry point]) NEXT:[mark(cond())]
|
||||
read (Unit) PREV:[jf(copy L9 [loop exit point]|<v5>)]
|
||||
2 merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { while (cond()); }|<v0>, <v2>, <v4>) -> <v6>
|
||||
2 merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { while (cond()); }|<v0>, <v2>, <v4>) -> <v7>
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>]
|
||||
error:
|
||||
|
||||
@@ -39,8 +39,10 @@ doSmth1()
|
||||
doSmth2() <v4>: * NEW: call(doSmth2(), doSmth2) -> <v4>
|
||||
{ doSmth2() } <v4>: * COPY
|
||||
1 <v5>: Int NEW: r(1) -> <v5>
|
||||
try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { return 1 } <v6>: * NEW: merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { return 1 }|<v0>, <v2>, <v4>) -> <v6>
|
||||
{ try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { return 1 } } <v6>: * COPY
|
||||
return 1 !<v6>: *
|
||||
{ return 1 } !<v6>: * COPY
|
||||
try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { return 1 } <v7>: * NEW: merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { return 1 }|<v0>, <v2>, <v4>) -> <v7>
|
||||
{ try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { return 1 } } <v7>: * COPY
|
||||
=====================
|
||||
== testCopy2 ==
|
||||
fun testCopy2() {
|
||||
@@ -61,18 +63,24 @@ fun testCopy2() {
|
||||
}
|
||||
}
|
||||
---------------------
|
||||
<v2>: {<: NullPointerException} NEW: magic[FAKE_INITIALIZER](e: NullPointerException) -> <v2>
|
||||
<v4>: {<: Exception} NEW: magic[FAKE_INITIALIZER](e: Exception) -> <v4>
|
||||
cond() <v0>: Boolean NEW: call(cond(), cond) -> <v0>
|
||||
doSmth() <v1>: * NEW: call(doSmth(), doSmth) -> <v1>
|
||||
{ doSmth() } <v1>: * COPY
|
||||
doSmth1() <v3>: * NEW: call(doSmth1(), doSmth1) -> <v3>
|
||||
{ doSmth1() } <v3>: * COPY
|
||||
doSmth2() <v5>: * NEW: call(doSmth2(), doSmth2) -> <v5>
|
||||
{ doSmth2() } <v5>: * COPY
|
||||
cond() <v6>: Boolean NEW: call(cond(), cond) -> <v6>
|
||||
try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } <v7>: * NEW: merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue }|<v1>, <v3>, <v5>) -> <v7>
|
||||
{ try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } } <v7>: * COPY
|
||||
<v2>: {<: NullPointerException} NEW: magic[FAKE_INITIALIZER](e: NullPointerException) -> <v2>
|
||||
<v4>: {<: Exception} NEW: magic[FAKE_INITIALIZER](e: Exception) -> <v4>
|
||||
cond() <v0>: Boolean NEW: call(cond(), cond) -> <v0>
|
||||
doSmth() <v1>: * NEW: call(doSmth(), doSmth) -> <v1>
|
||||
{ doSmth() } <v1>: * COPY
|
||||
doSmth1() <v3>: * NEW: call(doSmth1(), doSmth1) -> <v3>
|
||||
{ doSmth1() } <v3>: * COPY
|
||||
doSmth2() <v5>: * NEW: call(doSmth2(), doSmth2) -> <v5>
|
||||
{ doSmth2() } <v5>: * COPY
|
||||
cond() <v6>: Boolean NEW: call(cond(), cond) -> <v6>
|
||||
return !<v7>: *
|
||||
continue !<v8>: *
|
||||
if (cond()) return else continue <v9>: * NEW: merge(if (cond()) return else continue|!<v7>, !<v8>) -> <v9>
|
||||
{ if (cond()) return else continue } <v9>: * COPY
|
||||
try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } <v10>: * NEW: merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue }|<v1>, <v3>, <v5>) -> <v10>
|
||||
{ try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } } <v10>: * COPY
|
||||
while (cond()) { try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } } !<v11>: *
|
||||
{ while (cond()) { try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } } } !<v11>: * COPY
|
||||
=====================
|
||||
== testCopy3 ==
|
||||
fun testCopy3() {
|
||||
@@ -99,8 +107,10 @@ doSmth1()
|
||||
doSmth2() <v4>: * NEW: call(doSmth2(), doSmth2) -> <v4>
|
||||
{ doSmth2() } <v4>: * COPY
|
||||
cond() <v5>: Boolean NEW: call(cond(), cond) -> <v5>
|
||||
try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { while (cond()); } <v6>: * NEW: merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { while (cond()); }|<v0>, <v2>, <v4>) -> <v6>
|
||||
{ try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { while (cond()); } } <v6>: * COPY
|
||||
while (cond()) !<v6>: *
|
||||
{ while (cond()); } !<v6>: * COPY
|
||||
try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { while (cond()); } <v7>: * NEW: merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { while (cond()); }|<v0>, <v2>, <v4>) -> <v7>
|
||||
{ try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { while (cond()); } } <v7>: * COPY
|
||||
=====================
|
||||
== doTestCopy4 ==
|
||||
fun doTestCopy4(list: List<String>?) : Int {
|
||||
@@ -116,9 +126,12 @@ fun doTestCopy4(list: List<String>?) : Int {
|
||||
<v0>: {<: List<String>?} NEW: magic[FAKE_INITIALIZER](list: List<String>?) -> <v0>
|
||||
doSmth() <v1>: * NEW: call(doSmth(), doSmth) -> <v1>
|
||||
{ doSmth() } <v1>: * COPY
|
||||
list <v2>: * NEW: r(list) -> <v2>
|
||||
null <v3>: * NEW: r(null) -> <v3>
|
||||
list <v2>: * NEW: r(list) -> <v2>
|
||||
null <v3>: * NEW: r(null) -> <v3>
|
||||
list != null <v4>: Boolean NEW: call(list != null, equals|<v2>, <v3>) -> <v4>
|
||||
{ } !<v5>: *
|
||||
if(list != null) { } !<v5>: * COPY
|
||||
{ if(list != null) { } } !<v5>: * COPY
|
||||
try { doSmth() } finally { if(list != null) { } } <v1>: * COPY
|
||||
{ try { doSmth() } finally { if(list != null) { } } } <v1>: * COPY
|
||||
=====================
|
||||
|
||||
@@ -5,13 +5,15 @@ fun t1() {
|
||||
}
|
||||
}
|
||||
---------------------
|
||||
<v3>: Int NEW: magic[LOOP_RANGE_ITERATION](1..2|<v2>) -> <v3>
|
||||
1 <v0>: Int NEW: r(1) -> <v0>
|
||||
2 <v1>: Int NEW: r(2) -> <v1>
|
||||
1..2 <v2>: {<: Iterable<Int>} NEW: call(1..2, rangeTo|<v0>, <v1>) -> <v2>
|
||||
i <v4>: Int NEW: r(i) -> <v4>
|
||||
doSmth(i) <v5>: * NEW: call(doSmth(i), doSmth|<v4>) -> <v5>
|
||||
{ doSmth(i) } <v5>: * COPY
|
||||
<v3>: Int NEW: magic[LOOP_RANGE_ITERATION](1..2|<v2>) -> <v3>
|
||||
1 <v0>: Int NEW: r(1) -> <v0>
|
||||
2 <v1>: Int NEW: r(2) -> <v1>
|
||||
1..2 <v2>: {<: Iterable<Int>} NEW: call(1..2, rangeTo|<v0>, <v1>) -> <v2>
|
||||
i <v4>: Int NEW: r(i) -> <v4>
|
||||
doSmth(i) <v5>: * NEW: call(doSmth(i), doSmth|<v4>) -> <v5>
|
||||
{ doSmth(i) } <v5>: * COPY
|
||||
for (i in 1..2) { doSmth(i) } !<v6>: *
|
||||
{ for (i in 1..2) { doSmth(i) } } !<v6>: * COPY
|
||||
=====================
|
||||
== doSmth ==
|
||||
fun doSmth(i: Int) {}
|
||||
|
||||
@@ -30,31 +30,32 @@ L0:
|
||||
mark("s")
|
||||
r("s") -> <v2>
|
||||
w(u|<v2>)
|
||||
2 jmp(L3) NEXT:[r(u) -> <v3>]
|
||||
2 jmp(L3) NEXT:[r(u) -> <v4>]
|
||||
L2:
|
||||
read (Unit) PREV:[jf(L2|<v1>)]
|
||||
L3:
|
||||
r(u) -> <v3> PREV:[jmp(L3), read (Unit)]
|
||||
r(u) -> <v4> PREV:[jmp(L3), read (Unit)]
|
||||
mark(doSmth(u))
|
||||
call(doSmth(u), doSmth|<v3>) -> <v4>
|
||||
call(doSmth(u), doSmth|<v4>) -> <v5>
|
||||
v(var r: String)
|
||||
mark(if (b) { r = "s" } else { r = "t" })
|
||||
r(b) -> <v5>
|
||||
jf(L4|<v5>) NEXT:[mark({ r = "t" }), mark({ r = "s" })]
|
||||
r(b) -> <v6>
|
||||
jf(L4|<v6>) NEXT:[mark({ r = "t" }), mark({ r = "s" })]
|
||||
3 mark({ r = "s" })
|
||||
mark("s")
|
||||
r("s") -> <v6>
|
||||
w(r|<v6>)
|
||||
2 jmp(L5) NEXT:[r(r) -> <v8>]
|
||||
L4:
|
||||
3 mark({ r = "t" }) PREV:[jf(L4|<v5>)]
|
||||
mark("t")
|
||||
r("t") -> <v7>
|
||||
r("s") -> <v7>
|
||||
w(r|<v7>)
|
||||
2 jmp(L5) NEXT:[merge(if (b) { r = "s" } else { r = "t" }|!<v8>, !<v10>) -> <v11>]
|
||||
L4:
|
||||
3 mark({ r = "t" }) PREV:[jf(L4|<v6>)]
|
||||
mark("t")
|
||||
r("t") -> <v9>
|
||||
w(r|<v9>)
|
||||
L5:
|
||||
2 r(r) -> <v8> PREV:[jmp(L5), w(r|<v7>)]
|
||||
2 merge(if (b) { r = "s" } else { r = "t" }|!<v8>, !<v10>) -> <v11> PREV:[jmp(L5), w(r|<v9>)]
|
||||
r(r) -> <v12>
|
||||
mark(doSmth(r))
|
||||
call(doSmth(r), doSmth|<v8>) -> <v9>
|
||||
call(doSmth(r), doSmth|<v12>) -> <v13>
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -88,23 +89,23 @@ L0:
|
||||
jf(L2|<v2>) NEXT:[read (Unit), mark({ return; })]
|
||||
3 mark({ return; })
|
||||
ret L1 NEXT:[<END>]
|
||||
- 2 jmp(L3) NEXT:[r(i) -> <v3>] PREV:[]
|
||||
- 2 jmp(L3) NEXT:[r(i) -> <v4>] PREV:[]
|
||||
L2:
|
||||
read (Unit) PREV:[jf(L2|<v2>)]
|
||||
L3:
|
||||
r(i) -> <v3>
|
||||
r(i) -> <v4>
|
||||
mark(doSmth(i))
|
||||
call(doSmth(i), doSmth|<v3>) -> <v4>
|
||||
call(doSmth(i), doSmth|<v4>) -> <v5>
|
||||
mark(if (i is Int) { return; })
|
||||
mark(i is Int)
|
||||
r(i) -> <v5>
|
||||
magic[IS](i is Int|<v5>) -> <v6>
|
||||
jf(L4|<v6>) NEXT:[read (Unit), mark({ return; })]
|
||||
r(i) -> <v6>
|
||||
magic[IS](i is Int|<v6>) -> <v7>
|
||||
jf(L4|<v7>) NEXT:[read (Unit), mark({ return; })]
|
||||
3 mark({ return; })
|
||||
ret L1 NEXT:[<END>]
|
||||
- 2 jmp(L5) NEXT:[<END>] PREV:[]
|
||||
L4:
|
||||
read (Unit) PREV:[jf(L4|<v6>)]
|
||||
read (Unit) PREV:[jf(L4|<v7>)]
|
||||
L1:
|
||||
L5:
|
||||
1 <END> NEXT:[<SINK>] PREV:[ret L1, ret L1, read (Unit)]
|
||||
|
||||
@@ -16,17 +16,25 @@ fun t1(b: Boolean) {
|
||||
doSmth(r)
|
||||
}
|
||||
---------------------
|
||||
<v0>: Boolean NEW: magic[FAKE_INITIALIZER](b: Boolean) -> <v0>
|
||||
b <v1>: Boolean NEW: r(b) -> <v1>
|
||||
"s" <v2>: String NEW: r("s") -> <v2>
|
||||
u <v3>: String NEW: r(u) -> <v3>
|
||||
doSmth(u) <v4>: * NEW: call(doSmth(u), doSmth|<v3>) -> <v4>
|
||||
b <v5>: Boolean NEW: r(b) -> <v5>
|
||||
"s" <v6>: String NEW: r("s") -> <v6>
|
||||
"t" <v7>: String NEW: r("t") -> <v7>
|
||||
r <v8>: String NEW: r(r) -> <v8>
|
||||
doSmth(r) <v9>: * NEW: call(doSmth(r), doSmth|<v8>) -> <v9>
|
||||
{ var u: String if (b) { u = "s" } doSmth(u) var r: String if (b) { r = "s" } else { r = "t" } doSmth(r) } <v9>: * COPY
|
||||
<v0>: Boolean NEW: magic[FAKE_INITIALIZER](b: Boolean) -> <v0>
|
||||
b <v1>: Boolean NEW: r(b) -> <v1>
|
||||
"s" <v2>: String NEW: r("s") -> <v2>
|
||||
u = "s" !<v3>: *
|
||||
{ u = "s" } !<v3>: * COPY
|
||||
if (b) { u = "s" } !<v3>: * COPY
|
||||
u <v4>: String NEW: r(u) -> <v4>
|
||||
doSmth(u) <v5>: * NEW: call(doSmth(u), doSmth|<v4>) -> <v5>
|
||||
b <v6>: Boolean NEW: r(b) -> <v6>
|
||||
"s" <v7>: String NEW: r("s") -> <v7>
|
||||
r = "s" !<v8>: *
|
||||
{ r = "s" } !<v8>: * COPY
|
||||
"t" <v9>: String NEW: r("t") -> <v9>
|
||||
r = "t" !<v10>: *
|
||||
{ r = "t" } !<v10>: * COPY
|
||||
if (b) { r = "s" } else { r = "t" } <v11>: * NEW: merge(if (b) { r = "s" } else { r = "t" }|!<v8>, !<v10>) -> <v11>
|
||||
r <v12>: String NEW: r(r) -> <v12>
|
||||
doSmth(r) <v13>: * NEW: call(doSmth(r), doSmth|<v12>) -> <v13>
|
||||
{ var u: String if (b) { u = "s" } doSmth(u) var r: String if (b) { r = "s" } else { r = "t" } doSmth(r) } <v13>: * COPY
|
||||
=====================
|
||||
== t2 ==
|
||||
fun t2(b: Boolean) {
|
||||
@@ -40,13 +48,20 @@ fun t2(b: Boolean) {
|
||||
}
|
||||
}
|
||||
---------------------
|
||||
<v0>: Boolean NEW: magic[FAKE_INITIALIZER](b: Boolean) -> <v0>
|
||||
3 <v1>: Int NEW: r(3) -> <v1>
|
||||
b <v2>: Boolean NEW: r(b) -> <v2>
|
||||
i <v3>: String NEW: r(i) -> <v3>
|
||||
doSmth(i) <v4>: * NEW: call(doSmth(i), doSmth|<v3>) -> <v4>
|
||||
i <v5>: * NEW: r(i) -> <v5>
|
||||
i is Int <v6>: Boolean NEW: magic[IS](i is Int|<v5>) -> <v6>
|
||||
<v0>: Boolean NEW: magic[FAKE_INITIALIZER](b: Boolean) -> <v0>
|
||||
3 <v1>: Int NEW: r(3) -> <v1>
|
||||
b <v2>: Boolean NEW: r(b) -> <v2>
|
||||
return !<v3>: *
|
||||
{ return; } !<v3>: * COPY
|
||||
if (b) { return; } !<v3>: * COPY
|
||||
i <v4>: String NEW: r(i) -> <v4>
|
||||
doSmth(i) <v5>: * NEW: call(doSmth(i), doSmth|<v4>) -> <v5>
|
||||
i <v6>: * NEW: r(i) -> <v6>
|
||||
i is Int <v7>: Boolean NEW: magic[IS](i is Int|<v6>) -> <v7>
|
||||
return !<v8>: *
|
||||
{ return; } !<v8>: * COPY
|
||||
if (i is Int) { return; } !<v8>: * COPY
|
||||
{ val i = 3 if (b) { return; } doSmth(i) if (i is Int) { return; } } !<v8>: * COPY
|
||||
=====================
|
||||
== doSmth ==
|
||||
fun doSmth(s: String) {}
|
||||
|
||||
@@ -44,11 +44,11 @@ L4 [body entry point]:
|
||||
mark({return})
|
||||
ret L1 NEXT:[<END>]
|
||||
L5 [condition entry point]:
|
||||
- r(0) -> <v0> PREV:[]
|
||||
- r(1) -> <v1> PREV:[]
|
||||
- r(0) -> <v1> PREV:[]
|
||||
- r(1) -> <v2> PREV:[]
|
||||
- mark(0 > 1) PREV:[]
|
||||
- call(0 > 1, compareTo|<v0>, <v1>) -> <v2> PREV:[]
|
||||
- jt(L2 [loop entry point]|<v2>) NEXT:[read (Unit), mark({return})] PREV:[]
|
||||
- call(0 > 1, compareTo|<v1>, <v2>) -> <v3> PREV:[]
|
||||
- jt(L2 [loop entry point]|<v3>) NEXT:[read (Unit), mark({return})] PREV:[]
|
||||
L3 [loop exit point]:
|
||||
- read (Unit) PREV:[]
|
||||
L1:
|
||||
|
||||
@@ -5,11 +5,13 @@ fun main() {
|
||||
}
|
||||
}
|
||||
---------------------
|
||||
0 <v0>: {<: Comparable<Int>} NEW: r(0) -> <v0>
|
||||
1 <v1>: Int NEW: r(1) -> <v1>
|
||||
0 > 1 <v2>: Boolean NEW: call(0 > 1, compareTo|<v0>, <v1>) -> <v2>
|
||||
2 <v3>: * NEW: r(2) -> <v3>
|
||||
{ 2 } <v3>: * COPY
|
||||
0 <v0>: {<: Comparable<Int>} NEW: r(0) -> <v0>
|
||||
1 <v1>: Int NEW: r(1) -> <v1>
|
||||
0 > 1 <v2>: Boolean NEW: call(0 > 1, compareTo|<v0>, <v1>) -> <v2>
|
||||
2 <v3>: * NEW: r(2) -> <v3>
|
||||
{ 2 } <v3>: * COPY
|
||||
while(0 > 1) { 2 } !<v4>: *
|
||||
{ while(0 > 1) { 2 } } !<v4>: * COPY
|
||||
=====================
|
||||
== dowhile ==
|
||||
fun dowhile() {
|
||||
@@ -17,7 +19,11 @@ fun dowhile() {
|
||||
while(0 > 1)
|
||||
}
|
||||
---------------------
|
||||
0 <v0>: {<: Comparable<Int>} NEW: r(0) -> <v0>
|
||||
1 <v1>: Int NEW: r(1) -> <v1>
|
||||
0 > 1 <v2>: Boolean NEW: call(0 > 1, compareTo|<v0>, <v1>) -> <v2>
|
||||
return !<v0>: *
|
||||
{return} !<v0>: * COPY
|
||||
0 <v1>: {<: Comparable<Int>} NEW: r(0) -> <v1>
|
||||
1 <v2>: Int NEW: r(1) -> <v2>
|
||||
0 > 1 <v3>: Boolean NEW: call(0 > 1, compareTo|<v1>, <v2>) -> <v3>
|
||||
do {return} while(0 > 1) !<v4>: *
|
||||
{ do {return} while(0 > 1) } !<v4>: * COPY
|
||||
=====================
|
||||
|
||||
@@ -5,8 +5,11 @@ fun illegalWhenBlock(a: Any): Any {
|
||||
}
|
||||
}
|
||||
---------------------
|
||||
<v0>: {<: Any} NEW: magic[FAKE_INITIALIZER](a: Any) -> <v0>
|
||||
a <v1>: * NEW: r(a) -> <v1>
|
||||
is Int <v2>: * NEW: magic[IS](is Int|<v1>) -> <v2>
|
||||
a <v3>: {<: Any} NEW: r(a) -> <v3>
|
||||
<v0>: {<: Any} NEW: magic[FAKE_INITIALIZER](a: Any) -> <v0>
|
||||
a <v1>: * NEW: r(a) -> <v1>
|
||||
is Int <v2>: * NEW: magic[IS](is Int|<v1>) -> <v2>
|
||||
a <v3>: {<: Any} NEW: r(a) -> <v3>
|
||||
return a !<v4>: *
|
||||
when(a) { is Int -> return a } !<v4>: * COPY
|
||||
{ when(a) { is Int -> return a } } !<v4>: * COPY
|
||||
=====================
|
||||
|
||||
@@ -11,7 +11,7 @@ fun foo(a: Number) {
|
||||
}
|
||||
---------------------
|
||||
<v0>: {<: Number} NEW: magic[FAKE_INITIALIZER](a: Number) -> <v0>
|
||||
a <v1>: * NEW: r(a) -> <v1>
|
||||
a <v1>: * NEW: r(a) -> <v1>
|
||||
1 <v2>: * NEW: r(1) -> <v2>
|
||||
1 <v3>: * NEW: magic[EQUALS_IN_WHEN_CONDITION](1|<v1>, <v2>) -> <v3>
|
||||
"1" <v4>: {<: String?} NEW: r("1") -> <v4>
|
||||
|
||||
Reference in New Issue
Block a user