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 ea5f9f7904d..9dbbe8fa50d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -316,7 +316,7 @@ public class JetControlFlowProcessor { CallableDescriptor resultingDescriptor = resolvedCall.getResultingDescriptor(); if (resultingDescriptor instanceof ReceiverParameterDescriptor) { - builder.readVariable(expression, resolvedCall, getReceiverValues(resolvedCall, true)); + builder.readVariable(expression, resolvedCall, getReceiverValues(resolvedCall)); } copyValue(expression, expression.getInstanceReference()); @@ -452,7 +452,11 @@ public class JetControlFlowProcessor { mark(expression); } - private void visitAssignment(JetExpression lhs, @NotNull Function0 rhsDeferredValue, JetExpression parentExpression) { + private void visitAssignment( + JetExpression lhs, + @NotNull Function0 rhsDeferredValue, + JetExpression parentExpression + ) { JetExpression left = JetPsiUtil.deparenthesize(lhs); if (left == null) { builder.compilationError(lhs, "No lValue in assignment"); @@ -469,7 +473,7 @@ public class JetControlFlowProcessor { if (left instanceof JetSimpleNameExpression || left instanceof JetQualifiedExpression) { accessTarget = getResolvedCallAccessTarget(PsiUtilPackage.getQualifiedElementSelector(left)); if (accessTarget instanceof AccessTarget.Call) { - receiverValues = getReceiverValues(((AccessTarget.Call) accessTarget).getResolvedCall(), true); + receiverValues = getReceiverValues(((AccessTarget.Call) accessTarget).getResolvedCall()); } } else if (left instanceof JetProperty) { @@ -498,7 +502,7 @@ public class JetControlFlowProcessor { generateInstructions(lhs.getArrayExpression()); - Map receiverValues = getReceiverValues(setResolvedCall, false); + Map receiverValues = getReceiverValues(setResolvedCall); SmartFMap argumentValues = getArraySetterArguments(rhsDeferredValue, setResolvedCall); @@ -1214,7 +1218,7 @@ public class JetControlFlowProcessor { writtenValue = builder.call( entry, resolvedCall, - getReceiverValues(resolvedCall, false), + getReceiverValues(resolvedCall), Collections.emptyMap() ).getOutputValue(); } @@ -1493,7 +1497,7 @@ public class JetControlFlowProcessor { } CallableDescriptor resultingDescriptor = resolvedCall.getResultingDescriptor(); - Map receivers = getReceiverValues(resolvedCall, true); + Map receivers = getReceiverValues(resolvedCall); SmartFMap parameterValues = SmartFMap.emptyMap(); for (ValueParameterDescriptor parameterDescriptor : resultingDescriptor.getValueParameters()) { ResolvedValueArgument argument = resolvedCall.getValueArguments().get(parameterDescriptor); @@ -1517,13 +1521,11 @@ public class JetControlFlowProcessor { } @NotNull - private Map getReceiverValues( - ResolvedCall resolvedCall, - boolean generateInstructions) { + private Map getReceiverValues(ResolvedCall resolvedCall) { SmartFMap receiverValues = SmartFMap.emptyMap(); JetElement callElement = resolvedCall.getCall().getCallElement(); - receiverValues = getReceiverValues(callElement, resolvedCall.getThisObject(), generateInstructions, receiverValues); - receiverValues = getReceiverValues(callElement, resolvedCall.getReceiverArgument(), generateInstructions, receiverValues); + receiverValues = getReceiverValues(callElement, resolvedCall.getThisObject(), receiverValues); + receiverValues = getReceiverValues(callElement, resolvedCall.getReceiverArgument(), receiverValues); return receiverValues; } @@ -1531,19 +1533,16 @@ public class JetControlFlowProcessor { private SmartFMap getReceiverValues( JetElement callElement, ReceiverValue receiver, - boolean generateInstructions, SmartFMap receiverValues ) { if (!receiver.exists()) return receiverValues; if (receiver instanceof ThisReceiver) { - if (generateInstructions) { - receiverValues = receiverValues.plus(createSyntheticValue(callElement, MagicKind.IMPLICIT_RECEIVER), receiver); - } + receiverValues = receiverValues.plus(createSyntheticValue(callElement, MagicKind.IMPLICIT_RECEIVER), receiver); } else if (receiver instanceof ExpressionReceiver) { JetExpression expression = ((ExpressionReceiver) receiver).getExpression(); - if (generateInstructions) { + if (builder.getBoundValue(expression) == null) { generateInstructions(expression); } diff --git a/compiler/testData/cfg/expressions/Assignments.instructions b/compiler/testData/cfg/expressions/Assignments.instructions index 8ab2db8cfc8..2635c2471d4 100644 --- a/compiler/testData/cfg/expressions/Assignments.instructions +++ b/compiler/testData/cfg/expressions/Assignments.instructions @@ -79,8 +79,7 @@ L5: r(1) -> mark(t.x += 1) call(t.x += 1, plus|, ) -> - r(t) -> - w(t.x|, ) + w(t.x|, ) L1: 1 NEXT:[] error: diff --git a/compiler/testData/cfg/expressions/Assignments.values b/compiler/testData/cfg/expressions/Assignments.values index 632a4117910..5d7ad87c06b 100644 --- a/compiler/testData/cfg/expressions/Assignments.values +++ b/compiler/testData/cfg/expressions/Assignments.values @@ -36,9 +36,9 @@ false true : Boolean NEW: r(true) -> false && true : Boolean NEW: magic[AND](false && true|, ) -> Test() : Test NEW: call(Test(), ) -> -t : Test NEW: r(t) -> +t : Test NEW: r(t) -> 1 : Int NEW: r(1) -> -t : Test NEW: r(t) -> +t : Test NEW: r(t) -> x : Int NEW: r(x|) -> t.x : Int COPY 1 : Int NEW: r(1) -> diff --git a/compiler/testData/cfg/expressions/nothingExpr.instructions b/compiler/testData/cfg/expressions/nothingExpr.instructions index affca21e352..a9e0a73f99b 100644 --- a/compiler/testData/cfg/expressions/nothingExpr.instructions +++ b/compiler/testData/cfg/expressions/nothingExpr.instructions @@ -31,28 +31,28 @@ sink: == foo == fun foo() { null!!.doSomething() - bar().doSomething + bar().doSomething() } --------------------- L0: 1 - 2 mark({ null!!.doSomething() bar().doSomething }) + 2 mark({ null!!.doSomething() bar().doSomething() }) mark(null!!.doSomething()) r(null) -> magic[NOT_NULL_ASSERTION](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:[] + 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:[] + 1 NEXT:[] PREV:[] error: - PREV:[jmp(error)] + PREV:[jmp(error)] sink: - PREV:[, ] + PREV:[, ] ===================== diff --git a/compiler/testData/cfg/expressions/nothingExpr.kt b/compiler/testData/cfg/expressions/nothingExpr.kt index 969c55e5cf5..8e84214c82f 100644 --- a/compiler/testData/cfg/expressions/nothingExpr.kt +++ b/compiler/testData/cfg/expressions/nothingExpr.kt @@ -4,5 +4,5 @@ fun bar(): Nothing = throw Exception() fun foo() { null!!.doSomething() - bar().doSomething + bar().doSomething() } \ No newline at end of file diff --git a/compiler/testData/cfg/expressions/nothingExpr.values b/compiler/testData/cfg/expressions/nothingExpr.values index 06e11515d56..b30b4084966 100644 --- a/compiler/testData/cfg/expressions/nothingExpr.values +++ b/compiler/testData/cfg/expressions/nothingExpr.values @@ -10,15 +10,15 @@ Exception() : {<: Throwable} NEW: call(Exception(), ) -> == foo == fun foo() { null!!.doSomething() - bar().doSomething + bar().doSomething() } --------------------- -null : * NEW: r(null) -> -null!! : * NEW: magic[NOT_NULL_ASSERTION](null!!|) -> -doSomething() : * NEW: call(doSomething(), doSomething|) -> -null!!.doSomething() : * COPY -bar() !: * -doSomething : * NEW: call(doSomething, doSomething|!) -> -bar().doSomething : * COPY -{ null!!.doSomething() bar().doSomething } : * COPY +null : * NEW: r(null) -> +null!! : * NEW: magic[NOT_NULL_ASSERTION](null!!|) -> +doSomething() : * NEW: call(doSomething(), doSomething|) -> +null!!.doSomething() : * COPY +bar() !: * +doSomething() : * NEW: call(doSomething(), doSomething|!) -> +bar().doSomething() : * COPY +{ null!!.doSomething() bar().doSomething() } : * COPY =====================