diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-06-20 20:56:34 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-06-20 20:56:34 +0300 |
commit | 55b526b5957de07cea7f89e345fda0277266e485 (patch) | |
tree | 0f8640b5881a7aba45192f5bf5f8c11d14964594 | |
parent | 084f9fd98fffc2590ccd77b454f1117f5c3c6cdb (diff) | |
download | paranucker-55b526b5957de07cea7f89e345fda0277266e485.tar.gz paranucker-55b526b5957de07cea7f89e345fda0277266e485.tar.bz2 paranucker-55b526b5957de07cea7f89e345fda0277266e485.tar.xz paranucker-55b526b5957de07cea7f89e345fda0277266e485.zip |
Add support for ignore already checked vars in complex expressions.
Example: if (a && a->b)
if (!a || a->b)
-rw-r--r-- | src/analysis/analysis.cpp | 12 | ||||
-rw-r--r-- | src/analysis/analysis.h | 6 | ||||
-rw-r--r-- | src/analysis/expression.cpp | 10 |
3 files changed, 26 insertions, 2 deletions
diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp index c90d474..8352971 100644 --- a/src/analysis/analysis.cpp +++ b/src/analysis/analysis.cpp @@ -64,6 +64,18 @@ void removeCheckNullVars(WalkItem &wi) } } +void removeCheckNullVarsSet(WalkItem &wi, std::set<std::string> &vars) +{ + FOR_EACH (std::set<std::string>::const_iterator, it, vars) + { + // found var for deletion + if (wi.checkNullVars.find(*it) != wi.checkNullVars.end()) + { + wi.checkNullVars.erase(*it); + } + } +} + void startWalkTree(Node *node) { WalkItem wi; diff --git a/src/analysis/analysis.h b/src/analysis/analysis.h index f404352..4d921cb 100644 --- a/src/analysis/analysis.h +++ b/src/analysis/analysis.h @@ -22,6 +22,9 @@ #include "includes.h" +#include <set> +#include <string> + struct Node; struct WalkItem; @@ -41,6 +44,9 @@ namespace Analysis void removeCheckNullVars(WalkItem &wi); + void removeCheckNullVarsSet(WalkItem &wi, + std::set<std::string> &vars); + Node *skipNop(Node *node); void mergeNullChecked(WalkItem &wi1, WalkItem &wi2); diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp index 66e32ce..e205e7b 100644 --- a/src/analysis/expression.cpp +++ b/src/analysis/expression.cpp @@ -154,8 +154,11 @@ void analyseTruthOrIfExpr(TruthOrIfExprNode *node, const WalkItem &wi, WalkItem WalkItem wo1 = wo; WalkItem wo2 = wo; walkTree(node->args[0], wi, wo1); - walkTree(node->args[1], wi, wo2); Log::dumpWI(node, "wo1 ", wo1); + WalkItem wi2 = wi; + removeCheckNullVarsSet(wi2, wo1.checkedNullVars); + Log::dumpWI(node, "wi2 ", wi2); + walkTree(node->args[1], wi2, wo2); Log::dumpWI(node, "wo2 ", wo2); // probably condition wrong if (wo1.cleanExpr) @@ -182,8 +185,11 @@ void analyseTruthAndIfExpr(TruthAndIfExprNode *node, const WalkItem &wi, WalkIte WalkItem wo1 = wo; WalkItem wo2 = wo; walkTree(node->args[0], wi, wo1); - walkTree(node->args[1], wi, wo2); Log::dumpWI(node, "wo1 ", wo1); + WalkItem wi2 = wi; + removeCheckNullVarsSet(wi2, wo1.checkedNonNullVars); + Log::dumpWI(node, "wi2 ", wi2); + walkTree(node->args[1], wi2, wo2); Log::dumpWI(node, "wo2 ", wo2); wo.stopWalking = true; |