Control-Flow: Compute type predicates for arguments of unresolved calls

This commit is contained in:
Alexey Sedunov
2015-05-20 16:14:21 +03:00
parent 036e2c585b
commit b6ea2d4fd4
10 changed files with 397 additions and 2 deletions
@@ -0,0 +1,87 @@
== foo ==
fun foo(i: Int) {}
---------------------
L0:
1 <START>
v(i: Int)
magic[FAKE_INITIALIZER](i: Int) -> <v0>
w(i|<v0>)
2 mark({})
read (Unit)
L1:
1 <END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
=====================
== foo ==
fun foo(a: IntArray) {}
---------------------
L0:
1 <START>
v(a: IntArray)
magic[FAKE_INITIALIZER](a: IntArray) -> <v0>
w(a|<v0>)
2 mark({})
read (Unit)
L1:
1 <END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
=====================
== foo ==
fun foo(a: String, b: Int) {}
---------------------
L0:
1 <START>
v(a: String)
magic[FAKE_INITIALIZER](a: String) -> <v0>
w(a|<v0>)
v(b: Int)
magic[FAKE_INITIALIZER](b: Int) -> <v1>
w(b|<v1>)
2 mark({})
read (Unit)
L1:
1 <END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
=====================
== foo ==
fun foo() {}
---------------------
L0:
1 <START>
2 mark({})
read (Unit)
L1:
1 <END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
=====================
== test ==
fun test() {
foo(bar())
}
---------------------
L0:
1 <START>
2 mark({ foo(bar()) })
mark(bar())
magic[UNRESOLVED_CALL](bar()|!<v0>) -> <v1>
mark(foo(bar()))
magic[UNRESOLVED_CALL](foo(bar())|<v1>, !<v2>) -> <v3>
L1:
1 <END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
=====================
@@ -0,0 +1,8 @@
fun foo(i: Int) {}
fun foo(a: IntArray) {}
fun foo(a: String, b: Int) {}
fun foo() {}
fun test() {
foo(bar())
}
@@ -0,0 +1,31 @@
== foo ==
fun foo(i: Int) {}
---------------------
<v0>: Int NEW: magic[FAKE_INITIALIZER](i: Int) -> <v0>
=====================
== foo ==
fun foo(a: IntArray) {}
---------------------
<v0>: IntArray NEW: magic[FAKE_INITIALIZER](a: IntArray) -> <v0>
=====================
== foo ==
fun foo(a: String, b: Int) {}
---------------------
<v0>: String NEW: magic[FAKE_INITIALIZER](a: String) -> <v0>
<v1>: Int NEW: magic[FAKE_INITIALIZER](b: Int) -> <v1>
=====================
== foo ==
fun foo() {}
---------------------
=====================
== test ==
fun test() {
foo(bar())
}
---------------------
foo !<v2>: *
bar !<v0>: *
bar() <v1>: OR{{<: IntArray}, {<: Int}} NEW: magic[UNRESOLVED_CALL](bar()|!<v0>) -> <v1>
foo(bar()) <v3>: * NEW: magic[UNRESOLVED_CALL](foo(bar())|<v1>, !<v2>) -> <v3>
{ foo(bar()) } <v3>: * COPY
=====================
@@ -0,0 +1,105 @@
== Foo ==
open class Foo {
fun foo(a: IntArray) {}
fun foo(a: Int, b: Int) {}
}
---------------------
L0:
1 <START>
L1:
<END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
=====================
== foo ==
fun foo(a: IntArray) {}
---------------------
L0:
1 <START>
v(a: IntArray)
magic[FAKE_INITIALIZER](a: IntArray) -> <v0>
w(a|<v0>)
2 mark({})
read (Unit)
L1:
1 <END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
=====================
== foo ==
fun foo(a: Int, b: Int) {}
---------------------
L0:
1 <START>
v(a: Int)
magic[FAKE_INITIALIZER](a: Int) -> <v0>
w(a|<v0>)
v(b: Int)
magic[FAKE_INITIALIZER](b: Int) -> <v1>
w(b|<v1>)
2 mark({})
read (Unit)
L1:
1 <END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
=====================
== foo ==
fun Foo.foo(i: Int) {}
---------------------
L0:
1 <START>
v(i: Int)
magic[FAKE_INITIALIZER](i: Int) -> <v0>
w(i|<v0>)
2 mark({})
read (Unit)
L1:
1 <END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
=====================
== foo ==
fun Foo.foo() {}
---------------------
L0:
1 <START>
2 mark({})
read (Unit)
L1:
1 <END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
=====================
== test ==
fun test() {
Foo().foo(bar())
}
---------------------
L0:
1 <START>
2 mark({ Foo().foo(bar()) })
mark(Foo().foo(bar()))
mark(Foo())
call(Foo(), <init>) -> <v0>
mark(bar())
magic[UNRESOLVED_CALL](bar()|!<v1>) -> <v2>
mark(foo(bar()))
call(foo(bar()), foo|<v0>, <v2>) -> <v3>
L1:
1 <END> NEXT:[<SINK>]
error:
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
=====================
@@ -0,0 +1,11 @@
open class Foo {
fun foo(a: IntArray) {}
fun foo(a: Int, b: Int) {}
}
fun Foo.foo(i: Int) {}
fun Foo.foo() {}
fun test() {
Foo().foo(bar())
}
@@ -0,0 +1,39 @@
== Foo ==
open class Foo {
fun foo(a: IntArray) {}
fun foo(a: Int, b: Int) {}
}
---------------------
=====================
== foo ==
fun foo(a: IntArray) {}
---------------------
<v0>: IntArray NEW: magic[FAKE_INITIALIZER](a: IntArray) -> <v0>
=====================
== foo ==
fun foo(a: Int, b: Int) {}
---------------------
<v0>: Int NEW: magic[FAKE_INITIALIZER](a: Int) -> <v0>
<v1>: Int NEW: magic[FAKE_INITIALIZER](b: Int) -> <v1>
=====================
== foo ==
fun Foo.foo(i: Int) {}
---------------------
<v0>: Int NEW: magic[FAKE_INITIALIZER](i: Int) -> <v0>
=====================
== foo ==
fun Foo.foo() {}
---------------------
=====================
== test ==
fun test() {
Foo().foo(bar())
}
---------------------
Foo() <v0>: {<: Foo} NEW: call(Foo(), <init>) -> <v0>
bar !<v1>: *
bar() <v2>: IntArray NEW: magic[UNRESOLVED_CALL](bar()|!<v1>) -> <v2>
foo(bar()) <v3>: * NEW: call(foo(bar()), foo|<v0>, <v2>) -> <v3>
Foo().foo(bar()) <v3>: * COPY
{ Foo().foo(bar()) } <v3>: * COPY
=====================