diff options
-rw-r--r-- | src/analysis/analysis.cpp | 18 | ||||
-rw-r--r-- | src/analysis/analysis.h | 2 | ||||
-rw-r--r-- | src/analysis/expression.cpp | 27 | ||||
-rw-r--r-- | src/analysis/statement.cpp | 8 |
4 files changed, 44 insertions, 11 deletions
diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp index 0deb2df..852eeb3 100644 --- a/src/analysis/analysis.cpp +++ b/src/analysis/analysis.cpp @@ -150,6 +150,24 @@ void mergeChecked(WalkItem &wi1, WalkItem &wi2) wi2.checkedNonNullVars.end()); } +void intersectChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2) +{ + FOR_EACH (std::set<std::string>::const_iterator, + it, + wi1.checkedNullVars) + { + if (wi2.checkedNullVars.find(*it) != wi2.checkedNullVars.end()) + wi.checkedNullVars.insert(*it); + } + FOR_EACH (std::set<std::string>::const_iterator, + it, + wi2.checkedNonNullVars) + { + if (wi2.checkedNonNullVars.find(*it) != wi2.checkedNonNullVars.end()) + wi.checkedNonNullVars.insert(*it); + } +} + void analyseNode(Node *node, const WalkItem &wi, WalkItem &wo) { if (!node) diff --git a/src/analysis/analysis.h b/src/analysis/analysis.h index 7215850..5911b50 100644 --- a/src/analysis/analysis.h +++ b/src/analysis/analysis.h @@ -44,6 +44,8 @@ namespace Analysis Node *skipNop(Node *node); void mergeChecked(WalkItem &wi1, WalkItem &wi2); + + void intersectChecked(WalkItem &wi, WalkItem &wi1, WalkItem &wi2); } #endif // ANALYSIS_ANALYSIS_H diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp index 69047aa..69c9f69 100644 --- a/src/analysis/expression.cpp +++ b/src/analysis/expression.cpp @@ -150,13 +150,13 @@ void analyseTruthOrIfExpr(TruthOrIfExprNode *node, const WalkItem &wi, WalkItem if (node->args.size() < 2 || command == FindArgs) return; -// Log::dumpWI(node, "wo ", wo); + //Log::dumpWI(node, "wo in ", wo); WalkItem wo1 = wo; WalkItem wo2 = wo; walkTree(node->args[0], wi, wo1); walkTree(node->args[1], wi, wo2); -// Log::dumpWI(node, "wo1 ", wo1); -// Log::dumpWI(node, "wo2 ", wo2); + //Log::dumpWI(node, "wo1 ", wo1); + //Log::dumpWI(node, "wo2 ", wo2); if (wo1.cleanExpr) mergeChecked(wo, wo1); if (wo2.cleanExpr) @@ -164,6 +164,7 @@ void analyseTruthOrIfExpr(TruthOrIfExprNode *node, const WalkItem &wi, WalkItem wo.cleanExpr = false; wo.stopWalking = true; wo.uselessExpr = wo1.uselessExpr || wo2.uselessExpr; + //Log::dumpWI(node, "wo out ", wo); } void analyseTruthAndIfExpr(TruthAndIfExprNode *node, const WalkItem &wi, WalkItem &wo) @@ -172,23 +173,33 @@ void analyseTruthAndIfExpr(TruthAndIfExprNode *node, const WalkItem &wi, WalkIte if (node->args.size() < 2 || command == FindArgs) return; -// Log::dumpWI(node, "wo ", wo); + //Log::dumpWI(node, "wo in ", 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); + //Log::dumpWI(node, "wo1 ", wo1); + //Log::dumpWI(node, "wo2 ", wo2); wo.stopWalking = true; if (!wo1.uselessExpr && !wo2.uselessExpr) { // need combine wo1 and wo2 // for now empty simple merge, but must be compilated! - mergeChecked(wo, wo1); - mergeChecked(wo, wo2); + if (wo1.checkedNullVars == wo2.checkedNullVars) + { + wo.checkedNullVars.insert(wo2.checkedNullVars.begin(), + wo2.checkedNullVars.end()); + } + if (wo1.checkedNonNullVars == wo2.checkedNonNullVars) + { + wo.checkedNonNullVars.insert(wo2.checkedNonNullVars.begin(), + wo2.checkedNonNullVars.end()); + } + //intersectChecked(wo, wo1, wo2); } wo.cleanExpr = false; wo.uselessExpr = wo1.uselessExpr || wo2.uselessExpr; + //Log::dumpWI(node, "wo out ", wo); } } diff --git a/src/analysis/statement.cpp b/src/analysis/statement.cpp index d050a62..d11c57b 100644 --- a/src/analysis/statement.cpp +++ b/src/analysis/statement.cpp @@ -52,7 +52,7 @@ void analyseIfStmt(IfStmtNode *node, const WalkItem &wi, WalkItem &wo) WalkItem wci = wi; WalkItem wco = wo; walkTree(condNode, wci, wco); -// Log::dumpWI(node, "wco ", wco); + //Log::dumpWI(node, "wco ", wco); WalkItem wi2 = wi; FOR_EACH (std::set<std::string>::const_iterator, @@ -78,7 +78,8 @@ void analyseIfStmt(IfStmtNode *node, const WalkItem &wi, WalkItem &wo) wo.removeNullVars.clear(); - if (returned) +// if (returned && wco.cleanExpr && !wco.uselessExpr) + if (returned && !wco.uselessExpr) { // add variable for ignore for all parent nodes except special like IF_STMT FOR_EACH (std::set<std::string>::const_iterator, @@ -89,7 +90,8 @@ void analyseIfStmt(IfStmtNode *node, const WalkItem &wi, WalkItem &wo) wo.checkNullVars.erase(*it); } } - if (wo.isReturned) +// if (wo.isReturned && wco.cleanExpr && !wco.uselessExpr) + if (wo.isReturned && !wco.uselessExpr) { // add variable for ignore for all parent nodes except special like IF_STMT FOR_EACH (std::set<std::string>::const_iterator, |