diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-07-01 18:19:12 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-07-01 18:19:12 +0300 |
commit | 1f8411373577372f1b4c969a7f1c87f8f8354107 (patch) | |
tree | ee8ce6e69e63e6d1e8a10333be240ced9508b89d /src/analysis/analysis.cpp | |
parent | a9b1e1d3e82cf93af5e4f485b7c05cb932ed092c (diff) | |
download | paranucker-1f8411373577372f1b4c969a7f1c87f8f8354107.tar.gz paranucker-1f8411373577372f1b4c969a7f1c87f8f8354107.tar.bz2 paranucker-1f8411373577372f1b4c969a7f1c87f8f8354107.tar.xz paranucker-1f8411373577372f1b4c969a7f1c87f8f8354107.zip |
Move collection manipulation functions into separate file.
Diffstat (limited to 'src/analysis/analysis.cpp')
-rw-r--r-- | src/analysis/analysis.cpp | 144 |
1 files changed, 1 insertions, 143 deletions
diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp index 5c73bc3..3433554 100644 --- a/src/analysis/analysis.cpp +++ b/src/analysis/analysis.cpp @@ -22,6 +22,7 @@ #include "command.h" #include "logger.h" +#include "analysis/collections.h" #include "analysis/declaration.h" #include "analysis/expression.h" #include "analysis/function.h" @@ -61,115 +62,6 @@ namespace Analysis { -// add variables null pointer checks -void addNeedCheckNullVars(WalkItem &wi, WalkItem &wo) -{ - FOR_EACH (it, wi.addNullVars) - { - wo.needCheckNullVars.insert(it); - wo.knownVars.insert(it); - } -} - -// remove one variable from null pointer checks -void removeNeedCheckNullVar(WalkItem &wi, std::string str) -{ - if (isIn(str, wi.needCheckNullVars)) - { - wi.needCheckNullVars.erase(str); - } - if (isIn(str, wi.addNullVars)) - { - wi.addNullVars.erase(str); - } - auto it2 = wi.linkedVars.find(str); - if (it2 != wi.linkedVars.end()) - { - const StringSet &linked = (*it2).second; - FOR_EACH (it3, linked) - { - if (isIn(it3, wi.needCheckNullVars)) - { - wi.needCheckNullVars.erase(it3); - } - if (isIn(it3, wi.addNullVars)) - { - wi.addNullVars.erase(it3); - } - } - } -} - -// remove vars from checks for null pointer with linked vars -void removeNeedCheckNullVarsSetAll(WalkItem &wi, std::set<std::string> &vars) -{ - FOR_EACH (it, vars) - { - // remove var if need - removeNeedCheckNullVar(wi, it); - // if need remove some linked var, search it parent, - // and remove all linked vars for this parent - auto it3 = wi.linkedReverseVars.find(it); - if (it3 != wi.linkedReverseVars.end()) - { - const std::string parent = (*it3).second; - //wi.linkedVars.erase(parent); - removeNeedCheckNullVar(wi, parent); - } - } -} - -// remove vars from checks for null pointer without linked vars -void removeNeedCheckNullVarsSet(WalkItem &wi, std::set<std::string> &vars) -{ - FOR_EACH (it, vars) - { - if (isIn(it, wi.needCheckNullVars)) - { - wi.needCheckNullVars.erase(it); - } - if (isIn(it, wi.addNullVars)) - { - 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); - } - } -} - -void addNullVar(WalkItem &wi, - const std::string &var) -{ - wi.addNullVars.insert(var); - wi.removeNullVars.erase(var); -} - -// link var to parent. (type var = parent) -void addLinkedVar(WalkItem &wi, - std::string parent, - const std::string &var) -{ - // found parent as already linked var. need change parent to real parent - if (isIn(parent, wi.linkedReverseVars)) - parent = wi.linkedReverseVars[parent]; - if (isNotIn(parent, wi.linkedVars)) - wi.linkedVars[parent] = std::set<std::string>(); - wi.linkedVars[parent].insert(var); - wi.linkedReverseVars[var] = parent; -} - void startWalkTree(Node *node) { WalkItem wi; @@ -277,40 +169,6 @@ Node *skipBackNop(Node *node) return node; } -// merger two checked for null var sets -void mergeNullChecked(WalkItem &wi1, WalkItem &wi2) -{ - wi1.checkedNullVars.insert(wi2.checkedNullVars.begin(), - wi2.checkedNullVars.end()); -} - -// merger two checked for non null var sets -void mergeNonNullChecked(WalkItem &wi1, WalkItem &wi2) -{ - wi1.checkedNonNullVars.insert(wi2.checkedNonNullVars.begin(), - wi2.checkedNonNullVars.end()); -} - -// intersect two checked for null sets -void intersectNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2) -{ - FOR_EACH (it, wi1.checkedNullVars) - { - if (isIn(it, wi2.checkedNullVars)) - wi.checkedNullVars.insert(it); - } -} - -// intersect two checked for non null sets -void intersectNonNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2) -{ - FOR_EACH (it, wi1.checkedNonNullVars) - { - if (isIn(it, wi2.checkedNonNullVars)) - wi.checkedNonNullVars.insert(it); - } -} - void analyseNode(Node *node, const WalkItem &wi, WalkItem &wo) { if (!node) |