summaryrefslogtreecommitdiff
path: root/src/analysis/expression.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-07-03 19:15:51 +0300
committerAndrei Karas <akaras@inbox.ru>2015-07-03 19:15:51 +0300
commit7556ade255ff2b24214dc8e5ad32a1733f5a35b4 (patch)
treee0418969c2e270fadef69249fa9a8dee62eeb3bf /src/analysis/expression.cpp
parent5b3fb4afecd2800245d7629a0aa8591f6e2461ed (diff)
downloadparanucker-7556ade255ff2b24214dc8e5ad32a1733f5a35b4.tar.gz
paranucker-7556ade255ff2b24214dc8e5ad32a1733f5a35b4.tar.bz2
paranucker-7556ade255ff2b24214dc8e5ad32a1733f5a35b4.tar.xz
paranucker-7556ade255ff2b24214dc8e5ad32a1733f5a35b4.zip
Fix collections after IF_STMT or other conditions.
Still broken linked vars and using just checked pointer in expression.
Diffstat (limited to 'src/analysis/expression.cpp')
-rw-r--r--src/analysis/expression.cpp37
1 files changed, 29 insertions, 8 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index 443a410..3608eaa 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -395,8 +395,23 @@ void analyseOrCondition(Node *node, Node *node1, Node *node2, const WalkItem &wi
// }
intersectThenNonNullChecked(wo, wo1, wo2);
intersectThenNullChecked(wo, wo1, wo2);
- intersectElseNonNullChecked(wo, wo1, wo2);
- intersectElseNullChecked(wo, wo1, wo2);
+// intersectElseNonNullChecked(wo, wo1, wo2);
+// intersectElseNullChecked(wo, wo1, wo2);
+
+ if (!wo1.uselessExpr && !wo2.uselessExpr)
+ { // need combine wo1 and wo2
+ intersectElseNullChecked(wo, wo1, wo2);
+ }
+ if (!wo1.uselessExpr)
+ {
+ mergeElseNullChecked(wo, wo1);
+ mergeElseNonNullChecked(wo, wo1);
+ }
+ if (!wo2.uselessExpr)
+ {
+ mergeElseNullChecked(wo, wo2);
+ mergeElseNonNullChecked(wo, wo2);
+ }
// need intersect knownNull/knownNonNull
@@ -425,17 +440,19 @@ void analyseAndCondition(Node *node, Node *node1, Node *node2, const WalkItem &w
wo.stopWalking = true;
// probably condition wrong
- if (!wo1.uselessExpr && !wo2.uselessExpr)
- { // need combine wo1 and wo2
- intersectThenNullChecked(wo, wo1, wo2);
- }
- if (!wo1.uselessExpr)
+// if (!wo1.uselessExpr && !wo2.uselessExpr)
+// { // need combine wo1 and wo2
+// intersectThenNullChecked(wo, wo1, wo2);
+// }
+// if (!wo1.uselessExpr)
{
mergeThenNonNullChecked(wo, wo1);
+ mergeThenNullChecked(wo, wo1);
}
- if (!wo2.uselessExpr)
+// if (!wo2.uselessExpr)
{
mergeThenNonNullChecked(wo, wo2);
+ mergeThenNullChecked(wo, wo2);
}
wo.knownNullVars.insert(wo1.knownNullVars.begin(),
wo1.knownNullVars.end());
@@ -445,6 +462,10 @@ void analyseAndCondition(Node *node, Node *node1, Node *node2, const WalkItem &w
wo1.knownNonNullVars.end());
wo.knownNonNullVars.insert(wo2.knownNonNullVars.begin(),
wo2.knownNonNullVars.end());
+
+ intersectElseNonNullChecked(wo, wo1, wo2);
+ intersectElseNullChecked(wo, wo1, wo2);
+
wo.cleanExpr = wo1.cleanExpr && wo2.cleanExpr;
wo.uselessExpr = wo1.uselessExpr && wo2.uselessExpr;
}