summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-06-11 18:58:58 +0300
committerAndrei Karas <akaras@inbox.ru>2015-06-11 18:58:58 +0300
commite63719f446f15897a7aa29e0242f121b8df50555 (patch)
tree7f8372b5558a4af33ceddf52fc344625526e5fb9
parent863ede59a63ea38e98960659ab98da7531046783 (diff)
downloadparanucker-e63719f446f15897a7aa29e0242f121b8df50555.tar.gz
paranucker-e63719f446f15897a7aa29e0242f121b8df50555.tar.bz2
paranucker-e63719f446f15897a7aa29e0242f121b8df50555.tar.xz
paranucker-e63719f446f15897a7aa29e0242f121b8df50555.zip
Allow give from childs to parents variables what cant be checked.
This need for case like this: if (!a) { ... return; } *a = 10;
-rw-r--r--src/analysis/analysis.cpp12
-rw-r--r--src/analysis/statement.cpp2
2 files changed, 12 insertions, 2 deletions
diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp
index eb69f4d..011fbf1 100644
--- a/src/analysis/analysis.cpp
+++ b/src/analysis/analysis.cpp
@@ -55,6 +55,14 @@ void walkTree(Node *node, const WalkItem &wi, WalkItem &wo)
return;
WalkItem wi2 = wi;
+ FOR_EACH (std::set<std::string>::const_iterator, it, wi2.removeNullVars)
+ {
+ // found var for deletion
+ if (wi2.checkNullVars.find(*it) != wi2.checkNullVars.end())
+ {
+ wi2.checkNullVars.erase(*it);
+ }
+ }
analyseNode(node, wi2, wo);
if (wo.stopWalking)
@@ -66,10 +74,11 @@ void walkTree(Node *node, const WalkItem &wi, WalkItem &wo)
WalkItem wo2 = wo;
FOR_EACH (std::vector<Node*>::iterator, it, node->childs)
{
- wi2 = wi;
walkTree(*it, wi2, wo2);
+ wi2.removeNullVars = wo2.removeNullVars;
wo2.stopWalking = false;
}
+ wo.removeNullVars = wi2.removeNullVars;
}
int findBackLocation(Node *node)
@@ -103,6 +112,7 @@ void analyseNode(Node *node, const WalkItem &wi, WalkItem &wo)
}
wo = wi;
+
// searching function declaration
switch (node->nodeType)
{
diff --git a/src/analysis/statement.cpp b/src/analysis/statement.cpp
index 0a1be70..a585adb 100644
--- a/src/analysis/statement.cpp
+++ b/src/analysis/statement.cpp
@@ -73,7 +73,7 @@ void analyseIfStmt(IfStmtNode *node, const WalkItem &wi, WalkItem &wo)
walkTree(node->elseNode, wi2, wo);
wo.stopWalking = true;
- Log::log("add removeNullVars: %s\n", node1->label.c_str());
+ //Log::log("add removeNullVars: %s\n", node1->label.c_str());
// add variable for ignore for all parent nodes except special like IF_STMT
wo.removeNullVars.insert(node1->label);
wo.checkNullVars.erase(node1->label);