From 94809075148351caf10cf2238a068fda358c54ad Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Thu, 12 Jun 2014 12:58:57 +0400 Subject: [PATCH] Mark some expressions after processing their components when it's semantically correct Expressions: calls, 'for' loops, elvis operators It's significant for reporting 'unreachable code' correctly --- .../jet/lang/cfg/JetControlFlowProcessor.java | 22 +++-- .../BasicExpressionTypingVisitor.java | 2 +- .../basic/IfWithUninitialized.instructions | 6 +- .../basic/UsageInFunctionLiteral.instructions | 12 +-- .../basic/VariablesUsage.instructions | 8 +- ...eferenceToPropertyInitializer.instructions | 10 +-- .../bugs/varInitializationInIf.instructions | 6 +- .../varInitializationInIfInCycle.instructions | 16 ++-- .../lexicalScopes/doWhileScope.instructions | 2 +- .../lexicalScopes/forScope.instructions | 8 +- .../functionLiteralScope.instructions | 6 +- .../localFunctionScope.instructions | 6 +- ...localFunctionScopeWithoutBody.instructions | 6 +- .../lexicalScopes/whileScope.instructions | 2 +- .../cfg/arrays/ArrayAccess.instructions | 4 +- .../cfg/arrays/ArrayOfFunctions.instructions | 3 +- .../arrays/arrayAccessExpression.instructions | 3 +- .../testData/cfg/arrays/arrayInc.instructions | 3 +- .../arrays/arraySetPlusAssign.instructions | 3 +- .../testData/cfg/basic/Basic.instructions | 12 +-- .../cfg/bugs/jumpToOuterScope.instructions | 4 +- .../controlStructures/Finally.instructions | 80 +++++++++---------- .../FinallyTestCopy.instructions | 16 ++-- .../cfg/controlStructures/For.instructions | 8 +- .../cfg/controlStructures/If.instructions | 16 ++-- .../OnlyWhileInFunctionBody.instructions | 10 +-- .../cfg/conventions/equals.instructions | 2 +- .../incrementAtTheEnd.instructions | 2 +- .../cfg/conventions/invoke.instructions | 2 +- .../cfg/conventions/notEqual.instructions | 2 +- .../cfg/deadCode/returnInElvis.instructions | 1 + .../local/ObjectExpression.instructions | 2 +- ...backingFieldQualifiedWithThis.instructions | 2 +- .../cfg/expressions/Assignments.instructions | 4 +- .../chainedQualifiedExpression.instructions | 48 +++++------ .../expressionAsFunction.instructions | 2 +- .../cfg/expressions/nothingExpr.instructions | 4 +- .../expressions/unresolvedCall.instructions | 2 +- .../testData/cfg/tailCalls/sum.instructions | 12 +-- 39 files changed, 181 insertions(+), 178 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index 7379e15f149..1cc0a9090fb 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -16,7 +16,6 @@ package org.jetbrains.jet.lang.cfg; -import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import com.intellij.psi.PsiElement; import com.intellij.psi.tree.IElementType; @@ -333,9 +332,6 @@ public class JetControlFlowProcessor { public void visitBinaryExpressionVoid(@NotNull JetBinaryExpression expression, CFPContext context) { JetSimpleNameExpression operationReference = expression.getOperationReference(); IElementType operationType = operationReference.getReferencedNameElementType(); - if (!ImmutableSet.of(ANDAND, OROR, EQ, ELVIS).contains(operationType)) { - mark(expression); - } JetExpression left = expression.getLeft(); JetExpression right = expression.getRight(); @@ -385,11 +381,12 @@ public class JetControlFlowProcessor { } } else { - generateBothArguments(expression); + generateBothArgumentsAndMark(expression); } } else if (operationType == ELVIS) { generateInstructions(left, NOT_IN_CONDITION); + mark(expression); Label afterElvis = builder.createUnboundLabel(); builder.jumpOnTrue(afterElvis, expression, builder.getBoundValue(left)); if (right != null) { @@ -400,7 +397,7 @@ public class JetControlFlowProcessor { } else { if (!generateCall(expression, operationReference)) { - generateBothArguments(expression); + generateBothArgumentsAndMark(expression); } } } @@ -430,7 +427,7 @@ public class JetControlFlowProcessor { ); } - private void generateBothArguments(JetBinaryExpression expression) { + private void generateBothArgumentsAndMark(JetBinaryExpression expression) { JetExpression left = JetPsiUtil.deparenthesize(expression.getLeft()); if (left != null) { generateInstructions(left, NOT_IN_CONDITION); @@ -439,8 +436,8 @@ public class JetControlFlowProcessor { if (right != null) { generateInstructions(right, NOT_IN_CONDITION); } - createNonSyntheticValue(expression, left, right); + mark(expression); } private void visitAssignment(JetExpression lhs, @NotNull Function0 rhsDeferredValue, JetExpression parentExpression) { @@ -592,7 +589,6 @@ public class JetControlFlowProcessor { @Override public void visitUnaryExpressionVoid(@NotNull JetUnaryExpression expression, CFPContext context) { - mark(expression); JetSimpleNameExpression operationSign = expression.getOperationReference(); IElementType operationType = operationSign.getReferencedNameElementType(); JetExpression baseExpression = expression.getBaseExpression(); @@ -795,7 +791,6 @@ public class JetControlFlowProcessor { @Override public void visitWhileExpressionVoid(@NotNull JetWhileExpression expression, CFPContext context) { - mark(expression); LoopInfo loopInfo = builder.enterLoop(expression, null, null); builder.bindLabel(loopInfo.getConditionEntryPoint()); @@ -803,6 +798,7 @@ public class JetControlFlowProcessor { if (condition != null) { generateInstructions(condition, IN_CONDITION); } + mark(expression); boolean conditionIsTrueConstant = CompileTimeConstantUtils.canBeReducedToBooleanConstant(condition, trace, true); if (!conditionIsTrueConstant) { builder.jumpOnFalse(loopInfo.getExitPoint(), expression, builder.getBoundValue(condition)); @@ -843,7 +839,6 @@ public class JetControlFlowProcessor { @Override public void visitForExpressionVoid(@NotNull JetForExpression expression, CFPContext context) { builder.enterLexicalScope(expression); - mark(expression); JetExpression loopRange = expression.getLoopRange(); if (loopRange != null) { @@ -863,6 +858,7 @@ public class JetControlFlowProcessor { builder.bindLabel(loopInfo.getBodyEntryPoint()); writeLoopParameterAssignment(expression); + mark(expression); JetExpression body = expression.getBody(); if (body != null) { generateInstructions(body, NOT_IN_CONDITION); @@ -1070,8 +1066,6 @@ public class JetControlFlowProcessor { @Override public void visitCallExpressionVoid(@NotNull JetCallExpression expression, CFPContext context) { - mark(expression); - JetExpression calleeExpression = expression.getCalleeExpression(); if (!generateCall(expression, calleeExpression)) { List inputExpressions = new ArrayList(); @@ -1090,6 +1084,7 @@ public class JetControlFlowProcessor { inputExpressions.add(calleeExpression); inputExpressions.add(generateAndGetReceiverIfAny(expression)); + mark(expression); createNonSyntheticValue(expression, inputExpressions); } } @@ -1416,6 +1411,7 @@ public class JetControlFlowProcessor { : "Variable-based call with non-empty argument list: " + resolvedCall.getCall().getCallElement().getText(); return builder.readVariable(calleeExpression, callExpression, resolvedCall, receivers); } + mark(resolvedCall.getCall().getCallElement()); return builder.call(calleeExpression, callExpression, resolvedCall, receivers, parameterValues); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java index 9b836f765d3..b15e9a82b6a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java @@ -882,7 +882,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { context.trace, "trace to resolve 'equals(Any?)' interpreting as of type Any? an expression:", right); traceInterpretingRightAsNullableAny.record(EXPRESSION_TYPE, right, KotlinBuiltIns.getInstance().getNullableAnyType()); - Call call = CallMaker.makeCallWithExpressions(operationSign, receiver, null, operationSign, Collections.singletonList(right)); + Call call = CallMaker.makeCallWithExpressions(expression, receiver, null, operationSign, Collections.singletonList(right)); ExpressionTypingContext newContext = context.replaceBindingTrace(traceInterpretingRightAsNullableAny); OverloadResolutionResults resolutionResults = components.callResolver.resolveCallWithGivenName(newContext, call, operationSign, OperatorConventions.EQUALS); diff --git a/compiler/testData/cfg-variables/basic/IfWithUninitialized.instructions b/compiler/testData/cfg-variables/basic/IfWithUninitialized.instructions index 2afa0f4bfc8..bc3499991b5 100644 --- a/compiler/testData/cfg-variables/basic/IfWithUninitialized.instructions +++ b/compiler/testData/cfg-variables/basic/IfWithUninitialized.instructions @@ -14,14 +14,14 @@ L0: 2 mark({ val b: Boolean if (1 < 2) { use(b) } else { b = true } }) v(val b: Boolean) INIT: in: {} out: {b=D} mark(if (1 < 2) { use(b) } else { b = true }) INIT: in: {b=D} out: {b=D} - mark(1 < 2) r(1) -> r(2) -> + mark(1 < 2) call(<, compareTo|, ) -> jf(L2|) - 3 mark({ use(b) }) - mark(use(b)) USE: in: {b=READ} out: {b=READ} + 3 mark({ use(b) }) USE: in: {b=READ} out: {b=READ} r(b) -> USE: in: {} out: {b=READ} + mark(use(b)) call(use, use|) -> 2 jmp(L3) USE: in: {} out: {} L2: diff --git a/compiler/testData/cfg-variables/basic/UsageInFunctionLiteral.instructions b/compiler/testData/cfg-variables/basic/UsageInFunctionLiteral.instructions index da8b9a71781..c1df1eb55e0 100644 --- a/compiler/testData/cfg-variables/basic/UsageInFunctionLiteral.instructions +++ b/compiler/testData/cfg-variables/basic/UsageInFunctionLiteral.instructions @@ -39,14 +39,14 @@ L3: magic(x: Int) -> INIT: in: {x=D} out: {x=D} w(x|) INIT: in: {x=D} out: {x=ID} 4 mark(val y = x + a use(a)) INIT: in: {x=ID} out: {x=ID} - v(val y = x + a) INIT: in: {x=ID} out: {x=ID, y=D} - mark(x + a) INIT: in: {x=ID, y=D} out: {x=ID, y=D} USE: in: {a=READ, x=READ} out: {a=READ, x=READ} - r(x) -> USE: in: {a=READ} out: {a=READ, x=READ} + v(val y = x + a) INIT: in: {x=ID} out: {x=ID, y=D} USE: in: {a=READ, x=READ} out: {a=READ, x=READ} + r(x) -> INIT: in: {x=ID, y=D} out: {x=ID, y=D} USE: in: {a=READ} out: {a=READ, x=READ} r(a) -> + mark(x + a) call(+, plus|, ) -> - w(y|) INIT: in: {x=ID, y=D} out: {x=ID, y=ID} - mark(use(a)) INIT: in: {x=ID, y=ID} out: {x=ID, y=ID} USE: in: {a=READ} out: {a=READ} - r(a) -> USE: in: {} out: {a=READ} + w(y|) INIT: in: {x=ID, y=D} out: {x=ID, y=ID} USE: in: {a=READ} out: {a=READ} + r(a) -> INIT: in: {x=ID, y=ID} out: {x=ID, y=ID} USE: in: {} out: {a=READ} + mark(use(a)) call(use, use|) -> L4: 3 INIT: in: {x=ID} out: {x=ID} diff --git a/compiler/testData/cfg-variables/basic/VariablesUsage.instructions b/compiler/testData/cfg-variables/basic/VariablesUsage.instructions index c4b90e6cd19..e7ef96d159d 100644 --- a/compiler/testData/cfg-variables/basic/VariablesUsage.instructions +++ b/compiler/testData/cfg-variables/basic/VariablesUsage.instructions @@ -11,14 +11,14 @@ L0: 2 mark({ var a = 1 use(a) a = 2 use(a) }) v(var a = 1) INIT: in: {} out: {a=D} r(1) -> INIT: in: {a=D} out: {a=D} - w(a|) INIT: in: {a=D} out: {a=ID} - mark(use(a)) INIT: in: {a=ID} out: {a=ID} USE: in: {a=READ} out: {a=READ} - r(a) -> USE: in: {a=WRITTEN_AFTER_READ} out: {a=READ} + w(a|) INIT: in: {a=D} out: {a=ID} USE: in: {a=READ} out: {a=READ} + r(a) -> INIT: in: {a=ID} out: {a=ID} USE: in: {a=WRITTEN_AFTER_READ} out: {a=READ} + mark(use(a)) call(use, use|) -> r(2) -> USE: in: {a=WRITTEN_AFTER_READ} out: {a=WRITTEN_AFTER_READ} w(a|) USE: in: {a=READ} out: {a=WRITTEN_AFTER_READ} - mark(use(a)) USE: in: {a=READ} out: {a=READ} r(a) -> USE: in: {} out: {a=READ} + mark(use(a)) call(use, use|) -> L1: 1 INIT: in: {} out: {} diff --git a/compiler/testData/cfg-variables/bugs/referenceToPropertyInitializer.instructions b/compiler/testData/cfg-variables/bugs/referenceToPropertyInitializer.instructions index fe4512be268..ff2efa51a56 100644 --- a/compiler/testData/cfg-variables/bugs/referenceToPropertyInitializer.instructions +++ b/compiler/testData/cfg-variables/bugs/referenceToPropertyInitializer.instructions @@ -32,16 +32,16 @@ L3: magic(x: Int) -> INIT: in: {x=D} out: {x=D} w(x|) INIT: in: {x=D} out: {x=ID} 3 mark(sum(x - 1) + x) INIT: in: {x=ID} out: {x=ID} - mark(sum(x - 1) + x) - mark(sum(x - 1)) magic(sum) -> USE: in: {sum=READ, x=READ} out: {sum=READ, x=READ} r(sum|) -> USE: in: {x=READ} out: {sum=READ, x=READ} - mark(x - 1) r(x) -> r(1) -> + mark(x - 1) call(-, minus|, ) -> + mark(sum(x - 1)) call(sum, invoke|, ) -> USE: in: {x=READ} out: {x=READ} r(x) -> USE: in: {} out: {x=READ} + mark(sum(x - 1) + x) call(+, plus|, ) -> L4: 2 @@ -127,10 +127,10 @@ class TestOther { L0: 1 INIT: in: {} out: {} v(val x: Int = x + 1) INIT: in: {} out: {x=D} - mark(x + 1) INIT: in: {x=D} out: {x=D} - magic(x) -> USE: in: {x=READ} out: {x=READ} + magic(x) -> INIT: in: {x=D} out: {x=D} USE: in: {x=READ} out: {x=READ} r(x|) -> USE: in: {} out: {x=READ} r(1) -> + mark(x + 1) call(+, plus|, ) -> w(x|) INIT: in: {x=D} out: {x=ID} L1: diff --git a/compiler/testData/cfg-variables/bugs/varInitializationInIf.instructions b/compiler/testData/cfg-variables/bugs/varInitializationInIf.instructions index 96d9c9a1284..c21437571e3 100644 --- a/compiler/testData/cfg-variables/bugs/varInitializationInIf.instructions +++ b/compiler/testData/cfg-variables/bugs/varInitializationInIf.instructions @@ -15,9 +15,9 @@ L0: 2 mark({ val b: Boolean if (1 < 2) { b = false } else { b = true } use(b) }) v(val b: Boolean) INIT: in: {} out: {b=D} mark(if (1 < 2) { b = false } else { b = true }) INIT: in: {b=D} out: {b=D} - mark(1 < 2) r(1) -> r(2) -> + mark(1 < 2) call(<, compareTo|, ) -> jf(L2|) 3 mark({ b = false }) @@ -29,10 +29,10 @@ L2: r(true) -> USE: in: {b=WRITTEN_AFTER_READ} out: {b=WRITTEN_AFTER_READ} w(b|) INIT: in: {b=D} out: {b=ID} USE: in: {b=READ} out: {b=WRITTEN_AFTER_READ} L3: - 2 mark(use(b)) INIT: in: {b=ID} out: {b=ID} - error(use, No resolved call) USE: in: {b=READ} out: {b=READ} + 2 error(use, No resolved call) INIT: in: {b=ID} out: {b=ID} USE: in: {b=READ} out: {b=READ} r(b) -> USE: in: {} out: {b=READ} error(use, No resolved call) + mark(use(b)) magic(use(b)|) -> L1: 1 INIT: in: {} out: {} diff --git a/compiler/testData/cfg-variables/bugs/varInitializationInIfInCycle.instructions b/compiler/testData/cfg-variables/bugs/varInitializationInIfInCycle.instructions index aaa804160de..6c56fdbdd94 100644 --- a/compiler/testData/cfg-variables/bugs/varInitializationInIfInCycle.instructions +++ b/compiler/testData/cfg-variables/bugs/varInitializationInIfInCycle.instructions @@ -18,22 +18,22 @@ L0: v(numbers: Collection) INIT: in: {} out: {numbers=D} magic(numbers: Collection) -> INIT: in: {numbers=D} out: {numbers=D} w(numbers|) INIT: in: {numbers=D} out: {numbers=ID} - 2 mark({ for (i in numbers) { val b: Boolean if (1 < 2) { b = false } else { b = true } use(b) continue } }) INIT: in: {numbers=ID} out: {numbers=ID} - 3 mark(for (i in numbers) { val b: Boolean if (1 < 2) { b = false } else { b = true } use(b) continue }) USE: in: {numbers=READ} out: {numbers=READ} - r(numbers) -> USE: in: {} out: {numbers=READ} + 2 mark({ for (i in numbers) { val b: Boolean if (1 < 2) { b = false } else { b = true } use(b) continue } }) INIT: in: {numbers=ID} out: {numbers=ID} USE: in: {numbers=READ} out: {numbers=READ} + 3 r(numbers) -> USE: in: {} out: {numbers=READ} v(i) INIT: in: {numbers=ID} out: {i=D, numbers=ID} L3: jmp?(L2) INIT: in: {i=D, numbers=ID} out: {i=D, numbers=ID} L4 [loop entry point]: L5 [body entry point]: magic(numbers|) -> - w(i|) INIT: in: {i=D, numbers=ID} out: {i=ID, numbers=ID} USE: in: {} out: {} - 4 mark({ val b: Boolean if (1 < 2) { b = false } else { b = true } use(b) continue }) INIT: in: {i=ID, numbers=ID} out: {i=ID, numbers=ID} + w(i|) INIT: in: {i=D, numbers=ID} out: {i=ID, numbers=ID} + mark(for (i in numbers) { val b: Boolean if (1 < 2) { b = false } else { b = true } use(b) continue }) INIT: in: {i=ID, numbers=ID} out: {i=ID, numbers=ID} USE: in: {} out: {} + 4 mark({ val b: Boolean if (1 < 2) { b = false } else { b = true } use(b) continue }) v(val b: Boolean) INIT: in: {i=ID, numbers=ID} out: {b=D, i=ID, numbers=ID} mark(if (1 < 2) { b = false } else { b = true }) INIT: in: {b=D, i=ID, numbers=ID} out: {b=D, i=ID, numbers=ID} - mark(1 < 2) r(1) -> r(2) -> + mark(1 < 2) call(<, compareTo|, ) -> jf(L6|) 5 mark({ b = false }) @@ -45,8 +45,8 @@ L6: r(true) -> USE: in: {b=WRITTEN_AFTER_READ} out: {b=WRITTEN_AFTER_READ} w(b|) INIT: in: {b=D, i=ID, numbers=ID} out: {b=ID, i=ID, numbers=ID} USE: in: {b=READ} out: {b=WRITTEN_AFTER_READ} L7: - 4 mark(use(b)) INIT: in: {b=ID, i=ID, numbers=ID} out: {b=ID, i=ID, numbers=ID} USE: in: {b=READ} out: {b=READ} - r(b) -> USE: in: {} out: {b=READ} + 4 r(b) -> INIT: in: {b=ID, i=ID, numbers=ID} out: {b=ID, i=ID, numbers=ID} USE: in: {} out: {b=READ} + mark(use(b)) call(use, use|) -> jmp(L4 [loop entry point]) USE: in: {} out: {} - 3 jmp?(L4 [loop entry point]) diff --git a/compiler/testData/cfg-variables/lexicalScopes/doWhileScope.instructions b/compiler/testData/cfg-variables/lexicalScopes/doWhileScope.instructions index 7708be03b46..4825042e39c 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/doWhileScope.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/doWhileScope.instructions @@ -20,9 +20,9 @@ L4 [body entry point]: r(2) -> w(a|) L5 [condition entry point]: - mark(a > 0) r(a) -> r(0) -> + mark(a > 0) call(>, compareTo|, ) -> jt(L2 [loop entry point]|) USE: in: {a=READ} out: {a=READ} L3 [loop exit point]: diff --git a/compiler/testData/cfg-variables/lexicalScopes/forScope.instructions b/compiler/testData/cfg-variables/lexicalScopes/forScope.instructions index c9152b6723d..a061ddc9d89 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/forScope.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/forScope.instructions @@ -12,10 +12,9 @@ L0: 2 mark({ "before" for (i in 1..10) { val a = i } "after" }) mark("before") r("before") -> USE: in: {} out: {} - 3 mark(for (i in 1..10) { val a = i }) - mark(1..10) - r(1) -> + 3 r(1) -> r(10) -> + mark(1..10) call(.., rangeTo|, ) -> v(i) INIT: in: {} out: {i=D} L3: @@ -24,7 +23,8 @@ L4 [loop entry point]: L5 [body entry point]: magic(1..10|) -> w(i|) INIT: in: {i=D} out: {i=ID} - 4 mark({ val a = i }) INIT: in: {i=ID} out: {i=ID} + mark(for (i in 1..10) { val a = i }) INIT: in: {i=ID} out: {i=ID} + 4 mark({ val a = i }) v(val a = i) INIT: in: {i=ID} out: {a=D, i=ID} r(i) -> INIT: in: {a=D, i=ID} out: {a=D, i=ID} w(a|) INIT: in: {a=D, i=ID} out: {a=ID, i=ID} diff --git a/compiler/testData/cfg-variables/lexicalScopes/functionLiteralScope.instructions b/compiler/testData/cfg-variables/lexicalScopes/functionLiteralScope.instructions index a9f72bf6857..ad9463aaccc 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/functionLiteralScope.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/functionLiteralScope.instructions @@ -43,10 +43,10 @@ L3: magic(x: Int) -> INIT: in: {x=D} out: {x=D} w(x|) INIT: in: {x=D} out: {x=ID} 4 mark(val a = x + b) INIT: in: {x=ID} out: {x=ID} - v(val a = x + b) INIT: in: {x=ID} out: {a=D, x=ID} - mark(x + b) INIT: in: {a=D, x=ID} out: {a=D, x=ID} USE: in: {b=READ, x=READ} out: {b=READ, x=READ} - r(x) -> USE: in: {b=READ} out: {b=READ, x=READ} + v(val a = x + b) INIT: in: {x=ID} out: {a=D, x=ID} USE: in: {b=READ, x=READ} out: {b=READ, x=READ} + r(x) -> INIT: in: {a=D, x=ID} out: {a=D, x=ID} USE: in: {b=READ} out: {b=READ, x=READ} r(b) -> USE: in: {} out: {b=READ} + mark(x + b) call(+, plus|, ) -> w(a|) INIT: in: {a=D, x=ID} out: {a=ID, x=ID} L4: diff --git a/compiler/testData/cfg-variables/lexicalScopes/localFunctionScope.instructions b/compiler/testData/cfg-variables/lexicalScopes/localFunctionScope.instructions index fec9e2c51c1..e92d11ab224 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/localFunctionScope.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/localFunctionScope.instructions @@ -39,10 +39,10 @@ L3: magic(x: Int) -> INIT: in: {x=D} out: {x=D} w(x|) INIT: in: {x=D} out: {x=ID} 4 mark({ val a = x + b }) INIT: in: {x=ID} out: {x=ID} - v(val a = x + b) INIT: in: {x=ID} out: {a=D, x=ID} - mark(x + b) INIT: in: {a=D, x=ID} out: {a=D, x=ID} USE: in: {b=READ, x=READ} out: {b=READ, x=READ} - r(x) -> USE: in: {b=READ} out: {b=READ, x=READ} + v(val a = x + b) INIT: in: {x=ID} out: {a=D, x=ID} USE: in: {b=READ, x=READ} out: {b=READ, x=READ} + r(x) -> INIT: in: {a=D, x=ID} out: {a=D, x=ID} USE: in: {b=READ} out: {b=READ, x=READ} r(b) -> USE: in: {} out: {b=READ} + mark(x + b) call(+, plus|, ) -> w(a|) INIT: in: {a=D, x=ID} out: {a=ID, x=ID} L4: diff --git a/compiler/testData/cfg-variables/lexicalScopes/localFunctionScopeWithoutBody.instructions b/compiler/testData/cfg-variables/lexicalScopes/localFunctionScopeWithoutBody.instructions index 38ee650f5a1..6053403f52c 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/localFunctionScopeWithoutBody.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/localFunctionScopeWithoutBody.instructions @@ -33,10 +33,10 @@ L3: 3 INIT: in: {} out: {} v(x: Int) INIT: in: {} out: {x=D} magic(x: Int) -> INIT: in: {x=D} out: {x=D} - w(x|) INIT: in: {x=D} out: {x=ID} - mark(x + b) INIT: in: {x=ID} out: {x=ID} USE: in: {b=READ, x=READ} out: {b=READ, x=READ} - r(x) -> USE: in: {b=READ} out: {b=READ, x=READ} + w(x|) INIT: in: {x=D} out: {x=ID} USE: in: {b=READ, x=READ} out: {b=READ, x=READ} + r(x) -> INIT: in: {x=ID} out: {x=ID} USE: in: {b=READ} out: {b=READ, x=READ} r(b) -> USE: in: {} out: {b=READ} + mark(x + b) call(+, plus|, ) -> L4: diff --git a/compiler/testData/cfg-variables/lexicalScopes/whileScope.instructions b/compiler/testData/cfg-variables/lexicalScopes/whileScope.instructions index 50d2a76ed4b..2dec72a8ad3 100644 --- a/compiler/testData/cfg-variables/lexicalScopes/whileScope.instructions +++ b/compiler/testData/cfg-variables/lexicalScopes/whileScope.instructions @@ -12,10 +12,10 @@ L0: 2 mark({ "before" while (true) { val a: Int } "after" }) mark("before") r("before") -> - mark(while (true) { val a: Int }) L2 [loop entry point]: L5 [condition entry point]: r(true) -> + mark(while (true) { val a: Int }) L4 [body entry point]: 3 mark({ val a: Int }) v(val a: Int) INIT: in: {} out: {a=D} diff --git a/compiler/testData/cfg/arrays/ArrayAccess.instructions b/compiler/testData/cfg/arrays/ArrayAccess.instructions index 67a47d4ca48..0e7994e6ff5 100644 --- a/compiler/testData/cfg/arrays/ArrayAccess.instructions +++ b/compiler/testData/cfg/arrays/ArrayAccess.instructions @@ -26,14 +26,16 @@ L0: mark(a[10]) r(a) -> r(10) -> + mark(a[10]) call(a[10], get|, ) -> r(100) -> - mark(a[10] += 1) mark(a[10]) r(a) -> r(10) -> + mark(a[10]) call(a[10], get|, ) -> r(1) -> + mark(a[10] += 1) call(+=, plus|, ) -> r(a) -> r(10) -> diff --git a/compiler/testData/cfg/arrays/ArrayOfFunctions.instructions b/compiler/testData/cfg/arrays/ArrayOfFunctions.instructions index 4b5c97d2f60..94932e91ba4 100644 --- a/compiler/testData/cfg/arrays/ArrayOfFunctions.instructions +++ b/compiler/testData/cfg/arrays/ArrayOfFunctions.instructions @@ -9,12 +9,13 @@ L0: magic(array: Array<(Int)->Unit>) -> w(array|) 2 mark({ array[11](3) }) - mark(array[11](3)) mark(array[11]) r(array) -> r(11) -> + mark(array[11]) call(array[11], get|, ) -> r(3) -> + mark(array[11](3)) call(array[11], invoke|, ) -> L1: 1 NEXT:[] diff --git a/compiler/testData/cfg/arrays/arrayAccessExpression.instructions b/compiler/testData/cfg/arrays/arrayAccessExpression.instructions index 6ac16f85361..31b610d5143 100644 --- a/compiler/testData/cfg/arrays/arrayAccessExpression.instructions +++ b/compiler/testData/cfg/arrays/arrayAccessExpression.instructions @@ -37,10 +37,11 @@ L0: 2 mark({ ab.getArray()[1] }) mark(ab.getArray()[1]) mark(ab.getArray()) - mark(getArray()) r(ab) -> + mark(getArray()) call(getArray, getArray|) -> r(1) -> + mark(ab.getArray()[1]) call(ab.getArray()[1], get|, ) -> L1: 1 NEXT:[] diff --git a/compiler/testData/cfg/arrays/arrayInc.instructions b/compiler/testData/cfg/arrays/arrayInc.instructions index 05096066b52..5916a920d52 100644 --- a/compiler/testData/cfg/arrays/arrayInc.instructions +++ b/compiler/testData/cfg/arrays/arrayInc.instructions @@ -9,11 +9,12 @@ L0: magic(a: Array) -> w(a|) 2 mark({ a[0]++ }) - mark(a[0]++) mark(a[0]) r(a) -> r(0) -> + mark(a[0]) call(a[0], get|, ) -> + mark(a[0]++) call(++, inc|) -> r(a) -> r(0) -> diff --git a/compiler/testData/cfg/arrays/arraySetPlusAssign.instructions b/compiler/testData/cfg/arrays/arraySetPlusAssign.instructions index e5629e1ca6a..4c01b6ae3ed 100644 --- a/compiler/testData/cfg/arrays/arraySetPlusAssign.instructions +++ b/compiler/testData/cfg/arrays/arraySetPlusAssign.instructions @@ -9,12 +9,13 @@ L0: magic(a: Array) -> w(a|) 2 mark({ a[0] += 1 }) - mark(a[0] += 1) mark(a[0]) r(a) -> r(0) -> + mark(a[0]) call(a[0], get|, ) -> r(1) -> + mark(a[0] += 1) call(+=, plus|, ) -> r(a) -> r(0) -> diff --git a/compiler/testData/cfg/basic/Basic.instructions b/compiler/testData/cfg/basic/Basic.instructions index 1283ba8fa66..6962e4a033a 100644 --- a/compiler/testData/cfg/basic/Basic.instructions +++ b/compiler/testData/cfg/basic/Basic.instructions @@ -26,34 +26,34 @@ L0: r(1) -> r(a) -> mark(2.toLong()) - mark(toLong()) r(2) -> + mark(toLong()) call(toLong, toLong|) -> - mark(foo(a, 3)) r(a) -> r(3) -> + mark(foo(a, 3)) call(foo, foo|, ) -> mark(genfun()) call(genfun, genfun) -> - mark(flfun {1}) mark({1}) jmp?(L2) NEXT:[r({1}) -> , d({1})] d({1}) NEXT:[] L2: r({1}) -> PREV:[jmp?(L2)] + mark(flfun {1}) call(flfun, flfun|) -> mark(3.equals(4)) - mark(equals(4)) r(3) -> r(4) -> + mark(equals(4)) call(equals, equals|, ) -> - mark(3 equals 4) r(3) -> r(4) -> + mark(3 equals 4) call(equals, equals|, ) -> - mark(1 + 2) r(1) -> r(2) -> + mark(1 + 2) call(+, plus|, ) -> r(a) -> jf(L5|) NEXT:[magic(a && true|, ) -> , r(true) -> ] diff --git a/compiler/testData/cfg/bugs/jumpToOuterScope.instructions b/compiler/testData/cfg/bugs/jumpToOuterScope.instructions index b8644228f64..018c604f721 100644 --- a/compiler/testData/cfg/bugs/jumpToOuterScope.instructions +++ b/compiler/testData/cfg/bugs/jumpToOuterScope.instructions @@ -13,8 +13,7 @@ L0: magic(c: Collection) -> w(c|) 2 mark({ for (e in c) { { break } } }) - 3 mark(for (e in c) { { break } }) - r(c) -> + 3 r(c) -> v(e) L3: jmp?(L2) NEXT:[read (Unit), magic(c|) -> ] @@ -22,6 +21,7 @@ L4 [loop entry point]: L5 [body entry point]: magic(c|) -> PREV:[jmp?(L2), jmp?(L4 [loop entry point])] w(e|) + mark(for (e in c) { { break } }) 4 mark({ { break } }) mark({ break }) jmp?(L6) NEXT:[r({ break }) -> , d({ break })] diff --git a/compiler/testData/cfg/controlStructures/Finally.instructions b/compiler/testData/cfg/controlStructures/Finally.instructions index 05e80d05c0e..07f32055e00 100644 --- a/compiler/testData/cfg/controlStructures/Finally.instructions +++ b/compiler/testData/cfg/controlStructures/Finally.instructions @@ -51,9 +51,9 @@ L0: 3 mark({ 1 if (2 > 3) { return } }) r(1) -> mark(if (2 > 3) { return }) - mark(2 > 3) r(2) -> r(3) -> + mark(2 > 3) call(>, compareTo|, ) -> jf(L3|) NEXT:[read (Unit), mark({ return })] 4 mark({ return }) @@ -136,9 +136,9 @@ L4: 4 5 mark(if (2 > 3) { return@l }) mark(if (2 > 3) { return@l }) - mark(2 > 3) r(2) -> r(3) -> + mark(2 > 3) call(>, compareTo|, ) -> jf(L6|) NEXT:[read (Unit), mark({ return@l })] 6 mark({ return@l }) @@ -204,9 +204,9 @@ L3: 5 mark({ 1 if (2 > 3) { return@l } }) r(1) -> mark(if (2 > 3) { return@l }) - mark(2 > 3) r(2) -> r(3) -> + mark(2 > 3) call(>, compareTo|, ) -> jf(L6|) NEXT:[read (Unit), mark({ return@l })] 6 mark({ return@l }) @@ -252,10 +252,10 @@ L0: 1 2 mark({ @l while(true) { try { 1 if (2 > 3) { break @l } } finally { 2 } } }) mark(@l while(true) { try { 1 if (2 > 3) { break @l } } finally { 2 } }) - mark(while(true) { try { 1 if (2 > 3) { break @l } } finally { 2 } }) L2 [loop entry point]: L5 [condition entry point]: - r(true) -> PREV:[mark(while(true) { try { 1 if (2 > 3) { break @l } } finally { 2 } }), jmp(L2 [loop entry point])] + r(true) -> PREV:[mark(@l while(true) { try { 1 if (2 > 3) { break @l } } finally { 2 } }), jmp(L2 [loop entry point])] + mark(while(true) { try { 1 if (2 > 3) { break @l } } finally { 2 } }) L4 [body entry point]: 3 mark({ try { 1 if (2 > 3) { break @l } } finally { 2 } }) mark(try { 1 if (2 > 3) { break @l } } finally { 2 }) @@ -263,9 +263,9 @@ L4 [body entry point]: 4 mark({ 1 if (2 > 3) { break @l } }) r(1) -> mark(if (2 > 3) { break @l }) - mark(2 > 3) r(2) -> r(3) -> + mark(2 > 3) call(>, compareTo|, ) -> jf(L7|) NEXT:[read (Unit), mark({ break @l })] 5 mark({ break @l }) @@ -318,17 +318,17 @@ L0: jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ @l while(true) { 1 if (2 > 3) { break @l } } 5 })] 3 mark({ @l while(true) { 1 if (2 > 3) { break @l } } 5 }) mark(@l while(true) { 1 if (2 > 3) { break @l } }) - mark(while(true) { 1 if (2 > 3) { break @l } }) L3 [loop entry point]: L6 [condition entry point]: - r(true) -> PREV:[mark(while(true) { 1 if (2 > 3) { break @l } }), jmp(L3 [loop entry point])] + r(true) -> PREV:[mark(@l while(true) { 1 if (2 > 3) { break @l } }), jmp(L3 [loop entry point])] + mark(while(true) { 1 if (2 > 3) { break @l } }) L5 [body entry point]: 4 mark({ 1 if (2 > 3) { break @l } }) r(1) -> mark(if (2 > 3) { break @l }) - mark(2 > 3) r(2) -> r(3) -> + mark(2 > 3) call(>, compareTo|, ) -> jf(L7|) NEXT:[read (Unit), mark({ break @l })] 5 mark({ break @l }) @@ -379,17 +379,17 @@ L0: jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ @l while(true) { 1 if (2 > 3) { break @l } } })] 3 mark({ @l while(true) { 1 if (2 > 3) { break @l } } }) mark(@l while(true) { 1 if (2 > 3) { break @l } }) - mark(while(true) { 1 if (2 > 3) { break @l } }) L3 [loop entry point]: L6 [condition entry point]: - r(true) -> PREV:[mark(while(true) { 1 if (2 > 3) { break @l } }), jmp(L3 [loop entry point])] + r(true) -> PREV:[mark(@l while(true) { 1 if (2 > 3) { break @l } }), jmp(L3 [loop entry point])] + mark(while(true) { 1 if (2 > 3) { break @l } }) L5 [body entry point]: 4 mark({ 1 if (2 > 3) { break @l } }) r(1) -> mark(if (2 > 3) { break @l }) - mark(2 > 3) r(2) -> r(3) -> + mark(2 > 3) call(>, compareTo|, ) -> jf(L7|) NEXT:[read (Unit), mark({ break @l })] 5 mark({ break @l }) @@ -439,10 +439,9 @@ L0: w(a|) 2 mark({ @l for (i in 1..a) { try { 1 if (2 > 3) { continue @l } } finally { 2 } } }) mark(@l for (i in 1..a) { try { 1 if (2 > 3) { continue @l } } finally { 2 } }) - 3 mark(for (i in 1..a) { try { 1 if (2 > 3) { continue @l } } finally { 2 } }) - mark(1..a) - r(1) -> + 3 r(1) -> r(a) -> + mark(1..a) call(.., rangeTo|, ) -> v(i) L3: @@ -451,15 +450,16 @@ L4 [loop entry point]: L5 [body entry point]: magic(1..a|) -> PREV:[jmp?(L2), jmp(L4 [loop entry point]), jmp?(L4 [loop entry point])] w(i|) + mark(for (i in 1..a) { try { 1 if (2 > 3) { continue @l } } finally { 2 } }) 4 mark({ try { 1 if (2 > 3) { continue @l } } finally { 2 } }) mark(try { 1 if (2 > 3) { continue @l } } finally { 2 }) jmp?(L6 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ 1 if (2 > 3) { continue @l } })] 5 mark({ 1 if (2 > 3) { continue @l } }) r(1) -> mark(if (2 > 3) { continue @l }) - mark(2 > 3) r(2) -> r(3) -> + mark(2 > 3) call(>, compareTo|, ) -> jf(L7|) NEXT:[read (Unit), mark({ continue @l })] 6 mark({ continue @l }) @@ -515,10 +515,9 @@ L0: jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 })] 3 mark({ @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 }) mark(@l for (i in 1..a) { 1 if (2 > 3) { continue @l } }) - 4 mark(for (i in 1..a) { 1 if (2 > 3) { continue @l } }) - mark(1..a) - r(1) -> + 4 r(1) -> r(a) -> + mark(1..a) call(.., rangeTo|, ) -> v(i) L4: @@ -527,12 +526,13 @@ L5 [loop entry point]: L6 [body entry point]: magic(1..a|) -> PREV:[jmp?(L3), jmp(L5 [loop entry point]), jmp?(L5 [loop entry point])] w(i|) + mark(for (i in 1..a) { 1 if (2 > 3) { continue @l } }) 5 mark({ 1 if (2 > 3) { continue @l } }) r(1) -> mark(if (2 > 3) { continue @l }) - mark(2 > 3) r(2) -> r(3) -> + mark(2 > 3) call(>, compareTo|, ) -> jf(L7|) NEXT:[read (Unit), mark({ continue @l })] 6 mark({ continue @l }) @@ -586,10 +586,9 @@ L0: jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } })] 3 mark({ @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } }) mark(@l for (i in 1..a) { 1 if (2 > 3) { continue @l } }) - 4 mark(for (i in 1..a) { 1 if (2 > 3) { continue @l } }) - mark(1..a) - r(1) -> + 4 r(1) -> r(a) -> + mark(1..a) call(.., rangeTo|, ) -> v(i) L4: @@ -598,12 +597,13 @@ L5 [loop entry point]: L6 [body entry point]: magic(1..a|) -> PREV:[jmp?(L3), jmp(L5 [loop entry point]), jmp?(L5 [loop entry point])] w(i|) + mark(for (i in 1..a) { 1 if (2 > 3) { continue @l } }) 5 mark({ 1 if (2 > 3) { continue @l } }) r(1) -> mark(if (2 > 3) { continue @l }) - mark(2 > 3) r(2) -> r(3) -> + mark(2 > 3) call(>, compareTo|, ) -> jf(L7|) NEXT:[read (Unit), mark({ continue @l })] 6 mark({ continue @l }) @@ -691,22 +691,22 @@ L0: r(1) -> L3 [start finally]: 4 mark({ doSmth(3) }) - mark(doSmth(3)) r(3) -> + mark(doSmth(3)) call(doSmth, doSmth|) -> L4 [finish finally]: 3 ret(*|) L1 NEXT:[] - 2 jmp(L5 [skipFinallyToErrorBlock]) NEXT:[mark({ doSmth(3) })] PREV:[] L2 [onExceptionToFinallyBlock]: 4 mark({ doSmth(3) }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] - mark(doSmth(3)) r(3) -> + mark(doSmth(3)) call(doSmth, doSmth|) -> 2 jmp(error) NEXT:[] L5 [skipFinallyToErrorBlock]: - 4 mark({ doSmth(3) }) PREV:[] -- mark(doSmth(3)) PREV:[] - r(3) -> PREV:[] +- mark(doSmth(3)) PREV:[] - call(doSmth, doSmth|) -> PREV:[] L1: 1 NEXT:[] PREV:[ret(*|) L1] @@ -738,8 +738,8 @@ L0: r(1) -> L4 [start finally]: 4 mark({ doSmth(3) }) - mark(doSmth(3)) r(3) -> + mark(doSmth(3)) call(doSmth, doSmth|) -> L5 [finish finally]: 3 ret(*|) L1 NEXT:[] @@ -749,22 +749,22 @@ L2 [onException]: magic(e: UnsupportedOperationException) -> w(e|) 4 mark({ doSmth(2) }) - mark(doSmth(2)) r(2) -> + mark(doSmth(2)) call(doSmth, doSmth|) -> 3 jmp(L6 [afterCatches]) L6 [afterCatches]: 2 jmp(L7 [skipFinallyToErrorBlock]) NEXT:[mark({ doSmth(3) })] L3 [onExceptionToFinallyBlock]: 4 mark({ doSmth(3) }) PREV:[jmp?(L3 [onExceptionToFinallyBlock])] - mark(doSmth(3)) r(3) -> + mark(doSmth(3)) call(doSmth, doSmth|) -> 2 jmp(error) NEXT:[] L7 [skipFinallyToErrorBlock]: 4 mark({ doSmth(3) }) PREV:[jmp(L7 [skipFinallyToErrorBlock])] - mark(doSmth(3)) r(3) -> + mark(doSmth(3)) call(doSmth, doSmth|) -> L1: 1 NEXT:[] PREV:[ret(*|) L1, call(doSmth, doSmth|) -> ] @@ -797,8 +797,8 @@ L2 [onException]: magic(e: UnsupportedOperationException) -> w(e|) 4 mark({ doSmth(2) }) - mark(doSmth(2)) r(2) -> + mark(doSmth(2)) call(doSmth, doSmth|) -> 3 jmp(L3 [afterCatches]) L1: @@ -832,8 +832,8 @@ L0: r(1) -> L4 [start finally]: 4 mark({ doSmth(3) }) - mark(doSmth(3)) r(3) -> + mark(doSmth(3)) call(doSmth, doSmth|) -> L5 [finish finally]: 3 ret(*|) L1 NEXT:[] @@ -845,8 +845,8 @@ L2 [onException]: 4 mark({ return 2 }) r(2) -> mark({ doSmth(3) }) - mark(doSmth(3)) r(3) -> + mark(doSmth(3)) call(doSmth, doSmth|) -> ret(*|) L1 NEXT:[] - 3 jmp(L6 [afterCatches]) PREV:[] @@ -854,14 +854,14 @@ L6 [afterCatches]: - 2 jmp(L7 [skipFinallyToErrorBlock]) NEXT:[mark({ doSmth(3) })] PREV:[] L3 [onExceptionToFinallyBlock]: 4 mark({ doSmth(3) }) PREV:[jmp?(L3 [onExceptionToFinallyBlock])] - mark(doSmth(3)) r(3) -> + mark(doSmth(3)) call(doSmth, doSmth|) -> 2 jmp(error) NEXT:[] L7 [skipFinallyToErrorBlock]: - 4 mark({ doSmth(3) }) PREV:[] -- mark(doSmth(3)) PREV:[] - r(3) -> PREV:[] +- mark(doSmth(3)) PREV:[] - call(doSmth, doSmth|) -> PREV:[] L1: 1 NEXT:[] PREV:[ret(*|) L1, ret(*|) L1] @@ -890,8 +890,8 @@ L0: jmp?(L2 [onException]) NEXT:[v(e: UnsupportedOperationException), jmp?(L3 [onExceptionToFinallyBlock])] jmp?(L3 [onExceptionToFinallyBlock]) NEXT:[mark({ doSmth(3) }), mark({ doSmth(1) })] 3 mark({ doSmth(1) }) - mark(doSmth(1)) r(1) -> + mark(doSmth(1)) call(doSmth, doSmth|) -> 2 jmp(L4 [afterCatches]) NEXT:[jmp(L7 [skipFinallyToErrorBlock])] L2 [onException]: @@ -902,8 +902,8 @@ L2 [onException]: r(2) -> L5 [start finally]: 5 mark({ doSmth(3) }) - mark(doSmth(3)) r(3) -> + mark(doSmth(3)) call(doSmth, doSmth|) -> L6 [finish finally]: 4 ret(*|) L1 NEXT:[] @@ -912,14 +912,14 @@ L4 [afterCatches]: 2 jmp(L7 [skipFinallyToErrorBlock]) NEXT:[mark({ doSmth(3) })] PREV:[jmp(L4 [afterCatches])] L3 [onExceptionToFinallyBlock]: 5 mark({ doSmth(3) }) PREV:[jmp?(L3 [onExceptionToFinallyBlock])] - mark(doSmth(3)) r(3) -> + mark(doSmth(3)) call(doSmth, doSmth|) -> 2 jmp(error) NEXT:[] L7 [skipFinallyToErrorBlock]: 5 mark({ doSmth(3) }) PREV:[jmp(L7 [skipFinallyToErrorBlock])] - mark(doSmth(3)) r(3) -> + mark(doSmth(3)) call(doSmth, doSmth|) -> L1: 1 NEXT:[] PREV:[ret(*|) L1, call(doSmth, doSmth|) -> ] diff --git a/compiler/testData/cfg/controlStructures/FinallyTestCopy.instructions b/compiler/testData/cfg/controlStructures/FinallyTestCopy.instructions index 10fc552489d..1fab4a10d8b 100644 --- a/compiler/testData/cfg/controlStructures/FinallyTestCopy.instructions +++ b/compiler/testData/cfg/controlStructures/FinallyTestCopy.instructions @@ -140,11 +140,11 @@ fun testCopy2() { L0: 1 2 mark({ while (cond()) { try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } } }) - mark(while (cond()) { try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } }) L2 [loop entry point]: L5 [condition entry point]: - mark(cond()) PREV:[mark(while (cond()) { try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } }), jmp(L2 [loop entry point]), jmp(L2 [loop entry point])] + mark(cond()) PREV:[mark({ while (cond()) { try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } } }), jmp(L2 [loop entry point]), jmp(L2 [loop entry point])] call(cond, cond) -> + mark(while (cond()) { try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } }) jf(L3 [loop exit point]|) NEXT:[read (Unit), mark({ try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } })] L4 [body entry point]: 3 mark({ try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } }) @@ -256,11 +256,11 @@ L4 [afterCatches]: L3 [onExceptionToFinallyBlock]: L7 [start finally]: 3 mark({ while (cond()); }) PREV:[jmp?(L3 [onExceptionToFinallyBlock])] - mark(while (cond())) L8 [loop entry point]: L11 [condition entry point]: - mark(cond()) PREV:[mark(while (cond())), jmp(L8 [loop entry point])] + mark(cond()) PREV:[mark({ while (cond()); }), jmp(L8 [loop entry point])] call(cond, cond) -> + mark(while (cond())) jf(L9 [loop exit point]|) NEXT:[read (Unit), jmp(L8 [loop entry point])] L10 [body entry point]: jmp(L8 [loop entry point]) NEXT:[mark(cond())] @@ -270,9 +270,9 @@ L12 [finish finally]: 2 jmp(error) NEXT:[] L6 [skipFinallyToErrorBlock]: 3 mark({ while (cond()); }) PREV:[jmp(L6 [skipFinallyToErrorBlock])] - mark(while (cond())) - mark(cond()) PREV:[mark(while (cond())), jmp(copy L8 [loop entry point])] + mark(cond()) PREV:[mark({ while (cond()); }), jmp(copy L8 [loop entry point])] call(cond, cond) -> + mark(while (cond())) jf(copy L9 [loop exit point]|) NEXT:[read (Unit), jmp(copy L8 [loop entry point])] jmp(copy L8 [loop entry point]) NEXT:[mark(cond())] read (Unit) PREV:[jf(copy L9 [loop exit point]|)] @@ -311,9 +311,9 @@ L2 [onExceptionToFinallyBlock]: L4 [start finally]: 3 mark({ if(list != null) { } }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] mark(if(list != null) { }) - mark(list != null) r(list) -> r(null) -> + mark(list != null) call(!=, equals|, ) -> jf(L5|) NEXT:[read (Unit), mark({ })] 4 mark({ }) @@ -327,9 +327,9 @@ L7 [finish finally]: L3 [skipFinallyToErrorBlock]: 3 mark({ if(list != null) { } }) PREV:[jmp(L3 [skipFinallyToErrorBlock])] mark(if(list != null) { }) - mark(list != null) r(list) -> r(null) -> + mark(list != null) call(!=, equals|, ) -> jf(copy L5|) NEXT:[read (Unit), mark({ })] 4 mark({ }) diff --git a/compiler/testData/cfg/controlStructures/For.instructions b/compiler/testData/cfg/controlStructures/For.instructions index 4ef25287833..399d662f15f 100644 --- a/compiler/testData/cfg/controlStructures/For.instructions +++ b/compiler/testData/cfg/controlStructures/For.instructions @@ -8,10 +8,9 @@ fun t1() { L0: 1 2 mark({ for (i in 1..2) { doSmth(i) } }) - 3 mark(for (i in 1..2) { doSmth(i) }) - mark(1..2) - r(1) -> + 3 r(1) -> r(2) -> + mark(1..2) call(.., rangeTo|, ) -> v(i) L3: @@ -20,9 +19,10 @@ L4 [loop entry point]: L5 [body entry point]: magic(1..2|) -> PREV:[jmp?(L2), jmp?(L4 [loop entry point])] w(i|) + mark(for (i in 1..2) { doSmth(i) }) 4 mark({ doSmth(i) }) - mark(doSmth(i)) r(i) -> + mark(doSmth(i)) call(doSmth, doSmth|) -> 3 jmp?(L4 [loop entry point]) NEXT:[magic(1..2|) -> , read (Unit)] L2: diff --git a/compiler/testData/cfg/controlStructures/If.instructions b/compiler/testData/cfg/controlStructures/If.instructions index c99cbe8b258..3393470ce8a 100644 --- a/compiler/testData/cfg/controlStructures/If.instructions +++ b/compiler/testData/cfg/controlStructures/If.instructions @@ -30,12 +30,12 @@ L0: mark("s") r("s") -> w(u|) - 2 jmp(L3) NEXT:[mark(doSmth(u))] + 2 jmp(L3) NEXT:[r(u) -> ] L2: read (Unit) PREV:[jf(L2|)] L3: - mark(doSmth(u)) PREV:[jmp(L3), read (Unit)] - r(u) -> + r(u) -> PREV:[jmp(L3), read (Unit)] + mark(doSmth(u)) call(doSmth, doSmth|) -> v(var r: String) mark(if (b) { r = "s" } else { r = "t" }) @@ -45,15 +45,15 @@ L3: mark("s") r("s") -> w(r|) - 2 jmp(L5) NEXT:[mark(doSmth(r))] + 2 jmp(L5) NEXT:[r(r) -> ] L4: 3 mark({ r = "t" }) PREV:[jf(L4|)] mark("t") r("t") -> w(r|) L5: - 2 mark(doSmth(r)) PREV:[jmp(L5), w(r|)] - r(r) -> + 2 r(r) -> PREV:[jmp(L5), w(r|)] + mark(doSmth(r)) call(doSmth, doSmth|) -> L1: 1 NEXT:[] @@ -88,12 +88,12 @@ L0: jf(L2|) NEXT:[read (Unit), mark({ return; })] 3 mark({ return; }) ret L1 NEXT:[] -- 2 jmp(L3) NEXT:[mark(doSmth(i))] PREV:[] +- 2 jmp(L3) NEXT:[r(i) -> ] PREV:[] L2: read (Unit) PREV:[jf(L2|)] L3: - mark(doSmth(i)) r(i) -> + mark(doSmth(i)) call(doSmth, doSmth|) -> mark(if (i is Int) { return; }) mark(i is Int) diff --git a/compiler/testData/cfg/controlStructures/OnlyWhileInFunctionBody.instructions b/compiler/testData/cfg/controlStructures/OnlyWhileInFunctionBody.instructions index 9d727a8c2f8..452cda3860e 100644 --- a/compiler/testData/cfg/controlStructures/OnlyWhileInFunctionBody.instructions +++ b/compiler/testData/cfg/controlStructures/OnlyWhileInFunctionBody.instructions @@ -8,18 +8,18 @@ fun main() { L0: 1 2 mark({ while(0 > 1) { 2 } }) - mark(while(0 > 1) { 2 }) L2 [loop entry point]: L5 [condition entry point]: - mark(0 > 1) PREV:[mark(while(0 > 1) { 2 }), jmp(L2 [loop entry point])] - r(0) -> + r(0) -> PREV:[mark({ while(0 > 1) { 2 } }), jmp(L2 [loop entry point])] r(1) -> + mark(0 > 1) call(>, compareTo|, ) -> + mark(while(0 > 1) { 2 }) jf(L3 [loop exit point]|) NEXT:[read (Unit), mark({ 2 })] L4 [body entry point]: 3 mark({ 2 }) r(2) -> - 2 jmp(L2 [loop entry point]) NEXT:[mark(0 > 1)] + 2 jmp(L2 [loop entry point]) NEXT:[r(0) -> ] L3 [loop exit point]: read (Unit) PREV:[jf(L3 [loop exit point]|)] L1: @@ -44,9 +44,9 @@ L4 [body entry point]: mark({return}) ret L1 NEXT:[] L5 [condition entry point]: -- mark(0 > 1) PREV:[] - r(0) -> PREV:[] - r(1) -> PREV:[] +- mark(0 > 1) PREV:[] - call(>, compareTo|, ) -> PREV:[] - jt(L2 [loop entry point]|) NEXT:[read (Unit), mark({return})] PREV:[] L3 [loop exit point]: diff --git a/compiler/testData/cfg/conventions/equals.instructions b/compiler/testData/cfg/conventions/equals.instructions index 5151be2fd13..d8431a598c6 100644 --- a/compiler/testData/cfg/conventions/equals.instructions +++ b/compiler/testData/cfg/conventions/equals.instructions @@ -14,9 +14,9 @@ L0: w(b|) 2 mark({ if (a == b) { } }) mark(if (a == b) { }) - mark(a == b) r(a) -> r(b) -> + mark(a == b) call(==, equals|, ) -> jf(L2|) NEXT:[read (Unit), mark({ })] 3 mark({ }) diff --git a/compiler/testData/cfg/conventions/incrementAtTheEnd.instructions b/compiler/testData/cfg/conventions/incrementAtTheEnd.instructions index 7ea1808d900..030decbcc89 100644 --- a/compiler/testData/cfg/conventions/incrementAtTheEnd.instructions +++ b/compiler/testData/cfg/conventions/incrementAtTheEnd.instructions @@ -10,8 +10,8 @@ L0: v(var i = 1) r(1) -> w(i|) - mark(i++) r(i) -> + mark(i++) call(++, inc|) -> w(i|) L1: diff --git a/compiler/testData/cfg/conventions/invoke.instructions b/compiler/testData/cfg/conventions/invoke.instructions index cababa1643f..9c282e0116d 100644 --- a/compiler/testData/cfg/conventions/invoke.instructions +++ b/compiler/testData/cfg/conventions/invoke.instructions @@ -9,8 +9,8 @@ L0: magic(f: () -> Unit) -> w(f|) 2 mark({ f() }) - mark(f()) r(f) -> + mark(f()) call(f, invoke|) -> L1: 1 NEXT:[] diff --git a/compiler/testData/cfg/conventions/notEqual.instructions b/compiler/testData/cfg/conventions/notEqual.instructions index 83685976b4b..98d8a17ae84 100644 --- a/compiler/testData/cfg/conventions/notEqual.instructions +++ b/compiler/testData/cfg/conventions/notEqual.instructions @@ -13,9 +13,9 @@ L0: w(b|) 2 mark({ if (a != b) {} }) mark(if (a != b) {}) - mark(a != b) r(a) -> r(b) -> + mark(a != b) call(!=, equals|, ) -> jf(L2|) NEXT:[read (Unit), mark({})] 3 mark({}) diff --git a/compiler/testData/cfg/deadCode/returnInElvis.instructions b/compiler/testData/cfg/deadCode/returnInElvis.instructions index dc75bf6ae3f..a8837e2cd21 100644 --- a/compiler/testData/cfg/deadCode/returnInElvis.instructions +++ b/compiler/testData/cfg/deadCode/returnInElvis.instructions @@ -7,6 +7,7 @@ L0: 1 2 mark({ return ?: null }) ret L1 NEXT:[] +- mark(return ?: null) PREV:[] - jt(L2) NEXT:[r(null) -> , ] PREV:[] - r(null) -> PREV:[] L1: diff --git a/compiler/testData/cfg/declarations/local/ObjectExpression.instructions b/compiler/testData/cfg/declarations/local/ObjectExpression.instructions index 806b47a8c84..11cf0c848e9 100644 --- a/compiler/testData/cfg/declarations/local/ObjectExpression.instructions +++ b/compiler/testData/cfg/declarations/local/ObjectExpression.instructions @@ -70,8 +70,8 @@ L0: r(object : A by b {}) -> w(o|) mark(o.foo()) - mark(foo()) r(o) -> + mark(foo()) call(foo, foo|) -> ret(*|) L1 L1: diff --git a/compiler/testData/cfg/declarations/properties/backingFieldQualifiedWithThis.instructions b/compiler/testData/cfg/declarations/properties/backingFieldQualifiedWithThis.instructions index 7f0b2a4f09d..2f8dbad732c 100644 --- a/compiler/testData/cfg/declarations/properties/backingFieldQualifiedWithThis.instructions +++ b/compiler/testData/cfg/declarations/properties/backingFieldQualifiedWithThis.instructions @@ -19,12 +19,12 @@ fun foo() = "foo" + this.$bar --------------------- L0: 1 - mark("foo" + this.$bar) mark("foo") r("foo") -> mark(this.$bar) r(this) -> r($bar|) -> + mark("foo" + this.$bar) call(+, plus|, ) -> L1: NEXT:[] diff --git a/compiler/testData/cfg/expressions/Assignments.instructions b/compiler/testData/cfg/expressions/Assignments.instructions index f2c24747477..a9368b3d1f3 100644 --- a/compiler/testData/cfg/expressions/Assignments.instructions +++ b/compiler/testData/cfg/expressions/Assignments.instructions @@ -37,9 +37,9 @@ L0: w(x|) r(2) -> w(x|) - mark(x += 2) r(x) -> r(2) -> + mark(x += 2) call(+=, plus|, ) -> w(x|) mark(if (true) 1 else 2) @@ -73,11 +73,11 @@ L5: r(t) -> r(1) -> w(t.x|, ) - mark(t.x += 1) mark(t.x) r(t) -> r(x|) -> r(1) -> + mark(t.x += 1) call(+=, plus|, ) -> r(t) -> w(t.x|, ) diff --git a/compiler/testData/cfg/expressions/chainedQualifiedExpression.instructions b/compiler/testData/cfg/expressions/chainedQualifiedExpression.instructions index dd79aa7acbc..427a9c29ff2 100644 --- a/compiler/testData/cfg/expressions/chainedQualifiedExpression.instructions +++ b/compiler/testData/cfg/expressions/chainedQualifiedExpression.instructions @@ -65,158 +65,158 @@ L0: r(1.0) -> w(inTopLevel|) mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(IMPORT_KEYWORD, inTopLevel) .add(PACKAGE_KEYWORD, inTopLevel) .add(OVERRIDE_KEYWORD, inTopLevel) .add(IN_KEYWORD, inTopLevel, inTopLevel) .add(OUT_KEYWORD, inTopLevel) .add(OBJECT_KEYWORD, unresolvedCode) .registerAll()) - mark(registerAll()) mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(IMPORT_KEYWORD, inTopLevel) .add(PACKAGE_KEYWORD, inTopLevel) .add(OVERRIDE_KEYWORD, inTopLevel) .add(IN_KEYWORD, inTopLevel, inTopLevel) .add(OUT_KEYWORD, inTopLevel) .add(OBJECT_KEYWORD, unresolvedCode)) - mark(add(OBJECT_KEYWORD, unresolvedCode)) mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(IMPORT_KEYWORD, inTopLevel) .add(PACKAGE_KEYWORD, inTopLevel) .add(OVERRIDE_KEYWORD, inTopLevel) .add(IN_KEYWORD, inTopLevel, inTopLevel) .add(OUT_KEYWORD, inTopLevel)) - mark(add(OUT_KEYWORD, inTopLevel)) mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(IMPORT_KEYWORD, inTopLevel) .add(PACKAGE_KEYWORD, inTopLevel) .add(OVERRIDE_KEYWORD, inTopLevel) .add(IN_KEYWORD, inTopLevel, inTopLevel)) - mark(add(IN_KEYWORD, inTopLevel, inTopLevel)) mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(IMPORT_KEYWORD, inTopLevel) .add(PACKAGE_KEYWORD, inTopLevel) .add(OVERRIDE_KEYWORD, inTopLevel)) - mark(add(OVERRIDE_KEYWORD, inTopLevel)) mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(IMPORT_KEYWORD, inTopLevel) .add(PACKAGE_KEYWORD, inTopLevel)) - mark(add(PACKAGE_KEYWORD, inTopLevel)) mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(IMPORT_KEYWORD, inTopLevel)) - mark(add(IMPORT_KEYWORD, inTopLevel)) mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) - mark(add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) - mark(add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) - mark(add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) - mark(add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) - mark(add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) - mark(add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) - mark(add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) - mark(add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) - mark(add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel)) - mark(add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel)) mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel)) - mark(add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel)) mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel) .add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel)) - mark(add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel)) mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel)) - mark(add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel)) mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) - mark(add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel) .add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) - mark(add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) mark(BunchKeywordRegister() .add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) - mark(add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) - mark(BunchKeywordRegister()) magic(BunchKeywordRegister()) -> + mark(BunchKeywordRegister()) call(BunchKeywordRegister, |) -> r(ABSTRACT_KEYWORD) -> r(inTopLevel) -> r(inTopLevel) -> r(inTopLevel) -> + mark(add(ABSTRACT_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) call(add, add|, , , , ) -> r(FINAL_KEYWORD) -> r(inTopLevel) -> r(inTopLevel) -> r(inTopLevel) -> + mark(add(FINAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) call(add, add|, , , , ) -> r(OPEN_KEYWORD) -> r(inTopLevel) -> r(inTopLevel) -> r(inTopLevel) -> + mark(add(OPEN_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) call(add, add|, , , , ) -> r(INTERNAL_KEYWORD) -> r(inTopLevel) -> r(inTopLevel) -> r(inTopLevel) -> r(inTopLevel) -> + mark(add(INTERNAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel)) call(add, add|, , , , , ) -> r(PRIVATE_KEYWORD) -> r(inTopLevel) -> r(inTopLevel) -> r(inTopLevel) -> r(inTopLevel) -> + mark(add(PRIVATE_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel)) call(add, add|, , , , , ) -> r(PROTECTED_KEYWORD) -> r(inTopLevel) -> r(inTopLevel) -> r(inTopLevel) -> r(inTopLevel) -> + mark(add(PROTECTED_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel)) call(add, add|, , , , , ) -> r(PUBLIC_KEYWORD) -> r(inTopLevel) -> r(inTopLevel) -> r(inTopLevel) -> r(inTopLevel) -> + mark(add(PUBLIC_KEYWORD, inTopLevel, inTopLevel, inTopLevel, inTopLevel)) call(add, add|, , , , , ) -> r(CLASS_KEYWORD) -> r(inTopLevel) -> r(inTopLevel) -> r(inTopLevel) -> + mark(add(CLASS_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) call(add, add|, , , , ) -> r(ENUM_KEYWORD) -> r(inTopLevel) -> r(inTopLevel) -> r(inTopLevel) -> + mark(add(ENUM_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) call(add, add|, , , , ) -> r(FUN_KEYWORD) -> r(inTopLevel) -> r(inTopLevel) -> r(inTopLevel) -> + mark(add(FUN_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) call(add, add|, , , , ) -> r(GET_KEYWORD) -> r(inTopLevel) -> r(inTopLevel) -> r(inTopLevel) -> + mark(add(GET_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) call(add, add|, , , , ) -> r(SET_KEYWORD) -> r(inTopLevel) -> r(inTopLevel) -> r(inTopLevel) -> + mark(add(SET_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) call(add, add|, , , , ) -> r(TRAIT_KEYWORD) -> r(inTopLevel) -> r(inTopLevel) -> r(inTopLevel) -> + mark(add(TRAIT_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) call(add, add|, , , , ) -> r(VAL_KEYWORD) -> r(inTopLevel) -> r(inTopLevel) -> r(inTopLevel) -> + mark(add(VAL_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) call(add, add|, , , , ) -> r(VAR_KEYWORD) -> r(inTopLevel) -> r(inTopLevel) -> r(inTopLevel) -> + mark(add(VAR_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) call(add, add|, , , , ) -> r(TYPE_KEYWORD) -> r(inTopLevel) -> r(inTopLevel) -> r(inTopLevel) -> + mark(add(TYPE_KEYWORD, inTopLevel, inTopLevel, inTopLevel)) call(add, add|, , , , ) -> r(IMPORT_KEYWORD) -> r(inTopLevel) -> + mark(add(IMPORT_KEYWORD, inTopLevel)) call(add, add|, , ) -> r(PACKAGE_KEYWORD) -> r(inTopLevel) -> + mark(add(PACKAGE_KEYWORD, inTopLevel)) call(add, add|, , ) -> r(OVERRIDE_KEYWORD) -> r(inTopLevel) -> + mark(add(OVERRIDE_KEYWORD, inTopLevel)) call(add, add|, , ) -> r(IN_KEYWORD) -> r(inTopLevel) -> r(inTopLevel) -> + mark(add(IN_KEYWORD, inTopLevel, inTopLevel)) call(add, add|, , , ) -> r(OUT_KEYWORD) -> r(inTopLevel) -> + mark(add(OUT_KEYWORD, inTopLevel)) call(add, add|, , ) -> r(OBJECT_KEYWORD) -> error(unresolvedCode, No resolved call) magic(unresolvedCode) -> + mark(add(OBJECT_KEYWORD, unresolvedCode)) call(add, add|, , ) -> + mark(registerAll()) call(registerAll, registerAll|) -> L1: 1 NEXT:[] diff --git a/compiler/testData/cfg/expressions/expressionAsFunction.instructions b/compiler/testData/cfg/expressions/expressionAsFunction.instructions index 44b62d7531e..b83a5ff8b36 100644 --- a/compiler/testData/cfg/expressions/expressionAsFunction.instructions +++ b/compiler/testData/cfg/expressions/expressionAsFunction.instructions @@ -9,9 +9,9 @@ L0: magic(f: () -> Unit) -> w(f|) 2 mark({ (f)() }) - mark((f)()) mark((f)) r(f) -> + mark((f)()) call((f), invoke|) -> L1: 1 NEXT:[] diff --git a/compiler/testData/cfg/expressions/nothingExpr.instructions b/compiler/testData/cfg/expressions/nothingExpr.instructions index ad4f0bf0576..21a743f846e 100644 --- a/compiler/testData/cfg/expressions/nothingExpr.instructions +++ b/compiler/testData/cfg/expressions/nothingExpr.instructions @@ -38,16 +38,16 @@ L0: 1 2 mark({ null!!.doSomething() bar().doSomething }) mark(null!!.doSomething()) - mark(doSomething()) - mark(null!!) r(null) -> magic(null!!|) -> jmp(error) NEXT:[] +- mark(doSomething()) PREV:[] - call(doSomething, doSomething|) -> PREV:[] - mark(bar().doSomething) PREV:[] - mark(bar()) PREV:[] - call(bar, bar) PREV:[] - jmp(error) NEXT:[] PREV:[] +- mark(doSomething) PREV:[] - call(doSomething, doSomething) -> PREV:[] L1: 1 NEXT:[] PREV:[] diff --git a/compiler/testData/cfg/expressions/unresolvedCall.instructions b/compiler/testData/cfg/expressions/unresolvedCall.instructions index 9bf196dff93..3bfc2044c02 100644 --- a/compiler/testData/cfg/expressions/unresolvedCall.instructions +++ b/compiler/testData/cfg/expressions/unresolvedCall.instructions @@ -10,10 +10,10 @@ L0: w(a|) 2 mark({ a.foo() }) mark(a.foo()) - mark(foo()) error(foo, No resolved call) error(foo, No resolved call) r(a) -> + mark(foo()) magic(foo()|) -> L1: 1 NEXT:[] diff --git a/compiler/testData/cfg/tailCalls/sum.instructions b/compiler/testData/cfg/tailCalls/sum.instructions index 80567d12824..ce457b14d51 100644 --- a/compiler/testData/cfg/tailCalls/sum.instructions +++ b/compiler/testData/cfg/tailCalls/sum.instructions @@ -14,29 +14,29 @@ L0: w(sum|) 2 mark({ if (x == 0.toLong()) return sum return sum(x - 1, sum + x) }) mark(if (x == 0.toLong()) return sum) - mark(x == 0.toLong()) r(x) -> mark(0.toLong()) - mark(toLong()) r(0) -> + mark(toLong()) call(toLong, toLong|) -> + mark(x == 0.toLong()) call(==, equals|, ) -> jf(L2|) NEXT:[read (Unit), r(sum) -> ] r(sum) -> ret(*|) L1 NEXT:[] -- jmp(L3) NEXT:[mark(sum(x - 1, sum + x))] PREV:[] +- jmp(L3) NEXT:[r(x) -> ] PREV:[] L2: read (Unit) PREV:[jf(L2|)] L3: - mark(sum(x - 1, sum + x)) - mark(x - 1) r(x) -> r(1) -> + mark(x - 1) call(-, minus|, ) -> - mark(sum + x) r(sum) -> r(x) -> + mark(sum + x) call(+, plus|, ) -> + mark(sum(x - 1, sum + x)) call(sum, sum|, ) -> ret(*|) L1 L1: