diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-06-18 20:28:01 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-06-18 20:28:01 +0300 |
commit | 154855dc8d8ce6edf5ecd1bef8f0c9ce2b556e69 (patch) | |
tree | 5cbaa7507ad8c5c27a5d18c10800024cf0e9c267 /src/analysis/expression.cpp | |
parent | 4125da9e48ff0f6240ad705d8a47323b70ee59c1 (diff) | |
download | paranucker-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.cpp | 42 |
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; +} + } |