summaryrefslogtreecommitdiff
path: root/src/analysis/analysis.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-07-01 01:41:52 +0300
committerAndrei Karas <akaras@inbox.ru>2015-07-01 01:41:52 +0300
commit28fdb6c00b7955c49f1e11c475b8aef6bc4203d9 (patch)
treebabac0fdb28ea107a49d3ef0bf72b80c11ec0cb7 /src/analysis/analysis.cpp
parent8bb94c8de942dc39fb9092ca1d38dca9fafbbb05 (diff)
downloadparanucker-28fdb6c00b7955c49f1e11c475b8aef6bc4203d9.tar.gz
paranucker-28fdb6c00b7955c49f1e11c475b8aef6bc4203d9.tar.bz2
paranucker-28fdb6c00b7955c49f1e11c475b8aef6bc4203d9.tar.xz
paranucker-28fdb6c00b7955c49f1e11c475b8aef6bc4203d9.zip
Add ability for remove variable from checks without linked vars.
Diffstat (limited to 'src/analysis/analysis.cpp')
-rw-r--r--src/analysis/analysis.cpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp
index 65ae633..d3f57df 100644
--- a/src/analysis/analysis.cpp
+++ b/src/analysis/analysis.cpp
@@ -119,6 +119,36 @@ void removeNeedCheckNullVarsSetAll(WalkItem &wi, std::set<std::string> &vars)
}
}
+// remove vars from checks for null pointer without linked vars
+void removeNeedCheckNullVarsSet(WalkItem &wi, std::set<std::string> &vars)
+{
+ FOR_EACH (it, vars)
+ {
+ if (wi.needCheckNullVars.find(it) != wi.needCheckNullVars.end())
+ {
+ wi.needCheckNullVars.erase(it);
+ }
+ if (wi.addNullVars.find(it) != wi.addNullVars.end())
+ {
+ wi.addNullVars.erase(it);
+ }
+ auto it2 = wi.linkedVars.find(it);
+ if (it2 != wi.linkedVars.end())
+ {
+ const StringSet linked = (*it2).second;
+ std::string newParent = *(linked.begin());
+ wi.linkedVars[newParent] = linked;
+ wi.linkedVars.erase(it);
+ wi.linkedVars[newParent].erase(newParent);
+ }
+ auto it3 = wi.linkedReverseVars.find(it);
+ if (it3 != wi.linkedReverseVars.end())
+ {
+ wi.linkedReverseVars.erase(it);
+ }
+ }
+}
+
// link var to parent. (type var = parent)
void addLinkedVar(WalkItem &wi,
std::string parent,
@@ -165,6 +195,7 @@ void walkTree(Node *node, const WalkItem &wi, WalkItem &wo)
addNeedCheckNullVars(wi2, wi2);
removeNeedCheckNullVarsSetAll(wi2, wi2.removeNullVarsAll);
+ removeNeedCheckNullVarsSet(wi2, wi2.removeNullVars);
const bool isReturned = wo.isReturned;
@@ -178,6 +209,7 @@ void walkTree(Node *node, const WalkItem &wi, WalkItem &wo)
{
walkTree(it, wi2, wo2);
wi2.removeNullVarsAll = wo2.removeNullVarsAll;
+ wi2.removeNullVars = wo2.removeNullVars;
wi2.addNullVars = wo2.addNullVars;
addNeedCheckNullVars(wi2, wi2);
wo2.needCheckNullVars = wi2.needCheckNullVars;
@@ -191,6 +223,7 @@ void walkTree(Node *node, const WalkItem &wi, WalkItem &wo)
}
// copy properties from wi2 to wo
wo.removeNullVarsAll = wi2.removeNullVarsAll;
+ wo.removeNullVars = wi2.removeNullVars;
wo.addNullVars = wi2.addNullVars;
wo.isReturned = wo.isReturned || isReturned || wo2.isReturned;
wo.linkedVars = wi2.linkedVars;
@@ -399,6 +432,7 @@ void analyseNode(Node *node, const WalkItem &wi, WalkItem &wo)
{
removeNeedCheckNullVarsSetAll(wi2, wi2.removeNullVarsAll);
}
+ removeNeedCheckNullVarsSet(wi2, wi2.removeNullVars);
if (command != Command::DumpNullPointers)
Log::dumpWI(node, "analyseNode wi2 ", wi2);