diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-06-11 18:58:58 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-06-11 18:58:58 +0300 |
commit | e63719f446f15897a7aa29e0242f121b8df50555 (patch) | |
tree | 7f8372b5558a4af33ceddf52fc344625526e5fb9 /src/analysis/analysis.cpp | |
parent | 863ede59a63ea38e98960659ab98da7531046783 (diff) | |
download | paranucker-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;
Diffstat (limited to 'src/analysis/analysis.cpp')
-rw-r--r-- | src/analysis/analysis.cpp | 12 |
1 files changed, 11 insertions, 1 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) { |