== C == class C() { val a: Int = 1 class object { val x : Int { $x = 1 } fun foo() { val b : Int = 1 doSmth(b) } } } --------------------- L0: 1 v(val a: Int = 1) r(1) -> w(a|) L1: NEXT:[] error: PREV:[] sink: PREV:[, ] ===================== == doSmth == fun doSmth(i: Int) {} --------------------- L0: 1 v(i: Int) magic[FAKE_INITIALIZER](i: Int) -> w(i|) 2 mark({}) read (Unit) L1: 1 NEXT:[] error: PREV:[] sink: PREV:[, ] ===================== == test1 == fun test1() { val a = object { val x : Int { $x = 1 } } } --------------------- L0: 1 2 mark({ val a = object { val x : Int { $x = 1 } } }) v(val a = object { val x : Int { $x = 1 } }) mark(object { val x : Int { $x = 1 } }) v(val x : Int) 3 mark({ $x = 1 }) magic[IMPLICIT_RECEIVER]($x) -> r(1) -> w($x|, ) 2 r(object { val x : Int { $x = 1 } }) -> w(a|) L1: 1 NEXT:[] error: PREV:[] sink: PREV:[, ] ===================== == O == object O { val x : Int { $x = 1 } } --------------------- L0: 1 v(val x : Int) 2 mark({ $x = 1 }) magic[IMPLICIT_RECEIVER]($x) -> r(1) -> w($x|, ) L1: 1 NEXT:[] error: PREV:[] sink: PREV:[, ] ===================== == test2 == fun test2() { val b = 1 val a = object { val x = b } } --------------------- L0: 1 2 mark({ val b = 1 val a = object { val x = b } }) v(val b = 1) r(1) -> w(b|) v(val a = object { val x = b }) mark(object { val x = b }) v(val x = b) r(b) -> w(x|) r(object { val x = b }) -> w(a|) L1: 1 NEXT:[] error: PREV:[] sink: PREV:[, ] ===================== == test3 == fun test3() { val a = object { val y : Int fun inner_bar() { y = 10 } } } --------------------- L0: 1 2 mark({ val a = object { val y : Int fun inner_bar() { y = 10 } } }) v(val a = object { val y : Int fun inner_bar() { y = 10 } }) mark(object { val y : Int fun inner_bar() { y = 10 } }) v(val y : Int) jmp?(L2) NEXT:[r(object { val y : Int fun inner_bar() { y = 10 } }) -> , d(fun inner_bar() { y = 10 })] d(fun inner_bar() { y = 10 }) NEXT:[] L2: r(object { val y : Int fun inner_bar() { y = 10 } }) -> PREV:[jmp?(L2)] w(a|) L1: 1 NEXT:[] error: PREV:[] sink: PREV:[, , d(fun inner_bar() { y = 10 })] ===================== == inner_bar == fun inner_bar() { y = 10 } --------------------- L3: 3 4 mark({ y = 10 }) magic[IMPLICIT_RECEIVER](y) -> r(10) -> w(y|, ) L4: 3 NEXT:[] error: PREV:[] sink: PREV:[, ] ===================== == test4 == fun test4() { val a = object { val x : Int val y : Int { $x = 1 } fun ggg() { y = 10 } } } --------------------- L0: 1 2 mark({ val a = object { val x : Int val y : Int { $x = 1 } fun ggg() { y = 10 } } }) v(val a = object { val x : Int val y : Int { $x = 1 } fun ggg() { y = 10 } }) mark(object { val x : Int val y : Int { $x = 1 } fun ggg() { y = 10 } }) v(val x : Int) v(val y : Int) 3 mark({ $x = 1 }) magic[IMPLICIT_RECEIVER]($x) -> r(1) -> w($x|, ) 2 jmp?(L2) NEXT:[r(object { val x : Int val y : Int { $x = 1 } fun ggg() { y = 10 } }) -> , d(fun ggg() { y = 10 })] d(fun ggg() { y = 10 }) NEXT:[] L2: r(object { val x : Int val y : Int { $x = 1 } fun ggg() { y = 10 } }) -> PREV:[jmp?(L2)] w(a|) L1: 1 NEXT:[] error: PREV:[] sink: PREV:[, , d(fun ggg() { y = 10 })] ===================== == ggg == fun ggg() { y = 10 } --------------------- L3: 3 4 mark({ y = 10 }) magic[IMPLICIT_RECEIVER](y) -> r(10) -> w(y|, ) L4: 3 NEXT:[] error: PREV:[] sink: PREV:[, ] ===================== == test5 == fun test5() { val a = object { var x = 1 { $x = 2 } fun foo() { x = 3 } fun bar() { x = 4 } } } --------------------- L0: 1 2 mark({ val a = object { var x = 1 { $x = 2 } fun foo() { x = 3 } fun bar() { x = 4 } } }) v(val a = object { var x = 1 { $x = 2 } fun foo() { x = 3 } fun bar() { x = 4 } }) mark(object { var x = 1 { $x = 2 } fun foo() { x = 3 } fun bar() { x = 4 } }) v(var x = 1) r(1) -> w(x|) 3 mark({ $x = 2 }) magic[IMPLICIT_RECEIVER]($x) -> r(2) -> w($x|, ) 2 jmp?(L2) NEXT:[jmp?(L5), d(fun foo() { x = 3 })] d(fun foo() { x = 3 }) NEXT:[] L2: jmp?(L5) NEXT:[r(object { var x = 1 { $x = 2 } fun foo() { x = 3 } fun bar() { x = 4 } }) -> , d(fun bar() { x = 4 })] PREV:[jmp?(L2)] d(fun bar() { x = 4 }) NEXT:[] L5: r(object { var x = 1 { $x = 2 } fun foo() { x = 3 } fun bar() { x = 4 } }) -> PREV:[jmp?(L5)] w(a|) L1: 1 NEXT:[] error: PREV:[] sink: PREV:[, , d(fun foo() { x = 3 }), d(fun bar() { x = 4 })] ===================== == foo == fun foo() { x = 3 } --------------------- L3: 3 4 mark({ x = 3 }) magic[IMPLICIT_RECEIVER](x) -> r(3) -> w(x|, ) L4: 3 NEXT:[] error: PREV:[] sink: PREV:[, ] ===================== == bar == fun bar() { x = 4 } --------------------- L6: 3 4 mark({ x = 4 }) magic[IMPLICIT_RECEIVER](x) -> r(4) -> w(x|, ) L7: 3 NEXT:[] error: PREV:[] sink: PREV:[, ] =====================