summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-07-03 22:04:47 +0300
committerAndrei Karas <akaras@inbox.ru>2015-07-03 22:30:38 +0300
commit3f3568923589b2c5d8c269e623e7a8a3751011f1 (patch)
tree78ccee28ba248be307540a0e3a63cf0191d904ab /src
parent71fca6357c093be350b746b931afddcfbfa8c32e (diff)
downloadparanucker-3f3568923589b2c5d8c269e623e7a8a3751011f1.tar.gz
paranucker-3f3568923589b2c5d8c269e623e7a8a3751011f1.tar.bz2
paranucker-3f3568923589b2c5d8c269e623e7a8a3751011f1.tar.xz
paranucker-3f3568923589b2c5d8c269e623e7a8a3751011f1.zip
Fix some issues with linked vars.
Diffstat (limited to 'src')
-rw-r--r--src/analysis/collections.cpp42
-rw-r--r--src/analysis/collections.h8
-rw-r--r--src/analysis/statement.cpp81
3 files changed, 80 insertions, 51 deletions
diff --git a/src/analysis/collections.cpp b/src/analysis/collections.cpp
index 81559f9..21c8ec1 100644
--- a/src/analysis/collections.cpp
+++ b/src/analysis/collections.cpp
@@ -19,6 +19,8 @@
#include "analysis/analysis.h"
+#include "logger.h"
+
#include "analysis/walkitem.h"
#include "localconsts.h"
@@ -234,4 +236,44 @@ void removeFromNeedCheckNullVars(WalkItem &wi, std::set<std::string> &vars)
}
}
+void addKnownNullVarsWithLinked(WalkItem &wo, WalkItem &wi, std::set<std::string> &vars)
+{
+ wo.knownNullVars.insert(vars.begin(),
+ vars.end());
+ FOR_EACH (it, vars)
+ {
+ auto it2 = wi.linkedVars.find(it);
+ if (it2 == wi.linkedVars.end() && isIn(it, wi.linkedReverseVars))
+ {
+ wo.knownNullVars.insert(wi.linkedReverseVars[it]);
+ it2 = wi.linkedVars.find(wi.linkedReverseVars[it]);
+ }
+ if (it2 != wi.linkedVars.end())
+ {
+ const StringSet &linked = (*it2).second;
+ wo.knownNullVars.insert(linked.begin(), linked.end());
+ }
+ }
+}
+
+void addKnownNonNullVarsWithLinked(WalkItem &wo, WalkItem &wi, std::set<std::string> &vars)
+{
+ wo.knownNonNullVars.insert(vars.begin(),
+ vars.end());
+ FOR_EACH (it, vars)
+ {
+ auto it2 = wi.linkedVars.find(it);
+ if (it2 == wi.linkedVars.end() && isIn(it, wi.linkedReverseVars))
+ {
+ wo.knownNonNullVars.insert(wi.linkedReverseVars[it]);
+ it2 = wi.linkedVars.find(wi.linkedReverseVars[it]);
+ }
+ if (it2 != wi.linkedVars.end())
+ {
+ const StringSet &linked = (*it2).second;
+ wo.knownNonNullVars.insert(linked.begin(), linked.end());
+ }
+ }
+}
+
}
diff --git a/src/analysis/collections.h b/src/analysis/collections.h
index 6e31f87..2911d33 100644
--- a/src/analysis/collections.h
+++ b/src/analysis/collections.h
@@ -66,6 +66,14 @@ namespace Analysis
void removeFromNeedCheckNullVars(WalkItem &wi,
std::set<std::string> &vars);
+
+ void addKnownNullVarsWithLinked(WalkItem &wo,
+ WalkItem &wi,
+ std::set<std::string> &vars);
+
+ void addKnownNonNullVarsWithLinked(WalkItem &wo,
+ WalkItem &wi,
+ std::set<std::string> &vars);
}
#endif // ANALYSIS_COLLECTIONS_H
diff --git a/src/analysis/statement.cpp b/src/analysis/statement.cpp
index ec9ec7f..790e4ba 100644
--- a/src/analysis/statement.cpp
+++ b/src/analysis/statement.cpp
@@ -66,16 +66,15 @@ void analyseCondition(Node *node,
removeNeedCheckNullVarsSetAll(wi2, wco.checkedThenNonNullVars);
wi2.needCheckNullVars.insert(wco.checkedThenNullVars.begin(),
wco.checkedThenNullVars.end());
-// wi2.knownNonNullVars.insert(wco.knownNonNullVars.begin(),
-// wco.knownNonNullVars.end());
-// wi2.knownNullVars.insert(wco.knownNullVars.begin(),
-// wco.knownNullVars.end());
- wi2.knownNullVars.insert(wco.checkedThenNullVars.begin(),
- wco.checkedThenNullVars.end());
- wi2.knownNonNullVars.insert(wco.checkedThenNonNullVars.begin(),
- wco.checkedThenNonNullVars.end());
+ addKnownNullVarsWithLinked(wi2, wco, wco.checkedThenNullVars);
+ addKnownNonNullVarsWithLinked(wi2, wco, wco.checkedThenNonNullVars);
+// wi2.knownNullVars.insert(wco.checkedThenNullVars.begin(),
+// wco.checkedThenNullVars.end());
+// wi2.knownNonNullVars.insert(wco.checkedThenNonNullVars.begin(),
+// wco.checkedThenNonNullVars.end());
wi2.needCheckNullVars = wi2.knownVars;
- removeFromNeedCheckNullVars(wi2, wi2.knownNonNullVars);
+ removeNeedCheckNullVarsSetAll(wi2, wi2.knownNonNullVars);
+// removeFromNeedCheckNullVars(wi2, wi2.knownNonNullVars);
wo2 = wi2;
Log::dumpWI(node, "wi2 then ", wi2);
@@ -90,39 +89,15 @@ void analyseCondition(Node *node,
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.knownNullVars.insert(wco.checkedElseNullVars.begin(),
- wco.checkedElseNullVars.end());
- wi3.knownNonNullVars.insert(wco.checkedElseNonNullVars.begin(),
- wco.checkedElseNonNullVars.end());
+ addKnownNullVarsWithLinked(wi3, wco, wco.checkedElseNullVars);
+ addKnownNonNullVarsWithLinked(wi3, wco, wco.checkedElseNonNullVars);
+// 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);
- // ?
- mergeThenNonNullChecked(wi3, wo2);
- if (wo2.isReturned)
- {
- // add variable for ignore for all parent nodes except special like IF_STMT
- FOR_EACH (it, wco.checkedThenNullVars)
- {
- wi3.removeNullVarsAll.insert(it);
- wi3.knownNonNullVars.insert(it);
- removeNeedCheckNullVar(wi3, it);
- }
- if (wco.cleanExpr)
- {
- FOR_EACH (it, wco.checkedThenNonNullVars)
- {
- wi3.knownNullVars.insert(it);
- }
- }
- }
-*/
+ removeNeedCheckNullVarsSetAll(wi3, wi3.knownNonNullVars);
+// removeFromNeedCheckNullVars(wi3, wi3.knownNonNullVars);
wo3 = wi3;
Log::dumpWI(node, "wi3 else ", wi3);
@@ -148,15 +123,17 @@ void analyseCondition(Node *node,
FOR_EACH (it, wco.checkedElseNonNullVars)
{
wo.removeNullVarsAll.insert(it);
- wo.knownNonNullVars.insert(it);
+ //wo.knownNonNullVars.insert(it);
removeNeedCheckNullVar(wo, it);
}
+ addKnownNonNullVarsWithLinked(wo, wco, wco.checkedElseNonNullVars);
if (wco.cleanExpr)
{
- FOR_EACH (it, wco.checkedElseNullVars)
- {
- wo.knownNullVars.insert(it);
- }
+ addKnownNullVarsWithLinked(wo, wco, wco.checkedElseNullVars);
+// FOR_EACH (it, wco.checkedElseNullVars)
+// {
+// wo.knownNullVars.insert(it);
+// }
}
}
if (wo3.isReturned)
@@ -165,15 +142,17 @@ void analyseCondition(Node *node,
FOR_EACH (it, wco.checkedThenNonNullVars)
{
wo.removeNullVarsAll.insert(it);
- wo.knownNonNullVars.insert(it);
+ //wo.knownNonNullVars.insert(it);
removeNeedCheckNullVar(wo, it);
}
+ addKnownNonNullVarsWithLinked(wo, wco, wco.checkedThenNonNullVars);
if (wco.cleanExpr)
{
- FOR_EACH (it, wco.checkedThenNullVars)
- {
- wo.knownNullVars.insert(it);
- }
+ addKnownNullVarsWithLinked(wo, wco, wco.checkedThenNullVars);
+// FOR_EACH (it, wco.checkedThenNullVars)
+// {
+// wo.knownNullVars.insert(it);
+// }
}
}
if (wo2.isReturned && wo3.isReturned)