== Test == class Test { var x : Int; } --------------------- L0: 1 v(var x : Int;) L1: NEXT:[] error: PREV:[] sink: PREV:[, ] ===================== == assignments == fun assignments() : Unit { 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 } --------------------- L0: 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(x) -> r(2) -> mark(x += 2) call(x += 2, plus|, ) -> w(x|) mark(if (true) 1 else 2) r(true) -> jf(L2|) NEXT:[r(2) -> , r(1) -> ] r(1) -> jmp(L3) NEXT:[merge(if (true) 1 else 2|, ) -> ] L2 [else branch]: r(2) -> PREV:[jf(L2|)] L3 ['if' expression result]: merge(if (true) 1 else 2|, ) -> PREV:[jmp(L3), r(2) -> ] w(x|) v(val y = true && false) r(true) -> jf(L4|) NEXT:[magic[AND](true && false|, ) -> , r(false) -> ] r(false) -> L4 [result of boolean operation]: magic[AND](true && false|, ) -> PREV:[jf(L4|), r(false) -> ] w(y|) v(val z = false && true) r(false) -> jf(L5|) NEXT:[magic[AND](false && true|, ) -> , r(true) -> ] r(true) -> L5 [result of boolean operation]: magic[AND](false && true|, ) -> PREV:[jf(L5|), r(true) -> ] w(z|) v(val t = Test()) mark(Test()) call(Test(), ) -> w(t|) r(t) -> r(1) -> w(t.x|, ) mark(t.x) r(t) -> r(x|) -> r(1) -> mark(t.x += 1) call(t.x += 1, plus|, ) -> w(t.x|, ) L1: 1 NEXT:[] error: PREV:[] sink: PREV:[, ] =====================