diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-06-19 17:43:00 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-06-19 17:43:00 +0300 |
commit | 748dc1dfbad72879c22f4b04c2f94a302f3875ec (patch) | |
tree | 9ecd6e694bf6ee68e3436d5928518fafe312ba2a | |
parent | 07d855f00bef2bc0443f5549073747dee8df858f (diff) | |
download | paranucker-748dc1dfbad72879c22f4b04c2f94a302f3875ec.tar.gz paranucker-748dc1dfbad72879c22f4b04c2f94a302f3875ec.tar.bz2 paranucker-748dc1dfbad72879c22f4b04c2f94a302f3875ec.tar.xz paranucker-748dc1dfbad72879c22f4b04c2f94a302f3875ec.zip |
Fix some issues in expressions like this "if (EXPR || EXPR)"
-rw-r--r-- | src/analysis/analysis.cpp | 14 | ||||
-rw-r--r-- | src/analysis/analysis.h | 8 | ||||
-rw-r--r-- | src/analysis/expression.cpp | 21 |
3 files changed, 32 insertions, 11 deletions
diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp index 852eeb3..c90d474 100644 --- a/src/analysis/analysis.cpp +++ b/src/analysis/analysis.cpp @@ -142,15 +142,19 @@ Node *skipNop(Node *node) return node; } -void mergeChecked(WalkItem &wi1, WalkItem &wi2) +void mergeNullChecked(WalkItem &wi1, WalkItem &wi2) { wi1.checkedNullVars.insert(wi2.checkedNullVars.begin(), wi2.checkedNullVars.end()); +} + +void mergeNonNullChecked(WalkItem &wi1, WalkItem &wi2) +{ wi1.checkedNonNullVars.insert(wi2.checkedNonNullVars.begin(), wi2.checkedNonNullVars.end()); } -void intersectChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2) +void intersectNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2) { FOR_EACH (std::set<std::string>::const_iterator, it, @@ -159,9 +163,13 @@ void intersectChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2) if (wi2.checkedNullVars.find(*it) != wi2.checkedNullVars.end()) wi.checkedNullVars.insert(*it); } +} + +void intersectNonNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2) +{ FOR_EACH (std::set<std::string>::const_iterator, it, - wi2.checkedNonNullVars) + wi1.checkedNonNullVars) { if (wi2.checkedNonNullVars.find(*it) != wi2.checkedNonNullVars.end()) wi.checkedNonNullVars.insert(*it); diff --git a/src/analysis/analysis.h b/src/analysis/analysis.h index 5911b50..f404352 100644 --- a/src/analysis/analysis.h +++ b/src/analysis/analysis.h @@ -43,9 +43,13 @@ namespace Analysis Node *skipNop(Node *node); - void mergeChecked(WalkItem &wi1, WalkItem &wi2); + void mergeNullChecked(WalkItem &wi1, WalkItem &wi2); - void intersectChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2); + void mergeNonNullChecked(WalkItem &wi1, WalkItem &wi2); + + void intersectNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2); + + void intersectNonNullChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2); } #endif // ANALYSIS_ANALYSIS_H diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp index 69c9f69..f852f9f 100644 --- a/src/analysis/expression.cpp +++ b/src/analysis/expression.cpp @@ -87,7 +87,7 @@ void analyseNeExpr(NeExprNode *node, const WalkItem &wi, WalkItem &wo) if (node->args.size() < 2 || command == FindArgs) return; -// Log::log("analyseNeExpr 1\n"); + //Log::dumpWI(node, "NE in ", wo); // PARM_DECL? Node *node1 = skipNop(node->args[0]); // INTEGER_CST? @@ -101,7 +101,6 @@ void analyseNeExpr(NeExprNode *node, const WalkItem &wi, WalkItem &wo) wi.checkNullVars.find(node1->label) != wi.checkNullVars.end() && node2->label == "0") { -// Log::log("analyseNeExpr 2\n"); wo.checkedNonNullVars.insert(node1->label); wo.cleanExpr = true; wo.uselessExpr = false; @@ -111,6 +110,7 @@ void analyseNeExpr(NeExprNode *node, const WalkItem &wi, WalkItem &wo) wo.cleanExpr = false; wo.uselessExpr = true; } + //Log::dumpWI(node, "NE out ", wo); } void analyseEqExpr(EqExprNode *node, const WalkItem &wi, WalkItem &wo) @@ -119,7 +119,7 @@ void analyseEqExpr(EqExprNode *node, const WalkItem &wi, WalkItem &wo) if (node->args.size() < 2 || command == FindArgs) return; -// Log::log("analyseEqExpr 1\n"); + //Log::dumpWI(node, "EQ in ", wo); // PARM_DECL? Node *node1 = skipNop(node->args[0]); // INTEGER_CST? @@ -132,7 +132,6 @@ void analyseEqExpr(EqExprNode *node, const WalkItem &wi, WalkItem &wo) wi.checkNullVars.find(node1->label) != wi.checkNullVars.end() && node2->label == "0") { -// Log::log("analyseEqExpr 2\n"); wo.checkedNullVars.insert(node1->label); wo.cleanExpr = true; wo.uselessExpr = false; @@ -142,6 +141,7 @@ void analyseEqExpr(EqExprNode *node, const WalkItem &wi, WalkItem &wo) wo.cleanExpr = false; wo.uselessExpr = true; } + //Log::dumpWI(node, "EQ out ", wo); } void analyseTruthOrIfExpr(TruthOrIfExprNode *node, const WalkItem &wi, WalkItem &wo) @@ -158,9 +158,18 @@ void analyseTruthOrIfExpr(TruthOrIfExprNode *node, const WalkItem &wi, WalkItem //Log::dumpWI(node, "wo1 ", wo1); //Log::dumpWI(node, "wo2 ", wo2); if (wo1.cleanExpr) - mergeChecked(wo, wo1); + { + mergeNullChecked(wo, wo1); + //mergeNonNullChecked(wo, wo1); + } if (wo2.cleanExpr) - mergeChecked(wo, wo2); + { + mergeNullChecked(wo, wo2); + //mergeNonNullChecked(wo, wo2); + } + // need check for cleanExpr? + intersectNonNullChecked(wo, wo1, wo2); + wo.cleanExpr = false; wo.stopWalking = true; wo.uselessExpr = wo1.uselessExpr || wo2.uselessExpr; |