From 0f1494e02a86734644e62377809d28af37be2301 Mon Sep 17 00:00:00 2001 From: peter Date: Sun, 15 Sep 2013 15:33:00 +0400 Subject: [PATCH] dfa: don't multiply eq classes until really needed --- .../dataFlow/DfaMemoryStateImpl.java | 21 +++++++++---------- .../dataFlow/unboxingNPE/expected.xml | 6 ++++++ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java index 89e813a9d617..374415aae0b1 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java @@ -511,13 +511,12 @@ public class DfaMemoryStateImpl implements DfaMemoryState { @Override public boolean isNull(DfaValue dfaValue) { if (dfaValue instanceof DfaTypeValue && ((DfaTypeValue)dfaValue).isNotNull()) return false; + + if (dfaValue instanceof DfaConstValue) return ((DfaConstValue)dfaValue).getConstant() == null; - if (dfaValue instanceof DfaVariableValue || dfaValue instanceof DfaConstValue) { - DfaConstValue dfaNull = myFactory.getConstFactory().getNull(); - Integer c1Index = getOrCreateEqClassIndex(dfaValue); - Integer c2Index = getOrCreateEqClassIndex(dfaNull); - - return c1Index != null && c1Index.equals(c2Index); + if (dfaValue instanceof DfaVariableValue) { + int c1Index = getEqClassIndex(dfaValue); + return c1Index >= 0 && c1Index == getEqClassIndex(myFactory.getConstFactory().getNull()); } return false; @@ -530,16 +529,16 @@ public class DfaMemoryStateImpl implements DfaMemoryState { } DfaConstValue dfaNull = myFactory.getConstFactory().getNull(); - Integer c1Index = getOrCreateEqClassIndex(dfaVar); - Integer c2Index = getOrCreateEqClassIndex(dfaNull); - if (c1Index == null || c2Index == null) { + int c1Index = getEqClassIndex(dfaVar); + int c2Index = getEqClassIndex(dfaNull); + if (c1Index < 0 || c2Index < 0) { return false; } long[] pairs = myDistinctClasses.toArray(); for (long pair : pairs) { - if (c1Index.equals(low(pair)) && c2Index.equals(high(pair)) || - c1Index.equals(high(pair)) && c2Index.equals(low(pair))) { + if (c1Index == low(pair) && c2Index == high(pair) || + c1Index == high(pair) && c2Index == low(pair)) { return true; } } diff --git a/java/java-tests/testData/inspection/dataFlow/unboxingNPE/expected.xml b/java/java-tests/testData/inspection/dataFlow/unboxingNPE/expected.xml index 000168e3d991..caab45d3b56a 100644 --- a/java/java-tests/testData/inspection/dataFlow/unboxingNPE/expected.xml +++ b/java/java-tests/testData/inspection/dataFlow/unboxingNPE/expected.xml @@ -384,4 +384,10 @@ Condition <code>i</code> is always <code>true</code> when reached + + Test.java + 62 + testUnboxingNPE_7454908424878253728 + Switch label<code>case 0:</code> is unreachable +