summaryrefslogtreecommitdiff
path: root/src/analysis/analysis.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-06-11 17:02:19 +0300
committerAndrei Karas <akaras@inbox.ru>2015-06-11 17:49:30 +0300
commit863ede59a63ea38e98960659ab98da7531046783 (patch)
tree693ecf2fa3e4bf75d8ead77ebe43a2a8b82829ee /src/analysis/analysis.cpp
parent69537789ddcdc659da19bc560afc23b5b3d8156b (diff)
downloadparanucker-863ede59a63ea38e98960659ab98da7531046783.tar.gz
paranucker-863ede59a63ea38e98960659ab98da7531046783.tar.bz2
paranucker-863ede59a63ea38e98960659ab98da7531046783.tar.xz
paranucker-863ede59a63ea38e98960659ab98da7531046783.zip
Change how node analysers getting information about current tasks.
Now two variables one const for input data, and second for output data.
Diffstat (limited to 'src/analysis/analysis.cpp')
-rw-r--r--src/analysis/analysis.cpp49
1 files changed, 29 insertions, 20 deletions
diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp
index cff5df7..eb69f4d 100644
--- a/src/analysis/analysis.cpp
+++ b/src/analysis/analysis.cpp
@@ -44,29 +44,32 @@ namespace Analysis
void startWalkTree(Node *node)
{
- walkTree(node, WalkItem());
+ WalkItem wi;
+ WalkItem wo;
+ walkTree(node, wi, wo);
}
-WalkItem walkTree(Node *node, WalkItem wi)
+void walkTree(Node *node, const WalkItem &wi, WalkItem &wo)
{
if (!node)
- return wi;
+ return;
- wi = analyseNode(node, wi);
+ WalkItem wi2 = wi;
+ analyseNode(node, wi2, wo);
- if (wi.stopWalking)
+ if (wo.stopWalking)
{
- wi.stopWalking = false;
- return wi;
+ wo.stopWalking = false;
+ return;
}
- WalkItem wi2 = wi;
+ WalkItem wo2 = wo;
FOR_EACH (std::vector<Node*>::iterator, it, node->childs)
{
- wi2 = walkTree(*it, wi2);
- wi2.stopWalking = false;
+ wi2 = wi;
+ walkTree(*it, wi2, wo2);
+ wo2.stopWalking = false;
}
- return wi;
}
int findBackLocation(Node *node)
@@ -80,10 +83,10 @@ int findBackLocation(Node *node)
return loc;
}
-WalkItem analyseNode(Node *node, WalkItem wi)
+void analyseNode(Node *node, const WalkItem &wi, WalkItem &wo)
{
if (!node)
- return wi;
+ return;
if (command == Command::DumpNullPointers)
{
@@ -99,25 +102,31 @@ WalkItem analyseNode(Node *node, WalkItem wi)
Log::log("\n");
}
+ wo = wi;
// searching function declaration
switch (node->nodeType)
{
case FUNCTION_DECL:
- return analyseFunction(static_cast<FunctionDeclNode*>(node), wi);
+ analyseFunction(static_cast<FunctionDeclNode*>(node), wi, wo);
+ break;
case ADDR_EXPR:
- return analyseAddrExpr(static_cast<AddrExprNode*>(node), wi);
+ analyseAddrExpr(static_cast<AddrExprNode*>(node), wi, wo);
+ break;
case MODIFY_EXPR:
- return analyseModifyExpr(static_cast<ModifyExprNode*>(node), wi);
+ analyseModifyExpr(static_cast<ModifyExprNode*>(node), wi, wo);
+ break;
case POINTER_PLUS_EXPR:
- return analysePointerPlusExpr(static_cast<PointerPlusExprNode*>(node), wi);
+ analysePointerPlusExpr(static_cast<PointerPlusExprNode*>(node), wi, wo);
+ break;
case VAR_DECL:
- return analyseVarDecl(static_cast<VarDeclNode*>(node), wi);
+ analyseVarDecl(static_cast<VarDeclNode*>(node), wi, wo);
+ break;
case IF_STMT:
- return analyseIfStmt(static_cast<IfStmtNode*>(node), wi);
+ analyseIfStmt(static_cast<IfStmtNode*>(node), wi, wo);
+ break;
default:
break;
}
- return wi;
}
}