edbf360852
The reason is that while there are optimizations for them definition of their state is both rather simple and may be confusing in testData
48 lines
3.5 KiB
Plaintext
Vendored
48 lines
3.5 KiB
Plaintext
Vendored
== f ==
|
|
fun f() {
|
|
var foo = 1
|
|
try {
|
|
foo = 2
|
|
throw RuntimeException()
|
|
} catch (e: Throwable) {
|
|
println(foo)
|
|
}
|
|
}
|
|
---------------------
|
|
L0:
|
|
1 <START> INIT: in: {} out: {} USE: in: {} out: {}
|
|
2 mark({ var foo = 1 try { foo = 2 throw RuntimeException() } catch (e: Throwable) { println(foo) } })
|
|
v(var foo = 1) INIT: in: {} out: {foo=D}
|
|
r(1) -> <v0> INIT: in: {foo=D} out: {foo=D}
|
|
w(foo|<v0>) INIT: in: {foo=D} out: {foo=ID}
|
|
mark(try { foo = 2 throw RuntimeException() } catch (e: Throwable) { println(foo) }) INIT: in: {foo=ID} out: {foo=ID}
|
|
jmp?(L2) USE: in: {foo=READ} out: {foo=READ}
|
|
3 mark({ foo = 2 throw RuntimeException() })
|
|
r(2) -> <v1> USE: in: {foo=WRITTEN_AFTER_READ} out: {foo=WRITTEN_AFTER_READ}
|
|
w(foo|<v1>) USE: in: {foo=READ} out: {foo=WRITTEN_AFTER_READ}
|
|
mark(throw RuntimeException())
|
|
jmp?(L2) USE: in: {foo=READ} out: {foo=READ}
|
|
mark(RuntimeException())
|
|
call(RuntimeException(), <init>) -> <v2>
|
|
throw (throw RuntimeException()|<v2>) USE: in: {} out: {}
|
|
- 2 jmp?(L2)
|
|
- jmp(L3)
|
|
L2 [onException]:
|
|
3 v(e: Throwable) INIT: in: {foo=ID} out: {foo=ID}
|
|
magic[FAKE_INITIALIZER](e: Throwable) -> <v4> INIT: in: {foo=ID} out: {foo=ID}
|
|
w(e|<v4>) INIT: in: {foo=ID} out: {foo=ID}
|
|
4 mark({ println(foo) }) INIT: in: {foo=ID} out: {foo=ID} USE: in: {foo=READ} out: {foo=READ}
|
|
r(foo) -> <v5> USE: in: {} out: {foo=READ}
|
|
mark(println(foo))
|
|
magic[UNRESOLVED_CALL](println(foo)|<v5>, !<v6>) -> <v7>
|
|
3 jmp(L3)
|
|
L3 [afterCatches]:
|
|
2 merge(try { foo = 2 throw RuntimeException() } catch (e: Throwable) { println(foo) }|!<v3>, <v7>) -> <v8>
|
|
L1:
|
|
1 <END> INIT: in: {} out: {}
|
|
error:
|
|
<ERROR>
|
|
sink:
|
|
<SINK> USE: in: {} out: {}
|
|
=====================
|