== s == val s = mutableListOf() --------------------- L0: 1 v(val s = mutableListOf()) mark(mutableListOf()) magic[UNRESOLVED_CALL](mutableListOf()|!) -> w(s|) L1: NEXT:[] error: PREV:[] sink: PREV:[, ] ===================== == test == fun test(name: String?, flag: Boolean): Boolean { try { name?.let { if (flag) { s.add(it) } else { s.remove(it) } return true } return false } finally { name?.hashCode() } } --------------------- L0: 1 v(name: String?) magic[FAKE_INITIALIZER](name: String?) -> w(name|) v(flag: Boolean) magic[FAKE_INITIALIZER](flag: Boolean) -> w(flag|) 2 mark({ try { name?.let { if (flag) { s.add(it) } else { s.remove(it) } return true } return false } finally { name?.hashCode() } }) mark(try { name?.let { if (flag) { s.add(it) } else { s.remove(it) } return true } return false } finally { name?.hashCode() }) jmp?(L2) NEXT:[mark({ name?.hashCode() }), mark({ name?.let { if (flag) { s.add(it) } else { s.remove(it) } return true } return false })] 3 mark({ name?.let { if (flag) { s.add(it) } else { s.remove(it) } return true } return false }) mark(name?.let { if (flag) { s.add(it) } else { s.remove(it) } return true }) jf(L3) NEXT:[jmp?(L2), r(name) -> ] r(name) -> mark({ if (flag) { s.add(it) } else { s.remove(it) } return true }) jmp?(L4) NEXT:[r({ if (flag) { s.add(it) } else { s.remove(it) } return true }) -> , d({ if (flag) { s.add(it) } else { s.remove(it) } return true })] d({ if (flag) { s.add(it) } else { s.remove(it) } return true }) NEXT:[] L4 [after local declaration]: r({ if (flag) { s.add(it) } else { s.remove(it) } return true }) -> PREV:[jmp?(L4)] mark(let { if (flag) { s.add(it) } else { s.remove(it) } return true }) call(let { if (flag) { s.add(it) } else { s.remove(it) } return true }, let|, ) L3 [result of call]: jmp?(L2) NEXT:[mark({ name?.hashCode() }), r(false) -> ] PREV:[jf(L3), call(let { if (flag) { s.add(it) } else { s.remove(it) } return true }, let|, )] r(false) -> 6 mark({ name?.hashCode() }) mark(name?.hashCode()) jf(L12) NEXT:[ret(*|) L1, r(name) -> ] r(name) -> mark(hashCode()) call(hashCode(), hashCode|) -> L12 [copy of L10, result of call]: 3 ret(*|) L1 NEXT:[] PREV:[jf(L12), call(hashCode(), hashCode|) -> ] - 2 jmp?(L2) NEXT:[mark({ name?.hashCode() }), jmp(L13)] PREV:[] - jmp(L13) NEXT:[mark({ name?.hashCode() })] PREV:[] L2 [onExceptionToFinallyBlock]: 6 mark({ name?.hashCode() }) PREV:[jmp?(L2), jmp?(L2)] mark(name?.hashCode()) jf(L14) NEXT:[jmp(error), r(name) -> ] r(name) -> mark(hashCode()) call(hashCode(), hashCode|) -> L14 [copy of L10, result of call]: 2 jmp(error) NEXT:[] PREV:[jf(L14), call(hashCode(), hashCode|) -> ] L13 [skipFinallyToErrorBlock]: - 6 mark({ name?.hashCode() }) PREV:[] - mark(name?.hashCode()) PREV:[] - jf(L15) NEXT:[merge(try { name?.let { if (flag) { s.add(it) } else { s.remove(it) } return true } return false } finally { name?.hashCode() }|!) -> , r(name) -> ] PREV:[] - r(name) -> PREV:[] - mark(hashCode()) PREV:[] - call(hashCode(), hashCode|) -> PREV:[] L15 [copy of L10, result of call]: - 2 merge(try { name?.let { if (flag) { s.add(it) } else { s.remove(it) } return true } return false } finally { name?.hashCode() }|!) -> PREV:[] L1: 1 NEXT:[] PREV:[ret(*|) L1, ret(*|) L1] error: PREV:[jmp(error)] sink: PREV:[, , d({ if (flag) { s.add(it) } else { s.remove(it) } return true })] ===================== == anonymous_0 == { if (flag) { s.add(it) } else { s.remove(it) } return true } --------------------- L5: 4 5 mark(if (flag) { s.add(it) } else { s.remove(it) } return true) mark(if (flag) { s.add(it) } else { s.remove(it) }) r(flag) -> jf(L7|) NEXT:[mark({ s.remove(it) }), mark({ s.add(it) })] 6 mark({ s.add(it) }) mark(s.add(it)) r(s) -> r(it) -> magic[VALUE_CONSUMER](it|) -> mark(add(it)) call(add(it), |) -> 5 jmp(L8) NEXT:[merge(if (flag) { s.add(it) } else { s.remove(it) }|, ) -> ] L7 [else branch]: 6 mark({ s.remove(it) }) PREV:[jf(L7|)] mark(s.remove(it)) r(s) -> r(it) -> magic[VALUE_CONSUMER](it|) -> mark(remove(it)) call(remove(it), |) -> L8 ['if' expression result]: 5 merge(if (flag) { s.add(it) } else { s.remove(it) }|, ) -> PREV:[jmp(L8), call(remove(it), |) -> ] r(true) -> L9 [start finally]: 6 mark({ name?.hashCode() }) mark(name?.hashCode()) jf(L10) NEXT:[ret(*|) L1, r(name) -> ] r(name) -> mark(hashCode()) call(hashCode(), hashCode|) -> L10 [result of call]: L11 [finish finally]: 5 ret(*|) L1 NEXT:[] PREV:[jf(L10), call(hashCode(), hashCode|) -> ] - 4 ret(*|!) L6 PREV:[] L6: NEXT:[] PREV:[] error: PREV:[] sink: PREV:[, ] =====================