summaryrefslogtreecommitdiff
path: root/src/analysis
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-07-19 23:28:36 +0300
committerAndrei Karas <akaras@inbox.ru>2015-07-20 00:05:36 +0300
commita23225d54465bcd6e9d3805709aaec616f85903a (patch)
tree011aada003f477684fcd0299bfb412f1bd3ebb27 /src/analysis
parent4307905ef2ea753cb080b12c9a3ca70be22f40e5 (diff)
downloadparanucker-a23225d54465bcd6e9d3805709aaec616f85903a.tar.gz
paranucker-a23225d54465bcd6e9d3805709aaec616f85903a.tar.bz2
paranucker-a23225d54465bcd6e9d3805709aaec616f85903a.tar.xz
paranucker-a23225d54465bcd6e9d3805709aaec616f85903a.zip
If in if/while body changed any variable, outside of body it removed from known null vars.
Diffstat (limited to 'src/analysis')
-rw-r--r--src/analysis/collections.cpp11
-rw-r--r--src/analysis/collections.h2
-rw-r--r--src/analysis/statement.cpp3
3 files changed, 16 insertions, 0 deletions
diff --git a/src/analysis/collections.cpp b/src/analysis/collections.cpp
index b7acf6d..e9acce6 100644
--- a/src/analysis/collections.cpp
+++ b/src/analysis/collections.cpp
@@ -58,6 +58,17 @@ void addNeedCheckNullVars2(WalkItem &wi, WalkItem &wo)
}
}
+void removeKnownNullVars2(WalkItem &wi, WalkItem &wo)
+{
+ FOR_EACH (it, wo.knownNullVars)
+ {
+ if (isNotIn(it, wi.knownNullVars))
+ {
+ wo.knownNullVars.erase(it);
+ }
+ }
+}
+
void removeNeedCheckNullVars2(WalkItem &wco, WalkItem &wi, WalkItem &wo)
{
FOR_EACH (it, wi.knownNonNullVars)
diff --git a/src/analysis/collections.h b/src/analysis/collections.h
index feb0eca..e81cc7e 100644
--- a/src/analysis/collections.h
+++ b/src/analysis/collections.h
@@ -95,6 +95,8 @@ namespace Analysis
void addKnownNonNullVarWithLinked(WalkItem &wo, WalkItem &wi, const std::string &var);
void removeNeedCheckNullVarOnly(WalkItem &wi, const std::string &var);
+
+ void removeKnownNullVars2(WalkItem &wi, WalkItem &wo);
}
#endif // ANALYSIS_COLLECTIONS_H
diff --git a/src/analysis/statement.cpp b/src/analysis/statement.cpp
index 611ad26..573b5ec 100644
--- a/src/analysis/statement.cpp
+++ b/src/analysis/statement.cpp
@@ -127,6 +127,7 @@ void analyseCondition(Node *node,
{
addNeedCheckNullVars2(wo2, wo);
removeNeedCheckNullVars2(wco, wo2, wo);
+ removeKnownNullVars2(wo2, wo);
}
if (wo3.isReturned || wo3.isContinued)
{
@@ -146,6 +147,7 @@ void analyseCondition(Node *node,
{
addNeedCheckNullVars2(wo3, wo);
removeNeedCheckNullVars2(wco, wo2, wo);
+ removeKnownNullVars2(wo3, wo);
}
if ((wo2.isReturned || wo2.isContinued) && (wo3.isReturned || wo3.isContinued))
{
@@ -248,6 +250,7 @@ void analyseWhileStmt(WhileStmtNode *node, const WalkItem &wi, WalkItem &wo)
Log::dumpWI(node, "wco2 ", wco);
removeNeedCheckNullVars2(wcoSaved, wo2Saved, wo);
+ removeKnownNullVars2(wo2Saved, wo);
}
wo.isReturned = false;