summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-07-03 17:21:47 +0300
committerAndrei Karas <akaras@inbox.ru>2015-07-03 17:21:47 +0300
commit72f4460325aada58e9fae35c626832c31b1ed087 (patch)
tree11aed83993922646951f849f21e743517ae98889
parentc34af863bf4f6ad74257302c2effb535dd115289 (diff)
downloadparanucker-72f4460325aada58e9fae35c626832c31b1ed087.tar.gz
paranucker-72f4460325aada58e9fae35c626832c31b1ed087.tar.bz2
paranucker-72f4460325aada58e9fae35c626832c31b1ed087.tar.xz
paranucker-72f4460325aada58e9fae35c626832c31b1ed087.zip
Add incomplete implimentation for checkedElse* sets.
-rw-r--r--src/analysis/checks.cpp2
-rw-r--r--src/analysis/collections.cpp34
-rw-r--r--src/analysis/collections.h8
-rw-r--r--src/analysis/expression.cpp4
-rw-r--r--src/analysis/statement.cpp29
-rw-r--r--src/analysis/walkitem.h10
-rw-r--r--src/logger.cpp2
7 files changed, 75 insertions, 14 deletions
diff --git a/src/analysis/checks.cpp b/src/analysis/checks.cpp
index 7500602..773b9b3 100644
--- a/src/analysis/checks.cpp
+++ b/src/analysis/checks.cpp
@@ -124,6 +124,8 @@ std::set<std::string> getCollection(Node *node,
else convertCollection(addNullVars)
else convertCollection(checkedThenNullVars)
else convertCollection(checkedThenNonNullVars)
+ else convertCollection(checkedElseNullVars)
+ else convertCollection(checkedElseNonNullVars)
else
{
reportWrongCheck(node);
diff --git a/src/analysis/collections.cpp b/src/analysis/collections.cpp
index 9dc4429..81559f9 100644
--- a/src/analysis/collections.cpp
+++ b/src/analysis/collections.cpp
@@ -165,6 +165,13 @@ void mergeThenNullChecked(WalkItem &wi1, WalkItem &wi2)
wi2.checkedThenNullVars.end());
}
+// merger two checked for null var sets
+void mergeElseNullChecked(WalkItem &wi1, WalkItem &wi2)
+{
+ wi1.checkedElseNullVars.insert(wi2.checkedElseNullVars.begin(),
+ wi2.checkedElseNullVars.end());
+}
+
// merger two checked for non null var sets
void mergeThenNonNullChecked(WalkItem &wi1, WalkItem &wi2)
{
@@ -172,6 +179,13 @@ void mergeThenNonNullChecked(WalkItem &wi1, WalkItem &wi2)
wi2.checkedThenNonNullVars.end());
}
+// merger two checked for non null var sets
+void mergeElseNonNullChecked(WalkItem &wi1, WalkItem &wi2)
+{
+ wi1.checkedElseNonNullVars.insert(wi2.checkedElseNonNullVars.begin(),
+ wi2.checkedElseNonNullVars.end());
+}
+
// intersect two checked for null sets
void intersectThenNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2)
{
@@ -182,6 +196,16 @@ void intersectThenNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2)
}
}
+// intersect two checked for null sets
+void intersectElseNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2)
+{
+ FOR_EACH (it, wi1.checkedElseNullVars)
+ {
+ if (isIn(it, wi2.checkedElseNullVars))
+ wi.checkedElseNullVars.insert(it);
+ }
+}
+
// intersect two checked for non null sets
void intersectThenNonNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2)
{
@@ -192,6 +216,16 @@ void intersectThenNonNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2)
}
}
+// intersect two checked for non null sets
+void intersectElseNonNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2)
+{
+ FOR_EACH (it, wi1.checkedElseNonNullVars)
+ {
+ if (isIn(it, wi2.checkedElseNonNullVars))
+ wi.checkedElseNonNullVars.insert(it);
+ }
+}
+
void removeFromNeedCheckNullVars(WalkItem &wi, std::set<std::string> &vars)
{
FOR_EACH (it, vars)
diff --git a/src/analysis/collections.h b/src/analysis/collections.h
index 70d8d03..6e31f87 100644
--- a/src/analysis/collections.h
+++ b/src/analysis/collections.h
@@ -50,12 +50,20 @@ namespace Analysis
void mergeThenNullChecked(WalkItem &wi1, WalkItem &wi2);
+ void mergeElseNullChecked(WalkItem &wi1, WalkItem &wi2);
+
void mergeThenNonNullChecked(WalkItem &wi1, WalkItem &wi2);
+ void mergeElseNonNullChecked(WalkItem &wi1, WalkItem &wi2);
+
void intersectThenNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2);
+ void intersectElseNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2);
+
void intersectThenNonNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2);
+ void intersectElseNonNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2);
+
void removeFromNeedCheckNullVars(WalkItem &wi,
std::set<std::string> &vars);
}
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index 5895d98..443a410 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -229,6 +229,7 @@ void analyseNeExpr(NeExprNode *node, const WalkItem &wi, WalkItem &wo)
if (isIn(var, wi.needCheckNullVars))
{
wo.checkedThenNonNullVars.insert(var);
+ wo.checkedElseNullVars.insert(var);
wo.knownNonNullVars.insert(var);
wo.cleanExpr = true;
wo.uselessExpr = false;
@@ -340,6 +341,7 @@ void analyseEqExpr(EqExprNode *node, const WalkItem &wi, WalkItem &wo)
if (isIn(var, wi.needCheckNullVars))
{
wo.checkedThenNullVars.insert(var);
+ wo.checkedElseNonNullVars.insert(var);
wo.knownNullVars.insert(var);
wo.cleanExpr = true;
wo.uselessExpr = false;
@@ -393,6 +395,8 @@ 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);
// need intersect knownNull/knownNonNull
diff --git a/src/analysis/statement.cpp b/src/analysis/statement.cpp
index 3a89d65..121818e 100644
--- a/src/analysis/statement.cpp
+++ b/src/analysis/statement.cpp
@@ -86,16 +86,21 @@ void analyseCondition(Node *node,
Log::dumpWI(node, "wo2 then ", wo2);
WalkItem wi3 = wi;
-// if (wco.cleanExpr)
-// removeNeedCheckNullVarsSetAll(wi3, wco.checkedThenNullVars);
-// wi3.needCheckNullVars.insert(wco.checkedThenNonNullVars.begin(),
-// wco.checkedThenNonNullVars.end());
+ if (wco.cleanExpr)
+ removeNeedCheckNullVarsSetAll(wi3, wco.checkedElseNullVars);
+ wi3.needCheckNullVars.insert(wco.checkedElseNonNullVars.begin(),
+ wco.checkedElseNonNullVars.end());
// wi3.knownNonNullVars.insert(wco.knownNullVars.begin(),
// wco.knownNullVars.end());
// wi3.knownNullVars.insert(wco.knownNonNullVars.begin(),
// wco.knownNonNullVars.end());
-// wi3.needCheckNullVars = wi3.knownVars;
-// removeFromNeedCheckNullVars(wi3, wi3.knownNonNullVars);
+ wi3.knownNullVars.insert(wco.checkedElseNullVars.begin(),
+ wco.checkedElseNullVars.end());
+ wi3.knownNonNullVars.insert(wco.checkedElseNonNullVars.begin(),
+ wco.checkedElseNonNullVars.end());
+ wi3.needCheckNullVars = wi3.knownVars;
+ removeFromNeedCheckNullVars(wi3, wi3.knownNonNullVars);
+/*
if (wo2.cleanExpr)
mergeThenNullChecked(wi3, wo2);
// ?
@@ -117,7 +122,7 @@ void analyseCondition(Node *node,
}
}
}
-
+*/
wo3 = wi3;
Log::dumpWI(node, "wi3 else ", wi3);
@@ -130,12 +135,12 @@ void analyseCondition(Node *node,
// probably condition wrong
if (wo2.cleanExpr)
- mergeThenNullChecked(wo, wo2);
+ mergeElseNullChecked(wo, wo2);
// probably condition wrong
if (wo3.cleanExpr)
- mergeThenNullChecked(wo, wo3);
+ mergeElseNullChecked(wo, wo3);
// need check for cleanExpr?
- intersectThenNonNullChecked(wo, wo2, wo3);
+ intersectElseNonNullChecked(wo, wo2, wo3);
if (wo2.isReturned)
{
@@ -157,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.checkedThenNonNullVars)
+ FOR_EACH (it, wco.checkedElseNullVars)
{
wo.removeNullVarsAll.insert(it);
wo.knownNonNullVars.insert(it);
@@ -165,7 +170,7 @@ void analyseCondition(Node *node,
}
if (wco.cleanExpr)
{
- FOR_EACH (it, wco.checkedThenNullVars)
+ FOR_EACH (it, wco.checkedElseNonNullVars)
{
wo.knownNullVars.insert(it);
}
diff --git a/src/analysis/walkitem.h b/src/analysis/walkitem.h
index 60bd30d..829a73e 100644
--- a/src/analysis/walkitem.h
+++ b/src/analysis/walkitem.h
@@ -40,6 +40,8 @@ struct WalkItem
addNullVars(),
checkedThenNullVars(),
checkedThenNonNullVars(),
+ checkedElseNullVars(),
+ checkedElseNonNullVars(),
linkedVars(),
linkedReverseVars(),
stopWalking(false),
@@ -59,6 +61,8 @@ struct WalkItem
addNullVars(item.addNullVars),
checkedThenNullVars(item.checkedThenNullVars),
checkedThenNonNullVars(item.checkedThenNonNullVars),
+ checkedElseNullVars(item.checkedElseNullVars),
+ checkedElseNonNullVars(item.checkedElseNonNullVars),
linkedVars(item.linkedVars),
linkedReverseVars(item.linkedReverseVars),
stopWalking(item.stopWalking),
@@ -75,8 +79,10 @@ struct WalkItem
StringSet removeNullVarsAll; // need remove vars from parent checkNullVars with linked vars
StringSet removeNullVars; // need remove vars from parent checkNullVars without linked vars
StringSet addNullVars; // need add vars to parent checkNullVars
- StringSet checkedThenNullVars; // vars checked for null in expressions
- StringSet checkedThenNonNullVars; // vars checked for nonnull in expressions
+ StringSet checkedThenNullVars; // vars checked for null in expressions for then case
+ StringSet checkedThenNonNullVars; // vars checked for nonnull in expressions for then case
+ StringSet checkedElseNullVars; // vars checked for null in expressions for else case
+ StringSet checkedElseNonNullVars; // vars checked for nonnull in expressions for else case
StringMapSet linkedVars; // linked vars. map <parent, set(vars)>
StringMap linkedReverseVars; // linked vars. map <child, parent>
bool stopWalking; // stop walking on tree after this node
diff --git a/src/logger.cpp b/src/logger.cpp
index 93e4140..4431801 100644
--- a/src/logger.cpp
+++ b/src/logger.cpp
@@ -221,6 +221,8 @@ void dumpWI(Node *const node,
Log::log(" returned");
dumpWIProps(" checkedThenNullVars:", wi.checkedThenNullVars)
dumpWIProps(" checkedThenNonNullVars:", wi.checkedThenNonNullVars)
+ dumpWIProps(" checkedElseNullVars:", wi.checkedElseNullVars)
+ dumpWIProps(" checkedElseNonNullVars:", wi.checkedElseNonNullVars)
dumpWIProps(" needCheckNullVars:", wi.needCheckNullVars)
dumpWIProps(" knownVars:", wi.knownVars)
dumpWIProps(" knownNullVars:", wi.knownNullVars)