== myRun == inline fun myRun(block: () -> T): T { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } return block() } --------------------- : {<: () -> T} NEW: magic[FAKE_INITIALIZER](block: () -> T) -> { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } : {<: ContractBuilder.() -> Unit} NEW: r({ callsInPlace(block, InvocationKind.EXACTLY_ONCE) }) -> contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } : * NEW: call(contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) }, contract|) -> block : {<: () -> T} NEW: r(block) -> block() : {<: T} NEW: call(block(), invoke|) -> return block() !: * { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } return block() } !: * COPY ===================== == anonymous_0 == { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } --------------------- : {<: ContractBuilder} NEW: magic[IMPLICIT_RECEIVER](callsInPlace(block, InvocationKind.EXACTLY_ONCE)) -> block : {<: Function} NEW: r(block) -> EXACTLY_ONCE : {<: InvocationKind} NEW: r(EXACTLY_ONCE) -> InvocationKind.EXACTLY_ONCE : {<: InvocationKind} COPY callsInPlace(block, InvocationKind.EXACTLY_ONCE) : * NEW: call(callsInPlace(block, InvocationKind.EXACTLY_ONCE), callsInPlace|, , ) -> callsInPlace(block, InvocationKind.EXACTLY_ONCE) : * COPY ===================== == someComputation == fun someComputation(): Int = 42 --------------------- 42 : Int NEW: r(42) -> ===================== == tryCatchInlined == fun tryCatchInlined() { val x: Int myRun { try { x = someComputation() x.inc() } catch (e: java.lang.Exception) { // I? x.inc() } } // I? x.inc() } --------------------- { try { x = someComputation() x.inc() } catch (e: java.lang.Exception) { // I? x.inc() } } : {<: () -> Int} NEW: r({ try { x = someComputation() x.inc() } catch (e: java.lang.Exception) { // I? x.inc() } }) -> myRun { try { x = someComputation() x.inc() } catch (e: java.lang.Exception) { // I? x.inc() } } : * NEW: call(myRun { try { x = someComputation() x.inc() } catch (e: java.lang.Exception) { // I? x.inc() } }, myRun|) -> x : Int NEW: r(x) -> inc() : * NEW: call(inc(), inc|) -> x.inc() : * COPY { val x: Int myRun { try { x = someComputation() x.inc() } catch (e: java.lang.Exception) { // I? x.inc() } } // I? x.inc() } : * COPY ===================== == inlined anonymous_1 == { try { x = someComputation() x.inc() } catch (e: java.lang.Exception) { // I? x.inc() } } --------------------- : {<: Exception} NEW: magic[FAKE_INITIALIZER](e: java.lang.Exception) -> someComputation() : Int NEW: call(someComputation(), someComputation) -> x : Int NEW: r(x) -> inc() : Int NEW: call(inc(), inc|) -> x.inc() : Int COPY { x = someComputation() x.inc() } : Int COPY x : Int NEW: r(x) -> inc() : Int NEW: call(inc(), inc|) -> x.inc() : Int COPY { // I? x.inc() } : Int COPY try { x = someComputation() x.inc() } catch (e: java.lang.Exception) { // I? x.inc() } : Int NEW: merge(try { x = someComputation() x.inc() } catch (e: java.lang.Exception) { // I? x.inc() }|, ) -> try { x = someComputation() x.inc() } catch (e: java.lang.Exception) { // I? x.inc() } : Int COPY ===================== == possibleReassignmentInTryCatch == fun possibleReassignmentInTryCatch() { val x: Int myRun { x = 42 try { x = someComputation() x.inc() } catch (e: java.lang.Exception) { // Possible reassignment x = 42 x.inc() } // Initialized x.inc() } // Initialized x.inc() } --------------------- { x = 42 try { x = someComputation() x.inc() } catch (e: java.lang.Exception) { // Possible reassignment x = 42 x.inc() } // Initialized x.inc() } : {<: () -> Int} NEW: r({ x = 42 try { x = someComputation() x.inc() } catch (e: java.lang.Exception) { // Possible reassignment x = 42 x.inc() } // Initialized x.inc() }) -> myRun { x = 42 try { x = someComputation() x.inc() } catch (e: java.lang.Exception) { // Possible reassignment x = 42 x.inc() } // Initialized x.inc() } : * NEW: call(myRun { x = 42 try { x = someComputation() x.inc() } catch (e: java.lang.Exception) { // Possible reassignment x = 42 x.inc() } // Initialized x.inc() }, myRun|) -> x : Int NEW: r(x) -> inc() : * NEW: call(inc(), inc|) -> x.inc() : * COPY { val x: Int myRun { x = 42 try { x = someComputation() x.inc() } catch (e: java.lang.Exception) { // Possible reassignment x = 42 x.inc() } // Initialized x.inc() } // Initialized x.inc() } : * COPY ===================== == inlined anonymous_2 == { x = 42 try { x = someComputation() x.inc() } catch (e: java.lang.Exception) { // Possible reassignment x = 42 x.inc() } // Initialized x.inc() } --------------------- : {<: Exception} NEW: magic[FAKE_INITIALIZER](e: java.lang.Exception) -> 42 : Int NEW: r(42) -> someComputation() : Int NEW: call(someComputation(), someComputation) -> x : Int NEW: r(x) -> inc() : * NEW: call(inc(), inc|) -> x.inc() : * COPY { x = someComputation() x.inc() } : * COPY 42 : Int NEW: r(42) -> x : Int NEW: r(x) -> inc() : * NEW: call(inc(), inc|) -> x.inc() : * COPY { // Possible reassignment x = 42 x.inc() } : * COPY try { x = someComputation() x.inc() } catch (e: java.lang.Exception) { // Possible reassignment x = 42 x.inc() } : * NEW: merge(try { x = someComputation() x.inc() } catch (e: java.lang.Exception) { // Possible reassignment x = 42 x.inc() }|, ) -> x : Int NEW: r(x) -> inc() : Int NEW: call(inc(), inc|) -> x.inc() : Int COPY x = 42 try { x = someComputation() x.inc() } catch (e: java.lang.Exception) { // Possible reassignment x = 42 x.inc() } // Initialized x.inc() : Int COPY ===================== == tryCatchOuter == fun tryCatchOuter() { var x: Int try { myRun { x = someComputation() x.inc() } } catch (e: java.lang.UnsupportedOperationException) { myRun { x = 42 } } catch (e: java.lang.Exception) { // do nothing } // I? because we can leave with last catch-clause which doesn't initialize x x.inc() } --------------------- : {<: UnsupportedOperationException} NEW: magic[FAKE_INITIALIZER](e: java.lang.UnsupportedOperationException) -> : {<: Exception} NEW: magic[FAKE_INITIALIZER](e: java.lang.Exception) -> { x = someComputation() x.inc() } : {<: () -> Int} NEW: r({ x = someComputation() x.inc() }) -> myRun { x = someComputation() x.inc() } : * NEW: call(myRun { x = someComputation() x.inc() }, myRun|) -> { myRun { x = someComputation() x.inc() } } : * COPY { x = 42 } : {<: () -> Unit} NEW: r({ x = 42 }) -> myRun { x = 42 } : * NEW: call(myRun { x = 42 }, myRun|) -> { myRun { x = 42 } } : * COPY { // do nothing } !: * try { myRun { x = someComputation() x.inc() } } catch (e: java.lang.UnsupportedOperationException) { myRun { x = 42 } } catch (e: java.lang.Exception) { // do nothing } : * NEW: merge(try { myRun { x = someComputation() x.inc() } } catch (e: java.lang.UnsupportedOperationException) { myRun { x = 42 } } catch (e: java.lang.Exception) { // do nothing }|, , !) -> x : Int NEW: r(x) -> inc() : * NEW: call(inc(), inc|) -> x.inc() : * COPY { var x: Int try { myRun { x = someComputation() x.inc() } } catch (e: java.lang.UnsupportedOperationException) { myRun { x = 42 } } catch (e: java.lang.Exception) { // do nothing } // I? because we can leave with last catch-clause which doesn't initialize x x.inc() } : * COPY ===================== == inlined anonymous_3 == { x = someComputation() x.inc() } --------------------- someComputation() : Int NEW: call(someComputation(), someComputation) -> x : Int NEW: r(x) -> inc() : Int NEW: call(inc(), inc|) -> x.inc() : Int COPY x = someComputation() x.inc() : Int COPY ===================== == inlined anonymous_4 == { x = 42 } --------------------- 42 : Int NEW: r(42) -> x = 42 !: * x = 42 !: * COPY =====================