summaryrefslogtreecommitdiff
path: root/src/analysis/expression.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-06-30 18:04:30 +0300
committerAndrei Karas <akaras@inbox.ru>2015-06-30 18:04:30 +0300
commite06b95c40e9b9a75c24acbba429cfdd7b1e6e6ac (patch)
tree2bba13a90d1a090fb8d50521e5e93f78b13ead58 /src/analysis/expression.cpp
parent9cc0761398d1c12157ff7a4f094c45d570433ef5 (diff)
downloadparanucker-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/analysis/expression.cpp')
-rw-r--r--src/analysis/expression.cpp63
1 files changed, 32 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);
+}
+
}