summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-06-19 17:43:00 +0300
committerAndrei Karas <akaras@inbox.ru>2015-06-19 17:43:00 +0300
commit748dc1dfbad72879c22f4b04c2f94a302f3875ec (patch)
tree9ecd6e694bf6ee68e3436d5928518fafe312ba2a
parent07d855f00bef2bc0443f5549073747dee8df858f (diff)
downloadparanucker-748dc1dfbad72879c22f4b04c2f94a302f3875ec.tar.gz
paranucker-748dc1dfbad72879c22f4b04c2f94a302f3875ec.tar.bz2
paranucker-748dc1dfbad72879c22f4b04c2f94a302f3875ec.tar.xz
paranucker-748dc1dfbad72879c22f4b04c2f94a302f3875ec.zip
Fix some issues in expressions like this "if (EXPR || EXPR)"
-rw-r--r--src/analysis/analysis.cpp14
-rw-r--r--src/analysis/analysis.h8
-rw-r--r--src/analysis/expression.cpp21
3 files changed, 32 insertions, 11 deletions
diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp
index 852eeb3..c90d474 100644
--- a/src/analysis/analysis.cpp
+++ b/src/analysis/analysis.cpp
@@ -142,15 +142,19 @@ Node *skipNop(Node *node)
return node;
}
-void mergeChecked(WalkItem &wi1, WalkItem &wi2)
+void mergeNullChecked(WalkItem &wi1, WalkItem &wi2)
{
wi1.checkedNullVars.insert(wi2.checkedNullVars.begin(),
wi2.checkedNullVars.end());
+}
+
+void mergeNonNullChecked(WalkItem &wi1, WalkItem &wi2)
+{
wi1.checkedNonNullVars.insert(wi2.checkedNonNullVars.begin(),
wi2.checkedNonNullVars.end());
}
-void intersectChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2)
+void intersectNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2)
{
FOR_EACH (std::set<std::string>::const_iterator,
it,
@@ -159,9 +163,13 @@ void intersectChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2)
if (wi2.checkedNullVars.find(*it) != wi2.checkedNullVars.end())
wi.checkedNullVars.insert(*it);
}
+}
+
+void intersectNonNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2)
+{
FOR_EACH (std::set<std::string>::const_iterator,
it,
- wi2.checkedNonNullVars)
+ wi1.checkedNonNullVars)
{
if (wi2.checkedNonNullVars.find(*it) != wi2.checkedNonNullVars.end())
wi.checkedNonNullVars.insert(*it);
diff --git a/src/analysis/analysis.h b/src/analysis/analysis.h
index 5911b50..f404352 100644
--- a/src/analysis/analysis.h
+++ b/src/analysis/analysis.h
@@ -43,9 +43,13 @@ namespace Analysis
Node *skipNop(Node *node);
- void mergeChecked(WalkItem &wi1, WalkItem &wi2);
+ void mergeNullChecked(WalkItem &wi1, WalkItem &wi2);
- void intersectChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2);
+ void mergeNonNullChecked(WalkItem &wi1, WalkItem &wi2);
+
+ void intersectNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2);
+
+ void intersectNonNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2);
}
#endif // ANALYSIS_ANALYSIS_H
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index 69c9f69..f852f9f 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -87,7 +87,7 @@ void analyseNeExpr(NeExprNode *node, const WalkItem &wi, WalkItem &wo)
if (node->args.size() < 2 || command == FindArgs)
return;
-// Log::log("analyseNeExpr 1\n");
+ //Log::dumpWI(node, "NE in ", wo);
// PARM_DECL?
Node *node1 = skipNop(node->args[0]);
// INTEGER_CST?
@@ -101,7 +101,6 @@ void analyseNeExpr(NeExprNode *node, const WalkItem &wi, WalkItem &wo)
wi.checkNullVars.find(node1->label) != wi.checkNullVars.end() &&
node2->label == "0")
{
-// Log::log("analyseNeExpr 2\n");
wo.checkedNonNullVars.insert(node1->label);
wo.cleanExpr = true;
wo.uselessExpr = false;
@@ -111,6 +110,7 @@ void analyseNeExpr(NeExprNode *node, const WalkItem &wi, WalkItem &wo)
wo.cleanExpr = false;
wo.uselessExpr = true;
}
+ //Log::dumpWI(node, "NE out ", wo);
}
void analyseEqExpr(EqExprNode *node, const WalkItem &wi, WalkItem &wo)
@@ -119,7 +119,7 @@ void analyseEqExpr(EqExprNode *node, const WalkItem &wi, WalkItem &wo)
if (node->args.size() < 2 || command == FindArgs)
return;
-// Log::log("analyseEqExpr 1\n");
+ //Log::dumpWI(node, "EQ in ", wo);
// PARM_DECL?
Node *node1 = skipNop(node->args[0]);
// INTEGER_CST?
@@ -132,7 +132,6 @@ void analyseEqExpr(EqExprNode *node, const WalkItem &wi, WalkItem &wo)
wi.checkNullVars.find(node1->label) != wi.checkNullVars.end() &&
node2->label == "0")
{
-// Log::log("analyseEqExpr 2\n");
wo.checkedNullVars.insert(node1->label);
wo.cleanExpr = true;
wo.uselessExpr = false;
@@ -142,6 +141,7 @@ void analyseEqExpr(EqExprNode *node, const WalkItem &wi, WalkItem &wo)
wo.cleanExpr = false;
wo.uselessExpr = true;
}
+ //Log::dumpWI(node, "EQ out ", wo);
}
void analyseTruthOrIfExpr(TruthOrIfExprNode *node, const WalkItem &wi, WalkItem &wo)
@@ -158,9 +158,18 @@ void analyseTruthOrIfExpr(TruthOrIfExprNode *node, const WalkItem &wi, WalkItem
//Log::dumpWI(node, "wo1 ", wo1);
//Log::dumpWI(node, "wo2 ", wo2);
if (wo1.cleanExpr)
- mergeChecked(wo, wo1);
+ {
+ mergeNullChecked(wo, wo1);
+ //mergeNonNullChecked(wo, wo1);
+ }
if (wo2.cleanExpr)
- mergeChecked(wo, wo2);
+ {
+ mergeNullChecked(wo, wo2);
+ //mergeNonNullChecked(wo, wo2);
+ }
+ // need check for cleanExpr?
+ intersectNonNullChecked(wo, wo1, wo2);
+
wo.cleanExpr = false;
wo.stopWalking = true;
wo.uselessExpr = wo1.uselessExpr || wo2.uselessExpr;