summaryrefslogtreecommitdiff
path: root/src/analysis/expression.cpp
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-06-18 20:28:01 +0300
committerAndrei Karas <akaras@inbox.ru>2015-06-18 20:28:01 +0300
commit154855dc8d8ce6edf5ecd1bef8f0c9ce2b556e69 (patch)
tree5cbaa7507ad8c5c27a5d18c10800024cf0e9c267 /src/analysis/expression.cpp
parent4125da9e48ff0f6240ad705d8a47323b70ee59c1 (diff)
downloadparanucker-154855dc8d8ce6edf5ecd1bef8f0c9ce2b556e69.tar.gz
paranucker-154855dc8d8ce6edf5ecd1bef8f0c9ce2b556e69.tar.bz2
paranucker-154855dc8d8ce6edf5ecd1bef8f0c9ce2b556e69.tar.xz
paranucker-154855dc8d8ce6edf5ecd1bef8f0c9ce2b556e69.zip
Add basic analysis for node TRUTH_ANDIF_EXPR.
Diffstat (limited to 'src/analysis/expression.cpp')
-rw-r--r--src/analysis/expression.cpp42
1 files changed, 40 insertions, 2 deletions
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index 0228f4b..c81378f 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -31,6 +31,7 @@
#include "nodes/expr/ne_expr.h"
#include "nodes/expr/pointerplus_expr.h"
#include "nodes/expr/return_expr.h"
+#include "nodes/expr/truthandif_expr.h"
#include "nodes/expr/truthorif_expr.h"
#include "nodes/ref/indirect_ref.h"
@@ -102,6 +103,11 @@ void analyseNeExpr(NeExprNode *node, const WalkItem &wi, WalkItem &wo)
{
Log::log("analyseNeExpr 2\n");
wo.checkedNonNullVars.insert(node1->label);
+ wo.cleanExpr = true;
+ }
+ else
+ {
+ wo.cleanExpr = false;
}
}
@@ -126,6 +132,11 @@ void analyseEqExpr(EqExprNode *node, const WalkItem &wi, WalkItem &wo)
{
Log::log("analyseEqExpr 2\n");
wo.checkedNullVars.insert(node1->label);
+ wo.cleanExpr = true;
+ }
+ else
+ {
+ wo.cleanExpr = false;
}
}
@@ -142,9 +153,36 @@ void analyseTruthOrIfExpr(TruthOrIfExprNode *node, const WalkItem &wi, WalkItem
walkTree(node->args[1], wi, wo2);
Log::dumpWI(node, "wo1 ", wo1);
Log::dumpWI(node, "wo2 ", wo2);
- mergeChecked(wo, wo1);
- mergeChecked(wo, wo2);
+ if (wo1.cleanExpr)
+ mergeChecked(wo, wo1);
+ if (wo2.cleanExpr)
+ mergeChecked(wo, wo2);
+ wo.cleanExpr = true;
wo.stopWalking = true;
}
+void analyseTruthAndIfExpr(TruthAndIfExprNode *node, const WalkItem &wi, WalkItem &wo)
+{
+ // need two args for check
+ if (node->args.size() < 2 || command == FindArgs)
+ return;
+
+ Log::dumpWI(node, "wo ", wo);
+ WalkItem wo1 = wo;
+ walkTree(node->args[0], wi, wo1);
+ WalkItem wo2 = wo1;
+ walkTree(node->args[1], wo1, wo2);
+ Log::dumpWI(node, "wo1 ", wo1);
+ Log::dumpWI(node, "wo2 ", wo2);
+
+ wo.stopWalking = true;
+ if (wo1.cleanExpr && wo2.cleanExpr)
+ { // need combine wo1 and wo2
+ // for now empty simple merge, but must be compilated!
+ mergeChecked(wo, wo1);
+ mergeChecked(wo, wo2);
+ }
+ wo.cleanExpr = true;
+}
+
}