diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-07-03 19:15:51 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-07-03 19:15:51 +0300 |
commit | 7556ade255ff2b24214dc8e5ad32a1733f5a35b4 (patch) | |
tree | e0418969c2e270fadef69249fa9a8dee62eeb3bf /src/analysis/expression.cpp | |
parent | 5b3fb4afecd2800245d7629a0aa8591f6e2461ed (diff) | |
download | paranucker-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.cpp | 37 |
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; } |