diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-06-30 18:04:30 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-06-30 18:04:30 +0300 |
commit | e06b95c40e9b9a75c24acbba429cfdd7b1e6e6ac (patch) | |
tree | 2bba13a90d1a090fb8d50521e5e93f78b13ead58 /src | |
parent | 9cc0761398d1c12157ff7a4f094c45d570433ef5 (diff) | |
download | paranucker-e06b95c40e9b9a75c24acbba429cfdd7b1e6e6ac.tar.gz paranucker-e06b95c40e9b9a75c24acbba429cfdd7b1e6e6ac.tar.bz2 paranucker-e06b95c40e9b9a75c24acbba429cfdd7b1e6e6ac.tar.xz paranucker-e06b95c40e9b9a75c24acbba429cfdd7b1e6e6ac.zip |
Move analysis for variable assignments into shared functions.
Diffstat (limited to 'src')
-rw-r--r-- | src/analysis/expression.cpp | 63 | ||||
-rw-r--r-- | src/analysis/expression.h | 9 |
2 files changed, 41 insertions, 31 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp index 26a7cd7..177c4ec 100644 --- a/src/analysis/expression.cpp +++ b/src/analysis/expression.cpp @@ -493,17 +493,7 @@ void analyseBindExpr(BindExprNode *node, const WalkItem &wi, WalkItem &wo) walkTree(node->args[2], wi2, wo); } - Node *node1 = skipNop(node->args[0]); - if (node1 == VAR_DECL) - { - VarDeclNode *varDecl = static_cast<VarDeclNode*>(node1); - Node *initial = skipNop(varDecl->initial); - if (checkForReport(initial, wi)) - { - wo.addNullVars.insert(varDecl->label); - addLinkedVar(wo, initial->label, varDecl->label); - } - } + handleSetVarDecl(node->args[0], wi, wo); wo.stopWalking = true; } @@ -514,18 +504,7 @@ void analyseDeclExpr(DeclExprNode *node, const WalkItem &wi, WalkItem &wo) if (node->args.empty() || checkCommand(FindArgs)) return; - Node *node1 = skipNop(node->args[0]); - - if (node1 == VAR_DECL) - { - VarDeclNode *varDecl = static_cast<VarDeclNode*>(node1); - Node *initial = skipNop(varDecl->initial); - if (checkForReport(initial, wi)) - { - wo.addNullVars.insert(varDecl->label); - addLinkedVar(wo, initial->label, varDecl->label); - } - } + handleSetVarDecl(node->args[0], wi, wo); } void analyseNopExpr(NopExprNode *node, const WalkItem &wi, WalkItem &wo) @@ -648,17 +627,27 @@ void analyseCleanupPointExpr(CleanupPointExprNode* node, const WalkItem &wi, Wal wo.stopWalking = true; } -void analyseInitExpr(InitExprNode* node, - const WalkItem &wi A_UNUSED, - WalkItem &wo) +void handleSetVarDecl(Node *node, + const WalkItem &wi, + WalkItem &wo) { - // need one arg for check - if (node->args.size() < 2 || checkCommand(FindArgs)) - return; + node = skipNop(node); + if (node == VAR_DECL) + { + VarDeclNode *varDecl = static_cast<VarDeclNode*>(node); + Node *initial = skipNop(varDecl->initial); + handleSetVar(varDecl, initial, wi, wo); + } +} +void handleSetVar(Node *node1, + Node *node2, + const WalkItem &wi, + WalkItem &wo) +{ // var1 = var2 - std::string var1 = getVariableName(node->args[0]); - std::string var2 = getVariableName(node->args[1]); + const std::string var1 = getVariableName(node1); + const std::string var2 = getVariableName(node2); if (var1.empty() || var2.empty()) return; if (wi.needCheckNullVars.find(var2) == wi.needCheckNullVars.end()) @@ -667,4 +656,16 @@ void analyseInitExpr(InitExprNode* node, addLinkedVar(wo, var2, var1); } +// field = var +void analyseInitExpr(InitExprNode* node, + const WalkItem &wi, + WalkItem &wo) +{ + // need one arg for check + if (node->args.size() < 2 || checkCommand(FindArgs)) + return; + + handleSetVar(node->args[0], node->args[1], wi, wo); +} + } diff --git a/src/analysis/expression.h b/src/analysis/expression.h index 2e35efc..ccba0ca 100644 --- a/src/analysis/expression.h +++ b/src/analysis/expression.h @@ -84,6 +84,15 @@ namespace Analysis void analyseInitExpr(InitExprNode* node, const WalkItem &wi, WalkItem &wo); + void handleSetVar(Node *node1, + Node *node2, + const WalkItem &wi, + WalkItem &wo); + + void handleSetVarDecl(Node *node, + const WalkItem &wi, + WalkItem &wo); + std::string getComponentRefVariable(Node *node); } |