summaryrefslogtreecommitdiff
path: root/src/analysis/analysis.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-07-01 18:19:12 +0300
committerAndrei Karas <akaras@inbox.ru>2015-07-01 18:19:12 +0300
commit1f8411373577372f1b4c969a7f1c87f8f8354107 (patch)
treeee8ce6e69e63e6d1e8a10333be240ced9508b89d /src/analysis/analysis.cpp
parenta9b1e1d3e82cf93af5e4f485b7c05cb932ed092c (diff)
downloadparanucker-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.cpp144
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)