CFA: additional jumps to catch / finally generated in the end of try / before exits from try #KT-5469 Fixed

Also #KT-13612 Fixed
(cherry picked from commit 7c188b3)
This commit is contained in:
Mikhail Glukhikh
2016-04-20 17:34:19 +03:00
committed by Mikhail Glukhikh
parent 43954699a7
commit f8039249c6
28 changed files with 638 additions and 89 deletions
@@ -33,6 +33,7 @@ L12 [condition entry point]:
magic[VALUE_CONSUMER](true|<v2>) -> <v3>
L10 [body entry point]:
5 mark({ continue@outer })
jmp?(L7) NEXT:[mark({ break }), mark({ break })]
L13 [start finally]:
6 mark({ break })
jmp(L3) NEXT:[read (Unit)]
@@ -42,9 +43,10 @@ L14 [finish finally]:
L9 [loop exit point]:
L11 [body exit point]:
- read (Unit) PREV:[]
- 3 jmp(L15) NEXT:[mark({ break })] PREV:[]
- 3 jmp?(L7) NEXT:[mark({ break }), jmp(L15)] PREV:[]
- jmp(L15) NEXT:[mark({ break })] PREV:[]
L7 [onExceptionToFinallyBlock]:
6 mark({ break }) PREV:[jmp?(L7)]
6 mark({ break }) PREV:[jmp?(L7), jmp?(L7)]
jmp(L3) NEXT:[read (Unit)]
- 3 jmp(error) NEXT:[<ERROR>] PREV:[]
L15 [skipFinallyToErrorBlock]:
@@ -100,6 +102,7 @@ L12 [condition entry point]:
magic[VALUE_CONSUMER](true|<v2>) -> <v3>
L10 [body entry point]:
5 mark({ continue@outer })
jmp?(L7) NEXT:[mark({ return "OK" }), mark({ return "OK" })]
L13 [start finally]:
6 mark({ return "OK" })
mark("OK")
@@ -111,9 +114,10 @@ L14 [finish finally]:
L9 [loop exit point]:
L11 [body exit point]:
- read (Unit) PREV:[]
- 3 jmp(L15) NEXT:[mark({ return "OK" })] PREV:[]
- 3 jmp?(L7) NEXT:[mark({ return "OK" }), jmp(L15)] PREV:[]
- jmp(L15) NEXT:[mark({ return "OK" })] PREV:[]
L7 [onExceptionToFinallyBlock]:
6 mark({ return "OK" }) PREV:[jmp?(L7)]
6 mark({ return "OK" }) PREV:[jmp?(L7), jmp?(L7)]
mark("OK")
r("OK") -> <v4>
ret(*|<v4>) L1 NEXT:[<END>]
@@ -135,3 +139,71 @@ error:
sink:
<SINK> PREV:[<ERROR>, <END>]
=====================
== baz ==
fun baz(): String {
outer@while (true) {
try {
inner@while (true) {
continue@inner
}
} finally {
return "OK"
}
}
}
---------------------
L0:
1 <START>
2 mark({ outer@while (true) { try { inner@while (true) { continue@inner } } finally { return "OK" } } })
mark(outer@while (true) { try { inner@while (true) { continue@inner } } finally { return "OK" } })
L2 [loop entry point]:
L6 [condition entry point]:
r(true) -> <v0>
mark(while (true) { try { inner@while (true) { continue@inner } } finally { return "OK" } })
magic[VALUE_CONSUMER](true|<v0>) -> <v1>
L4 [body entry point]:
3 mark({ try { inner@while (true) { continue@inner } } finally { return "OK" } })
mark(try { inner@while (true) { continue@inner } } finally { return "OK" })
jmp?(L7) NEXT:[mark({ return "OK" }), mark({ inner@while (true) { continue@inner } })]
4 mark({ inner@while (true) { continue@inner } })
mark(inner@while (true) { continue@inner })
L8 [loop entry point]:
L12 [condition entry point]:
r(true) -> <v2> PREV:[mark(inner@while (true) { continue@inner }), jmp(L12)]
mark(while (true) { continue@inner })
magic[VALUE_CONSUMER](true|<v2>) -> <v3>
L10 [body entry point]:
5 mark({ continue@inner })
jmp(L12) NEXT:[r(true) -> <v2>]
- 4 jmp(L8) NEXT:[r(true) -> <v2>] PREV:[]
L9 [loop exit point]:
L11 [body exit point]:
- read (Unit) PREV:[]
- 3 jmp?(L7) NEXT:[mark({ return "OK" }), jmp(L13)] PREV:[]
- jmp(L13) NEXT:[mark({ return "OK" })] PREV:[]
L7 [onExceptionToFinallyBlock]:
L14 [start finally]:
4 mark({ return "OK" }) PREV:[jmp?(L7)]
mark("OK")
r("OK") -> <v6>
ret(*|<v6>) L1 NEXT:[<END>]
L15 [finish finally]:
- 3 jmp(error) NEXT:[<ERROR>] PREV:[]
L13 [skipFinallyToErrorBlock]:
L16 [copy of L7, onExceptionToFinallyBlock]:
- 4 mark({ return "OK" }) PREV:[]
- mark("OK") PREV:[]
- r("OK") -> <v6> PREV:[]
- ret(*|<v6>) L1 NEXT:[<END>] PREV:[]
- 3 merge(try { inner@while (true) { continue@inner } } finally { return "OK" }|!<v5>) -> <v8> PREV:[]
- 2 jmp(L2) NEXT:[r(true) -> <v0>] PREV:[]
L3 [loop exit point]:
L5 [body exit point]:
- read (Unit) PREV:[]
L1:
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v6>) L1]
error:
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
=====================