summaryrefslogtreecommitdiff
path: root/src
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
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')
-rw-r--r--src/analysis/expression.cpp37
-rw-r--r--src/analysis/statement.cpp9
-rw-r--r--src/logger.cpp2
3 files changed, 34 insertions, 14 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;
}
diff --git a/src/analysis/statement.cpp b/src/analysis/statement.cpp
index 121818e..71b5227 100644
--- a/src/analysis/statement.cpp
+++ b/src/analysis/statement.cpp
@@ -145,7 +145,7 @@ void analyseCondition(Node *node,
if (wo2.isReturned)
{
// add variable for ignore for all parent nodes except special like IF_STMT
- FOR_EACH (it, wco.checkedThenNullVars)
+ FOR_EACH (it, wco.checkedElseNonNullVars)
{
wo.removeNullVarsAll.insert(it);
wo.knownNonNullVars.insert(it);
@@ -153,7 +153,7 @@ void analyseCondition(Node *node,
}
if (wco.cleanExpr)
{
- FOR_EACH (it, wco.checkedThenNonNullVars)
+ FOR_EACH (it, wco.checkedElseNullVars)
{
wo.knownNullVars.insert(it);
}
@@ -162,7 +162,7 @@ void analyseCondition(Node *node,
if (wo3.isReturned)
{
// add variable for ignore for all parent nodes except special like IF_STMT
- FOR_EACH (it, wco.checkedElseNullVars)
+ FOR_EACH (it, wco.checkedThenNonNullVars)
{
wo.removeNullVarsAll.insert(it);
wo.knownNonNullVars.insert(it);
@@ -170,13 +170,12 @@ void analyseCondition(Node *node,
}
if (wco.cleanExpr)
{
- FOR_EACH (it, wco.checkedElseNonNullVars)
+ FOR_EACH (it, wco.checkedThenNullVars)
{
wo.knownNullVars.insert(it);
}
}
}
-
if (wo2.isReturned && wo3.isReturned)
{
// add variable for ignore for all parent nodes except special like IF_STMT
diff --git a/src/logger.cpp b/src/logger.cpp
index 4431801..addbff7 100644
--- a/src/logger.cpp
+++ b/src/logger.cpp
@@ -206,7 +206,7 @@ void dumpWI(Node *const node,
const std::string &name,
const WalkItem &wi)
{
- if (name != "wco " && (node->parent || node != FUNCTION_DECL || name != "analyseNode wi in "))
+// if (name != "wco " && (node->parent || node != FUNCTION_DECL || name != "analyseNode wi in "))
return;
Log::log("%s%s%s %s",
node->getIndent().c_str(),