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