Pseudocode: Introduce pseudo-value analysis
This commit is contained in:
@@ -26,55 +26,65 @@ fun assignments() : Unit {
|
||||
|
||||
val t = Test();
|
||||
t.x = 1
|
||||
t.x += 1
|
||||
}
|
||||
---------------------
|
||||
L0:
|
||||
1 <START>
|
||||
2 mark({ var x = 1 x = 2 x += 2 x = if (true) 1 else 2 val y = true && false val z = false && true val t = Test(); t.x = 1 })
|
||||
2 mark({ var x = 1 x = 2 x += 2 x = if (true) 1 else 2 val y = true && false val z = false && true val t = Test(); t.x = 1 t.x += 1 })
|
||||
v(var x = 1)
|
||||
r(1)
|
||||
w(x)
|
||||
r(2)
|
||||
w(x)
|
||||
r(1) -> <v0>
|
||||
w(x|<v0>)
|
||||
r(2) -> <v1>
|
||||
w(x|<v1>)
|
||||
mark(x += 2)
|
||||
r(x)
|
||||
r(2)
|
||||
call(+=, plus)
|
||||
w(x)
|
||||
r(x) -> <v2>
|
||||
r(2) -> <v3>
|
||||
call(+=, plus|<v2>, <v3>) -> <v4>
|
||||
w(x|<v4>)
|
||||
mark(if (true) 1 else 2)
|
||||
r(true)
|
||||
jf(L2) NEXT:[r(2), r(1)]
|
||||
r(1)
|
||||
jmp(L3) NEXT:[w(x)]
|
||||
r(true) -> <v5>
|
||||
jf(L2|<v5>) NEXT:[r(2) -> <v7>, r(1) -> <v6>]
|
||||
r(1) -> <v6>
|
||||
jmp(L3) NEXT:[magic(if (true) 1 else 2|<v6>, <v7>) -> <v8>]
|
||||
L2:
|
||||
r(2) PREV:[jf(L2)]
|
||||
r(2) -> <v7> PREV:[jf(L2|<v5>)]
|
||||
L3:
|
||||
w(x) PREV:[jmp(L3), r(2)]
|
||||
magic(if (true) 1 else 2|<v6>, <v7>) -> <v8> PREV:[jmp(L3), r(2) -> <v7>]
|
||||
w(x|<v8>)
|
||||
v(val y = true && false)
|
||||
r(true)
|
||||
jf(L4) NEXT:[r(true && false), r(false)]
|
||||
r(false)
|
||||
r(true) -> <v9>
|
||||
jf(L4|<v9>) NEXT:[magic(true && false|<v9>, <v10>) -> <v11>, r(false) -> <v10>]
|
||||
r(false) -> <v10>
|
||||
L4:
|
||||
r(true && false) PREV:[jf(L4), r(false)]
|
||||
w(y)
|
||||
magic(true && false|<v9>, <v10>) -> <v11> PREV:[jf(L4|<v9>), r(false) -> <v10>]
|
||||
w(y|<v11>)
|
||||
v(val z = false && true)
|
||||
r(false)
|
||||
jf(L5) NEXT:[r(false && true), r(true)]
|
||||
r(true)
|
||||
r(false) -> <v12>
|
||||
jf(L5|<v12>) NEXT:[magic(false && true|<v12>, <v13>) -> <v14>, r(true) -> <v13>]
|
||||
r(true) -> <v13>
|
||||
L5:
|
||||
r(false && true) PREV:[jf(L5), r(true)]
|
||||
w(z)
|
||||
magic(false && true|<v12>, <v13>) -> <v14> PREV:[jf(L5|<v12>), r(true) -> <v13>]
|
||||
w(z|<v14>)
|
||||
v(val t = Test())
|
||||
mark(Test())
|
||||
call(Test, <init>)
|
||||
w(t)
|
||||
r(1)
|
||||
r(t)
|
||||
w(t.x)
|
||||
call(Test, <init>) -> <v15>
|
||||
w(t|<v15>)
|
||||
r(1) -> <v16>
|
||||
r(t) -> <v17>
|
||||
w(t.x|<v17>, <v16>)
|
||||
mark(t.x += 1)
|
||||
mark(t.x)
|
||||
r(t) -> <v18>
|
||||
r(x|<v18>) -> <v19>
|
||||
r(1) -> <v20>
|
||||
call(+=, plus|<v19>, <v20>) -> <v21>
|
||||
r(t) -> <v22>
|
||||
w(t.x|<v22>, <v21>)
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>]
|
||||
1 <END> NEXT:[<SINK>]
|
||||
error:
|
||||
<ERROR> PREV:[]
|
||||
<ERROR> PREV:[]
|
||||
sink:
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
=====================
|
||||
|
||||
@@ -14,4 +14,5 @@ fun assignments() : Unit {
|
||||
|
||||
val t = Test();
|
||||
t.x = 1
|
||||
t.x += 1
|
||||
}
|
||||
@@ -20,63 +20,68 @@ fun lazyBooleans(a : Boolean, b : Boolean) : Unit {
|
||||
L0:
|
||||
1 <START>
|
||||
v(a : Boolean)
|
||||
w(a)
|
||||
magic(a : Boolean) -> <v0>
|
||||
w(a|<v0>)
|
||||
v(b : Boolean)
|
||||
w(b)
|
||||
magic(b : Boolean) -> <v1>
|
||||
w(b|<v1>)
|
||||
2 mark({ if (a) { 1 } else { 2 } 3 if (a && b) 5 else 6 7 if (a || b) 8 else 9 10 if (a) 11 12 if (a) else 13 14 })
|
||||
mark(if (a) { 1 } else { 2 })
|
||||
r(a)
|
||||
jf(L2) NEXT:[mark({ 2 }), mark({ 1 })]
|
||||
r(a) -> <v2>
|
||||
jf(L2|<v2>) NEXT:[mark({ 2 }), mark({ 1 })]
|
||||
3 mark({ 1 })
|
||||
r(1)
|
||||
2 jmp(L3) NEXT:[r(3)]
|
||||
r(1) -> <v3>
|
||||
2 jmp(L3) NEXT:[magic(if (a) { 1 } else { 2 }|<v3>, <v4>) -> <v5>]
|
||||
L2:
|
||||
3 mark({ 2 }) PREV:[jf(L2)]
|
||||
r(2)
|
||||
3 mark({ 2 }) PREV:[jf(L2|<v2>)]
|
||||
r(2) -> <v4>
|
||||
L3:
|
||||
2 r(3) PREV:[jmp(L3), r(2)]
|
||||
2 magic(if (a) { 1 } else { 2 }|<v3>, <v4>) -> <v5> PREV:[jmp(L3), r(2) -> <v4>]
|
||||
r(3) -> <v6>
|
||||
mark(if (a && b) 5 else 6)
|
||||
r(a)
|
||||
jf(L4) NEXT:[jf(L5), r(b)]
|
||||
r(b)
|
||||
r(a) -> <v7>
|
||||
jf(L4|<v7>) NEXT:[jf(L5), r(b) -> <v8>]
|
||||
r(b) -> <v8>
|
||||
L4:
|
||||
jf(L5) NEXT:[r(6), r(5)] PREV:[jf(L4), r(b)]
|
||||
r(5)
|
||||
jmp(L6) NEXT:[r(7)]
|
||||
jf(L5) NEXT:[r(6) -> <v10>, r(5) -> <v9>] PREV:[jf(L4|<v7>), r(b) -> <v8>]
|
||||
r(5) -> <v9>
|
||||
jmp(L6) NEXT:[magic(if (a && b) 5 else 6|<v9>, <v10>) -> <v11>]
|
||||
L5:
|
||||
r(6) PREV:[jf(L5)]
|
||||
r(6) -> <v10> PREV:[jf(L5)]
|
||||
L6:
|
||||
r(7) PREV:[jmp(L6), r(6)]
|
||||
magic(if (a && b) 5 else 6|<v9>, <v10>) -> <v11> PREV:[jmp(L6), r(6) -> <v10>]
|
||||
r(7) -> <v12>
|
||||
mark(if (a || b) 8 else 9)
|
||||
r(a)
|
||||
jt(L7) NEXT:[r(b), jf(L8)]
|
||||
r(b)
|
||||
r(a) -> <v13>
|
||||
jt(L7|<v13>) NEXT:[r(b) -> <v14>, jf(L8)]
|
||||
r(b) -> <v14>
|
||||
L7:
|
||||
jf(L8) NEXT:[r(9), r(8)] PREV:[jt(L7), r(b)]
|
||||
r(8)
|
||||
jmp(L9) NEXT:[r(10)]
|
||||
jf(L8) NEXT:[r(9) -> <v16>, r(8) -> <v15>] PREV:[jt(L7|<v13>), r(b) -> <v14>]
|
||||
r(8) -> <v15>
|
||||
jmp(L9) NEXT:[magic(if (a || b) 8 else 9|<v15>, <v16>) -> <v17>]
|
||||
L8:
|
||||
r(9) PREV:[jf(L8)]
|
||||
r(9) -> <v16> PREV:[jf(L8)]
|
||||
L9:
|
||||
r(10) PREV:[jmp(L9), r(9)]
|
||||
magic(if (a || b) 8 else 9|<v15>, <v16>) -> <v17> PREV:[jmp(L9), r(9) -> <v16>]
|
||||
r(10) -> <v18>
|
||||
mark(if (a) 11)
|
||||
r(a)
|
||||
jf(L10) NEXT:[read (Unit), r(11)]
|
||||
r(11)
|
||||
jmp(L11) NEXT:[r(12)]
|
||||
r(a) -> <v19>
|
||||
jf(L10|<v19>) NEXT:[read (Unit), r(11) -> <v20>]
|
||||
r(11) -> <v20>
|
||||
jmp(L11) NEXT:[r(12) -> <v21>]
|
||||
L10:
|
||||
read (Unit) PREV:[jf(L10)]
|
||||
read (Unit) PREV:[jf(L10|<v19>)]
|
||||
L11:
|
||||
r(12) PREV:[jmp(L11), read (Unit)]
|
||||
r(12) -> <v21> PREV:[jmp(L11), read (Unit)]
|
||||
mark(if (a) else 13)
|
||||
r(a)
|
||||
jf(L12) NEXT:[r(13), read (Unit)]
|
||||
r(a) -> <v22>
|
||||
jf(L12|<v22>) NEXT:[r(13) -> <v23>, read (Unit)]
|
||||
read (Unit)
|
||||
jmp(L13) NEXT:[r(14)]
|
||||
jmp(L13) NEXT:[r(14) -> <v24>]
|
||||
L12:
|
||||
r(13) PREV:[jf(L12)]
|
||||
r(13) -> <v23> PREV:[jf(L12|<v22>)]
|
||||
L13:
|
||||
r(14) PREV:[jmp(L13), r(13)]
|
||||
r(14) -> <v24> PREV:[jmp(L13), r(13) -> <v23>]
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>]
|
||||
error:
|
||||
|
||||
@@ -6,17 +6,17 @@ fun blockAndAndMismatch() : Boolean {
|
||||
L0:
|
||||
1 <START>
|
||||
2 mark({ false || (return false) })
|
||||
r(false)
|
||||
jt(L2) NEXT:[mark((return false)), r(false || (return false))]
|
||||
r(false) -> <v0>
|
||||
jt(L2|<v0>) NEXT:[mark((return false)), magic(false || (return false)|<v0>) -> <v2>]
|
||||
mark((return false))
|
||||
r(false)
|
||||
ret(*) L1 NEXT:[<END>]
|
||||
r(false) -> <v1>
|
||||
ret(*|<v1>) L1 NEXT:[<END>]
|
||||
L2:
|
||||
r(false || (return false)) PREV:[jt(L2)]
|
||||
magic(false || (return false)|<v0>) -> <v2> PREV:[jt(L2|<v0>)]
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>] PREV:[ret(*) L1, r(false || (return false))]
|
||||
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v1>) L1, magic(false || (return false)|<v0>) -> <v2>]
|
||||
error:
|
||||
<ERROR> PREV:[]
|
||||
<ERROR> PREV:[]
|
||||
sink:
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
=====================
|
||||
|
||||
@@ -6,9 +6,10 @@ fun Int.bar(c: C) {
|
||||
L0:
|
||||
1 <START>
|
||||
v(c: C)
|
||||
w(c)
|
||||
magic(c: C) -> <v0>
|
||||
w(c|<v0>)
|
||||
2 mark({ this = c })
|
||||
r(c)
|
||||
r(c) -> <v1>
|
||||
unsupported(BINARY_EXPRESSION : this = c)
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>]
|
||||
|
||||
@@ -62,8 +62,8 @@ L0:
|
||||
1 <START>
|
||||
2 mark({ val inTopLevel = 1.0 BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(IMPORT_KEYWORD, inTopLevel) .add(PACKAGE_KEYWORD, inTopLevel) .add(OVERRIDE_KEYWORD, inTopLevel) .add(IN_KEYWORD, inTopLevel, inTopLevel) .add(OUT_KEYWORD, inTopLevel) .add(OBJECT_KEYWORD, unresolvedCode) .registerAll() })
|
||||
v(val inTopLevel = 1.0)
|
||||
r(1.0)
|
||||
w(inTopLevel)
|
||||
r(1.0) -> <v0>
|
||||
w(inTopLevel|<v0>)
|
||||
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(IMPORT_KEYWORD, inTopLevel) .add(PACKAGE_KEYWORD, inTopLevel) .add(OVERRIDE_KEYWORD, inTopLevel) .add(IN_KEYWORD, inTopLevel, inTopLevel) .add(OUT_KEYWORD, inTopLevel) .add(OBJECT_KEYWORD, unresolvedCode) .registerAll())
|
||||
mark(registerAll())
|
||||
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(IMPORT_KEYWORD, inTopLevel) .add(PACKAGE_KEYWORD, inTopLevel) .add(OVERRIDE_KEYWORD, inTopLevel) .add(IN_KEYWORD, inTopLevel, inTopLevel) .add(OUT_KEYWORD, inTopLevel) .add(OBJECT_KEYWORD, unresolvedCode))
|
||||
@@ -111,111 +111,112 @@ L0:
|
||||
mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
|
||||
mark(add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel))
|
||||
mark(BunchKeywordRegister())
|
||||
call(BunchKeywordRegister, <init>)
|
||||
r(ABSTRACT_KEYWORD)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
call(add, add)
|
||||
r(FINAL_KEYWORD)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
call(add, add)
|
||||
r(OPEN_KEYWORD)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
call(add, add)
|
||||
r(INTERNAL_KEYWORD)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
call(add, add)
|
||||
r(PRIVATE_KEYWORD)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
call(add, add)
|
||||
r(PROTECTED_KEYWORD)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
call(add, add)
|
||||
r(PUBLIC_KEYWORD)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
call(add, add)
|
||||
r(CLASS_KEYWORD)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
call(add, add)
|
||||
r(ENUM_KEYWORD)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
call(add, add)
|
||||
r(FUN_KEYWORD)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
call(add, add)
|
||||
r(GET_KEYWORD)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
call(add, add)
|
||||
r(SET_KEYWORD)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
call(add, add)
|
||||
r(TRAIT_KEYWORD)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
call(add, add)
|
||||
r(VAL_KEYWORD)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
call(add, add)
|
||||
r(VAR_KEYWORD)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
call(add, add)
|
||||
r(TYPE_KEYWORD)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
call(add, add)
|
||||
r(IMPORT_KEYWORD)
|
||||
r(inTopLevel)
|
||||
call(add, add)
|
||||
r(PACKAGE_KEYWORD)
|
||||
r(inTopLevel)
|
||||
call(add, add)
|
||||
r(OVERRIDE_KEYWORD)
|
||||
r(inTopLevel)
|
||||
call(add, add)
|
||||
r(IN_KEYWORD)
|
||||
r(inTopLevel)
|
||||
r(inTopLevel)
|
||||
call(add, add)
|
||||
r(OUT_KEYWORD)
|
||||
r(inTopLevel)
|
||||
call(add, add)
|
||||
r(OBJECT_KEYWORD)
|
||||
call(BunchKeywordRegister, <init>) -> <v1>
|
||||
r(ABSTRACT_KEYWORD) -> <v2>
|
||||
r(inTopLevel) -> <v3>
|
||||
r(inTopLevel) -> <v4>
|
||||
r(inTopLevel) -> <v5>
|
||||
call(add, add|<v1>, <v2>, <v3>, <v4>, <v5>) -> <v6>
|
||||
r(FINAL_KEYWORD) -> <v7>
|
||||
r(inTopLevel) -> <v8>
|
||||
r(inTopLevel) -> <v9>
|
||||
r(inTopLevel) -> <v10>
|
||||
call(add, add|<v6>, <v7>, <v8>, <v9>, <v10>) -> <v11>
|
||||
r(OPEN_KEYWORD) -> <v12>
|
||||
r(inTopLevel) -> <v13>
|
||||
r(inTopLevel) -> <v14>
|
||||
r(inTopLevel) -> <v15>
|
||||
call(add, add|<v11>, <v12>, <v13>, <v14>, <v15>) -> <v16>
|
||||
r(INTERNAL_KEYWORD) -> <v17>
|
||||
r(inTopLevel) -> <v18>
|
||||
r(inTopLevel) -> <v19>
|
||||
r(inTopLevel) -> <v20>
|
||||
r(inTopLevel) -> <v21>
|
||||
call(add, add|<v16>, <v17>, <v18>, <v19>, <v20>, <v21>) -> <v22>
|
||||
r(PRIVATE_KEYWORD) -> <v23>
|
||||
r(inTopLevel) -> <v24>
|
||||
r(inTopLevel) -> <v25>
|
||||
r(inTopLevel) -> <v26>
|
||||
r(inTopLevel) -> <v27>
|
||||
call(add, add|<v22>, <v23>, <v24>, <v25>, <v26>, <v27>) -> <v28>
|
||||
r(PROTECTED_KEYWORD) -> <v29>
|
||||
r(inTopLevel) -> <v30>
|
||||
r(inTopLevel) -> <v31>
|
||||
r(inTopLevel) -> <v32>
|
||||
r(inTopLevel) -> <v33>
|
||||
call(add, add|<v28>, <v29>, <v30>, <v31>, <v32>, <v33>) -> <v34>
|
||||
r(PUBLIC_KEYWORD) -> <v35>
|
||||
r(inTopLevel) -> <v36>
|
||||
r(inTopLevel) -> <v37>
|
||||
r(inTopLevel) -> <v38>
|
||||
r(inTopLevel) -> <v39>
|
||||
call(add, add|<v34>, <v35>, <v36>, <v37>, <v38>, <v39>) -> <v40>
|
||||
r(CLASS_KEYWORD) -> <v41>
|
||||
r(inTopLevel) -> <v42>
|
||||
r(inTopLevel) -> <v43>
|
||||
r(inTopLevel) -> <v44>
|
||||
call(add, add|<v40>, <v41>, <v42>, <v43>, <v44>) -> <v45>
|
||||
r(ENUM_KEYWORD) -> <v46>
|
||||
r(inTopLevel) -> <v47>
|
||||
r(inTopLevel) -> <v48>
|
||||
r(inTopLevel) -> <v49>
|
||||
call(add, add|<v45>, <v46>, <v47>, <v48>, <v49>) -> <v50>
|
||||
r(FUN_KEYWORD) -> <v51>
|
||||
r(inTopLevel) -> <v52>
|
||||
r(inTopLevel) -> <v53>
|
||||
r(inTopLevel) -> <v54>
|
||||
call(add, add|<v50>, <v51>, <v52>, <v53>, <v54>) -> <v55>
|
||||
r(GET_KEYWORD) -> <v56>
|
||||
r(inTopLevel) -> <v57>
|
||||
r(inTopLevel) -> <v58>
|
||||
r(inTopLevel) -> <v59>
|
||||
call(add, add|<v55>, <v56>, <v57>, <v58>, <v59>) -> <v60>
|
||||
r(SET_KEYWORD) -> <v61>
|
||||
r(inTopLevel) -> <v62>
|
||||
r(inTopLevel) -> <v63>
|
||||
r(inTopLevel) -> <v64>
|
||||
call(add, add|<v60>, <v61>, <v62>, <v63>, <v64>) -> <v65>
|
||||
r(TRAIT_KEYWORD) -> <v66>
|
||||
r(inTopLevel) -> <v67>
|
||||
r(inTopLevel) -> <v68>
|
||||
r(inTopLevel) -> <v69>
|
||||
call(add, add|<v65>, <v66>, <v67>, <v68>, <v69>) -> <v70>
|
||||
r(VAL_KEYWORD) -> <v71>
|
||||
r(inTopLevel) -> <v72>
|
||||
r(inTopLevel) -> <v73>
|
||||
r(inTopLevel) -> <v74>
|
||||
call(add, add|<v70>, <v71>, <v72>, <v73>, <v74>) -> <v75>
|
||||
r(VAR_KEYWORD) -> <v76>
|
||||
r(inTopLevel) -> <v77>
|
||||
r(inTopLevel) -> <v78>
|
||||
r(inTopLevel) -> <v79>
|
||||
call(add, add|<v75>, <v76>, <v77>, <v78>, <v79>) -> <v80>
|
||||
r(TYPE_KEYWORD) -> <v81>
|
||||
r(inTopLevel) -> <v82>
|
||||
r(inTopLevel) -> <v83>
|
||||
r(inTopLevel) -> <v84>
|
||||
call(add, add|<v80>, <v81>, <v82>, <v83>, <v84>) -> <v85>
|
||||
r(IMPORT_KEYWORD) -> <v86>
|
||||
r(inTopLevel) -> <v87>
|
||||
call(add, add|<v85>, <v86>, <v87>) -> <v88>
|
||||
r(PACKAGE_KEYWORD) -> <v89>
|
||||
r(inTopLevel) -> <v90>
|
||||
call(add, add|<v88>, <v89>, <v90>) -> <v91>
|
||||
r(OVERRIDE_KEYWORD) -> <v92>
|
||||
r(inTopLevel) -> <v93>
|
||||
call(add, add|<v91>, <v92>, <v93>) -> <v94>
|
||||
r(IN_KEYWORD) -> <v95>
|
||||
r(inTopLevel) -> <v96>
|
||||
r(inTopLevel) -> <v97>
|
||||
call(add, add|<v94>, <v95>, <v96>, <v97>) -> <v98>
|
||||
r(OUT_KEYWORD) -> <v99>
|
||||
r(inTopLevel) -> <v100>
|
||||
call(add, add|<v98>, <v99>, <v100>) -> <v101>
|
||||
r(OBJECT_KEYWORD) -> <v102>
|
||||
error(unresolvedCode, No resolved call)
|
||||
call(add, add)
|
||||
call(registerAll, registerAll)
|
||||
magic(unresolvedCode) -> <v103>
|
||||
call(add, add|<v101>, <v102>, <v103>) -> <v104>
|
||||
call(registerAll, registerAll|<v104>) -> <v105>
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -230,8 +231,8 @@ L0:
|
||||
1 <START>
|
||||
v(val ABSTRACT_KEYWORD = JetToken())
|
||||
mark(JetToken())
|
||||
call(JetToken, <init>)
|
||||
w(ABSTRACT_KEYWORD)
|
||||
call(JetToken, <init>) -> <v0>
|
||||
w(ABSTRACT_KEYWORD|<v0>)
|
||||
L1:
|
||||
<END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -259,8 +260,8 @@ L0:
|
||||
1 <START>
|
||||
v(val OPEN_KEYWORD = JetToken())
|
||||
mark(JetToken())
|
||||
call(JetToken, <init>)
|
||||
w(OPEN_KEYWORD)
|
||||
call(JetToken, <init>) -> <v0>
|
||||
w(OPEN_KEYWORD|<v0>)
|
||||
L1:
|
||||
<END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -275,8 +276,8 @@ L0:
|
||||
1 <START>
|
||||
v(val INTERNAL_KEYWORD = JetToken())
|
||||
mark(JetToken())
|
||||
call(JetToken, <init>)
|
||||
w(INTERNAL_KEYWORD)
|
||||
call(JetToken, <init>) -> <v0>
|
||||
w(INTERNAL_KEYWORD|<v0>)
|
||||
L1:
|
||||
<END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -291,8 +292,8 @@ L0:
|
||||
1 <START>
|
||||
v(val PRIVATE_KEYWORD = JetToken())
|
||||
mark(JetToken())
|
||||
call(JetToken, <init>)
|
||||
w(PRIVATE_KEYWORD)
|
||||
call(JetToken, <init>) -> <v0>
|
||||
w(PRIVATE_KEYWORD|<v0>)
|
||||
L1:
|
||||
<END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -307,8 +308,8 @@ L0:
|
||||
1 <START>
|
||||
v(val PROTECTED_KEYWORD = JetToken())
|
||||
mark(JetToken())
|
||||
call(JetToken, <init>)
|
||||
w(PROTECTED_KEYWORD)
|
||||
call(JetToken, <init>) -> <v0>
|
||||
w(PROTECTED_KEYWORD|<v0>)
|
||||
L1:
|
||||
<END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -323,8 +324,8 @@ L0:
|
||||
1 <START>
|
||||
v(val PUBLIC_KEYWORD = JetToken())
|
||||
mark(JetToken())
|
||||
call(JetToken, <init>)
|
||||
w(PUBLIC_KEYWORD)
|
||||
call(JetToken, <init>) -> <v0>
|
||||
w(PUBLIC_KEYWORD|<v0>)
|
||||
L1:
|
||||
<END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -339,8 +340,8 @@ L0:
|
||||
1 <START>
|
||||
v(val CLASS_KEYWORD = JetToken())
|
||||
mark(JetToken())
|
||||
call(JetToken, <init>)
|
||||
w(CLASS_KEYWORD)
|
||||
call(JetToken, <init>) -> <v0>
|
||||
w(CLASS_KEYWORD|<v0>)
|
||||
L1:
|
||||
<END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -355,8 +356,8 @@ L0:
|
||||
1 <START>
|
||||
v(val ENUM_KEYWORD = JetToken())
|
||||
mark(JetToken())
|
||||
call(JetToken, <init>)
|
||||
w(ENUM_KEYWORD)
|
||||
call(JetToken, <init>) -> <v0>
|
||||
w(ENUM_KEYWORD|<v0>)
|
||||
L1:
|
||||
<END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -371,8 +372,8 @@ L0:
|
||||
1 <START>
|
||||
v(val FUN_KEYWORD = JetToken())
|
||||
mark(JetToken())
|
||||
call(JetToken, <init>)
|
||||
w(FUN_KEYWORD)
|
||||
call(JetToken, <init>) -> <v0>
|
||||
w(FUN_KEYWORD|<v0>)
|
||||
L1:
|
||||
<END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -387,8 +388,8 @@ L0:
|
||||
1 <START>
|
||||
v(val GET_KEYWORD = JetToken())
|
||||
mark(JetToken())
|
||||
call(JetToken, <init>)
|
||||
w(GET_KEYWORD)
|
||||
call(JetToken, <init>) -> <v0>
|
||||
w(GET_KEYWORD|<v0>)
|
||||
L1:
|
||||
<END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -403,8 +404,8 @@ L0:
|
||||
1 <START>
|
||||
v(val SET_KEYWORD = JetToken())
|
||||
mark(JetToken())
|
||||
call(JetToken, <init>)
|
||||
w(SET_KEYWORD)
|
||||
call(JetToken, <init>) -> <v0>
|
||||
w(SET_KEYWORD|<v0>)
|
||||
L1:
|
||||
<END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -419,8 +420,8 @@ L0:
|
||||
1 <START>
|
||||
v(val TRAIT_KEYWORD = JetToken())
|
||||
mark(JetToken())
|
||||
call(JetToken, <init>)
|
||||
w(TRAIT_KEYWORD)
|
||||
call(JetToken, <init>) -> <v0>
|
||||
w(TRAIT_KEYWORD|<v0>)
|
||||
L1:
|
||||
<END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -435,8 +436,8 @@ L0:
|
||||
1 <START>
|
||||
v(val VAL_KEYWORD = JetToken())
|
||||
mark(JetToken())
|
||||
call(JetToken, <init>)
|
||||
w(VAL_KEYWORD)
|
||||
call(JetToken, <init>) -> <v0>
|
||||
w(VAL_KEYWORD|<v0>)
|
||||
L1:
|
||||
<END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -451,8 +452,8 @@ L0:
|
||||
1 <START>
|
||||
v(val VAR_KEYWORD = JetToken())
|
||||
mark(JetToken())
|
||||
call(JetToken, <init>)
|
||||
w(VAR_KEYWORD)
|
||||
call(JetToken, <init>) -> <v0>
|
||||
w(VAR_KEYWORD|<v0>)
|
||||
L1:
|
||||
<END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -467,8 +468,8 @@ L0:
|
||||
1 <START>
|
||||
v(val TYPE_KEYWORD = JetToken())
|
||||
mark(JetToken())
|
||||
call(JetToken, <init>)
|
||||
w(TYPE_KEYWORD)
|
||||
call(JetToken, <init>) -> <v0>
|
||||
w(TYPE_KEYWORD|<v0>)
|
||||
L1:
|
||||
<END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -483,8 +484,8 @@ L0:
|
||||
1 <START>
|
||||
v(val IMPORT_KEYWORD = JetToken())
|
||||
mark(JetToken())
|
||||
call(JetToken, <init>)
|
||||
w(IMPORT_KEYWORD)
|
||||
call(JetToken, <init>) -> <v0>
|
||||
w(IMPORT_KEYWORD|<v0>)
|
||||
L1:
|
||||
<END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -499,8 +500,8 @@ L0:
|
||||
1 <START>
|
||||
v(val PACKAGE_KEYWORD = JetToken())
|
||||
mark(JetToken())
|
||||
call(JetToken, <init>)
|
||||
w(PACKAGE_KEYWORD)
|
||||
call(JetToken, <init>) -> <v0>
|
||||
w(PACKAGE_KEYWORD|<v0>)
|
||||
L1:
|
||||
<END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -515,8 +516,8 @@ L0:
|
||||
1 <START>
|
||||
v(val OVERRIDE_KEYWORD = JetToken())
|
||||
mark(JetToken())
|
||||
call(JetToken, <init>)
|
||||
w(OVERRIDE_KEYWORD)
|
||||
call(JetToken, <init>) -> <v0>
|
||||
w(OVERRIDE_KEYWORD|<v0>)
|
||||
L1:
|
||||
<END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -531,8 +532,8 @@ L0:
|
||||
1 <START>
|
||||
v(val IN_KEYWORD = JetToken())
|
||||
mark(JetToken())
|
||||
call(JetToken, <init>)
|
||||
w(IN_KEYWORD)
|
||||
call(JetToken, <init>) -> <v0>
|
||||
w(IN_KEYWORD|<v0>)
|
||||
L1:
|
||||
<END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -547,8 +548,8 @@ L0:
|
||||
1 <START>
|
||||
v(val OUT_KEYWORD = JetToken())
|
||||
mark(JetToken())
|
||||
call(JetToken, <init>)
|
||||
w(OUT_KEYWORD)
|
||||
call(JetToken, <init>) -> <v0>
|
||||
w(OUT_KEYWORD|<v0>)
|
||||
L1:
|
||||
<END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -563,8 +564,8 @@ L0:
|
||||
1 <START>
|
||||
v(val OBJECT_KEYWORD = JetToken())
|
||||
mark(JetToken())
|
||||
call(JetToken, <init>)
|
||||
w(OBJECT_KEYWORD)
|
||||
call(JetToken, <init>) -> <v0>
|
||||
w(OBJECT_KEYWORD|<v0>)
|
||||
L1:
|
||||
<END> NEXT:[<SINK>]
|
||||
error:
|
||||
|
||||
@@ -6,16 +6,17 @@ fun invoke(f: () -> Unit) {
|
||||
L0:
|
||||
1 <START>
|
||||
v(f: () -> Unit)
|
||||
w(f)
|
||||
magic(f: () -> Unit) -> <v0>
|
||||
w(f|<v0>)
|
||||
2 mark({ (f)() })
|
||||
mark((f)())
|
||||
mark((f))
|
||||
r(f)
|
||||
call((f), invoke)
|
||||
r(f) -> <v1>
|
||||
call((f), invoke|<v1>) -> <v2>
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>]
|
||||
1 <END> NEXT:[<SINK>]
|
||||
error:
|
||||
<ERROR> PREV:[]
|
||||
<ERROR> PREV:[]
|
||||
sink:
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
=====================
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
== doSomething ==
|
||||
fun Any?.doSomething() {}
|
||||
---------------------
|
||||
L0:
|
||||
1 <START>
|
||||
2 mark({})
|
||||
read (Unit)
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>]
|
||||
error:
|
||||
<ERROR> PREV:[]
|
||||
sink:
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
=====================
|
||||
== bar ==
|
||||
fun bar(): Nothing = throw Exception()
|
||||
---------------------
|
||||
L0:
|
||||
1 <START>
|
||||
mark(throw Exception())
|
||||
mark(Exception())
|
||||
call(Exception, <init>) -> <v0>
|
||||
throw (throw Exception()|<v0>) NEXT:[<ERROR>]
|
||||
L1:
|
||||
<END> NEXT:[<SINK>] PREV:[]
|
||||
error:
|
||||
<ERROR> PREV:[throw (throw Exception()|<v0>)]
|
||||
sink:
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
=====================
|
||||
== foo ==
|
||||
fun foo() {
|
||||
null!!.doSomething()
|
||||
bar().doSomething
|
||||
}
|
||||
---------------------
|
||||
L0:
|
||||
1 <START>
|
||||
2 mark({ null!!.doSomething() bar().doSomething })
|
||||
mark(null!!.doSomething())
|
||||
mark(doSomething())
|
||||
mark(null!!)
|
||||
r(null) -> <v0>
|
||||
magic(null!!|<v0>) -> <v1>
|
||||
jmp(error) NEXT:[<ERROR>]
|
||||
- call(doSomething, doSomething|<v1>) -> <v2> PREV:[]
|
||||
- mark(bar().doSomething) PREV:[]
|
||||
- mark(bar()) PREV:[]
|
||||
- call(bar, bar) PREV:[]
|
||||
- jmp(error) NEXT:[<ERROR>] PREV:[]
|
||||
- call(doSomething, doSomething) -> <v3> PREV:[]
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>] PREV:[]
|
||||
error:
|
||||
<ERROR> PREV:[jmp(error)]
|
||||
sink:
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
=====================
|
||||
@@ -0,0 +1,8 @@
|
||||
fun Any?.doSomething() {}
|
||||
|
||||
fun bar(): Nothing = throw Exception()
|
||||
|
||||
fun foo() {
|
||||
null!!.doSomething()
|
||||
bar().doSomething
|
||||
}
|
||||
@@ -6,15 +6,16 @@ fun test(s: String?) {
|
||||
L0:
|
||||
1 <START>
|
||||
v(s: String?)
|
||||
w(s)
|
||||
magic(s: String?) -> <v0>
|
||||
w(s|<v0>)
|
||||
2 mark({ s?.length })
|
||||
mark(s?.length)
|
||||
r(s)
|
||||
r(length)
|
||||
r(s) -> <v1>
|
||||
r(length|<v1>) -> <v2>
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>]
|
||||
1 <END> NEXT:[<SINK>]
|
||||
error:
|
||||
<ERROR> PREV:[]
|
||||
<ERROR> PREV:[]
|
||||
sink:
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
=====================
|
||||
|
||||
@@ -6,14 +6,16 @@ fun foo(s: String) {
|
||||
L0:
|
||||
1 <START>
|
||||
v(s: String)
|
||||
w(s)
|
||||
magic(s: String) -> <v0>
|
||||
w(s|<v0>)
|
||||
2 mark({ s. })
|
||||
mark(s.)
|
||||
r(s)
|
||||
r(s) -> <v1>
|
||||
magic(s.|<v1>) -> <v2>
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>]
|
||||
1 <END> NEXT:[<SINK>]
|
||||
error:
|
||||
<ERROR> PREV:[]
|
||||
<ERROR> PREV:[]
|
||||
sink:
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
=====================
|
||||
|
||||
@@ -7,11 +7,11 @@ L0:
|
||||
1 <START>
|
||||
2 mark({ this() })
|
||||
mark(this())
|
||||
call(this, invoke)
|
||||
call(this, invoke) -> <v0>
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>]
|
||||
1 <END> NEXT:[<SINK>]
|
||||
error:
|
||||
<ERROR> PREV:[]
|
||||
<ERROR> PREV:[]
|
||||
sink:
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
=====================
|
||||
|
||||
+4
-2
@@ -6,13 +6,15 @@ fun test(a: Any) {
|
||||
L0:
|
||||
1 <START>
|
||||
v(a: Any)
|
||||
w(a)
|
||||
magic(a: Any) -> <v0>
|
||||
w(a|<v0>)
|
||||
2 mark({ a.foo() })
|
||||
mark(a.foo())
|
||||
mark(foo())
|
||||
error(foo, No resolved call)
|
||||
error(foo, No resolved call)
|
||||
r(a)
|
||||
r(a) -> <v1>
|
||||
magic(foo|<v1>) -> <v2>
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>]
|
||||
error:
|
||||
@@ -0,0 +1,22 @@
|
||||
== test ==
|
||||
fun test(a: Any) {
|
||||
a.foo
|
||||
}
|
||||
---------------------
|
||||
L0:
|
||||
1 <START>
|
||||
v(a: Any)
|
||||
magic(a: Any) -> <v0>
|
||||
w(a|<v0>)
|
||||
2 mark({ a.foo })
|
||||
mark(a.foo)
|
||||
error(foo, No resolved call)
|
||||
r(a) -> <v1>
|
||||
magic(foo|<v1>) -> <v2>
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>]
|
||||
error:
|
||||
<ERROR> PREV:[]
|
||||
sink:
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
=====================
|
||||
@@ -0,0 +1,3 @@
|
||||
fun test(a: Any) {
|
||||
a.foo
|
||||
}
|
||||
@@ -6,13 +6,15 @@ fun main(arg : Array<String>) {
|
||||
L0:
|
||||
1 <START>
|
||||
v(arg : Array<String>)
|
||||
w(arg)
|
||||
magic(arg : Array<String>) -> <v0>
|
||||
w(arg|<v0>)
|
||||
2 mark({ a })
|
||||
error(a, No resolved call)
|
||||
magic(a) -> <v1>
|
||||
L1:
|
||||
1 <END> NEXT:[<SINK>]
|
||||
1 <END> NEXT:[<SINK>]
|
||||
error:
|
||||
<ERROR> PREV:[]
|
||||
<ERROR> PREV:[]
|
||||
sink:
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
<SINK> PREV:[<ERROR>, <END>]
|
||||
=====================
|
||||
|
||||
Reference in New Issue
Block a user