diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-06-11 17:02:19 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-06-11 17:49:30 +0300 |
commit | 863ede59a63ea38e98960659ab98da7531046783 (patch) | |
tree | 693ecf2fa3e4bf75d8ead77ebe43a2a8b82829ee /src/analysis/analysis.cpp | |
parent | 69537789ddcdc659da19bc560afc23b5b3d8156b (diff) | |
download | paranucker-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.cpp | 49 |
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; } } |