From 1dd46651c97a59b7b373d3b27a659ef0f3544955 Mon Sep 17 00:00:00 2001 From: peter Date: Sun, 22 Dec 2013 10:37:19 +0100 Subject: [PATCH] dfa: don't grow stack infinitely on &= (IDEA-118522) --- .../codeInspection/dataFlow/ControlFlowAnalyzer.java | 6 ++---- .../inspection/dataFlow/fixture/AndEquals.java | 11 +++++++++++ .../codeInspection/DataFlowInspectionTest.java | 1 + 3 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/AndEquals.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java index 94c0b8b66563..98e75b3d8c7e 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java @@ -1193,14 +1193,12 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { private void generateBooleanAssignmentExpression(boolean and, PsiExpression lExpression, PsiExpression rExpression, PsiType exprType) { lExpression.accept(this); - addInstruction(new DupInstruction()); generateBoxingUnboxingInstructionFor(lExpression, exprType); + addInstruction(new DupInstruction()); rExpression.accept(this); generateBoxingUnboxingInstructionFor(rExpression, exprType); - - lExpression.accept(this); - generateBoxingUnboxingInstructionFor(lExpression, exprType); + addInstruction(new SwapInstruction()); combineStackBooleans(and, lExpression); } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/AndEquals.java b/java/java-tests/testData/inspection/dataFlow/fixture/AndEquals.java new file mode 100644 index 000000000000..068c494eab29 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/AndEquals.java @@ -0,0 +1,11 @@ +import java.util.List; + +class Some { + public static void appendTokenTypes(StringBuilder sb, List tokenTypes) { + for (int count = 0, line = 0, size = tokenTypes.size(); count < size; count++) { + boolean newLine = count == 2 || line > 0 && (count - 2) % 6 == 0; + newLine &= (size - count) > 2; + } + } + +} diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java index 7e0362713496..8b109f4ef9dd 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java @@ -302,6 +302,7 @@ public class DataFlowInspectionTest extends LightCodeInsightFixtureTestCase { public void testDontLoseInequalityInformation() { doTest(); } public void testNotEqualsTypo() { doTest(); } + public void testAndEquals() { doTest(); } public void _testNullCheckBeforeInstanceof() { doTest(); } // http://youtrack.jetbrains.com/issue/IDEA-113220 }