diff options
-rw-r--r-- | src/analysis/analysis.cpp | 6 | ||||
-rw-r--r-- | src/analysis/statement.cpp | 13 | ||||
-rw-r--r-- | src/analysis/walkitem.h | 2 | ||||
-rw-r--r-- | src/logger.cpp | 24 | ||||
-rw-r--r-- | src/logger.h | 2 |
5 files changed, 46 insertions, 1 deletions
diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp index d4d0917..9a890dd 100644 --- a/src/analysis/analysis.cpp +++ b/src/analysis/analysis.cpp @@ -75,7 +75,9 @@ void walkTree(Node *node, const WalkItem &wi, WalkItem &wo) WalkItem wi2 = wi; analyseNode(node, wi2, wo); removeCheckNullVars(wi2); +// Log::dumpAttr(node, 1, wo.isReturned); + const bool isReturned = wo.isReturned; if (wo.stopWalking) { wo.stopWalking = false; @@ -87,9 +89,13 @@ void walkTree(Node *node, const WalkItem &wi, WalkItem &wo) { walkTree(*it, wi2, wo2); wi2.removeNullVars = wo2.removeNullVars; + wi2.isReturned = wi2.isReturned || wo2.isReturned; wo2.stopWalking = false; } wo.removeNullVars = wi2.removeNullVars; + wo.isReturned = wo.isReturned || isReturned || wo2.isReturned; + +// Log::dumpAttr(node, 2, wo.isReturned); } int findBackLocation(Node *node) diff --git a/src/analysis/statement.cpp b/src/analysis/statement.cpp index 7a5c467..394dcfe 100644 --- a/src/analysis/statement.cpp +++ b/src/analysis/statement.cpp @@ -73,6 +73,8 @@ void analyseIfStmt(IfStmtNode *node, const WalkItem &wi, WalkItem &wo) walkTree(node->thenNode, wi2, wo); wo.removeNullVars.clear(); const bool returned = wo.isReturned; +// if (wo.isReturned) +// Log::log("wo.isReturned 1\n"); // From else branch remove variable what we just found. wi2 = wi; @@ -80,6 +82,9 @@ void analyseIfStmt(IfStmtNode *node, const WalkItem &wi, WalkItem &wo) walkTree(node->elseNode, wi2, wo); wo.removeNullVars.clear(); wo.stopWalking = true; +// if (wo.isReturned) +// Log::log("wo.isReturned 2\n"); + wo.isReturned = false; if (returned) { @@ -117,10 +122,14 @@ void analyseIfStmt(IfStmtNode *node, const WalkItem &wi, WalkItem &wo) wi2.checkNullVars.erase(node1->label); // From then branch remove variable what we just found. walkTree(node->thenNode, wi2, wo); +// if (wo.isReturned) +// Log::log("wo.isReturned 3\n"); wo.removeNullVars.clear(); wi2 = wi; // walking else node with all variables walkTree(node->elseNode, wi2, wo); +// if (wo.isReturned) +// Log::log("wo.isReturned 4\n"); wo.removeNullVars.clear(); wo.stopWalking = true; @@ -131,6 +140,7 @@ void analyseIfStmt(IfStmtNode *node, const WalkItem &wi, WalkItem &wo) wo.removeNullVars.insert(node1->label); wo.checkNullVars.erase(node1->label); } + wo.isReturned = false; return; } } @@ -139,6 +149,9 @@ void analyseIfStmt(IfStmtNode *node, const WalkItem &wi, WalkItem &wo) walkTree(node->thenNode, wi, wo); walkTree(node->elseNode, wi, wo); wo.removeNullVars.clear(); +// if (wo.isReturned) +// Log::log("wo.isReturned 5\n"); + wo.isReturned = false; wo.stopWalking = true; } diff --git a/src/analysis/walkitem.h b/src/analysis/walkitem.h index 7e06d38..04e14b9 100644 --- a/src/analysis/walkitem.h +++ b/src/analysis/walkitem.h @@ -29,7 +29,7 @@ struct WalkItem checkNullVars(), removeNullVars(), stopWalking(false), - isReturned(true) + isReturned(false) { } diff --git a/src/logger.cpp b/src/logger.cpp index 64a8ac2..1203c78 100644 --- a/src/logger.cpp +++ b/src/logger.cpp @@ -164,6 +164,30 @@ void dump(const Node *const node) fprintf(stderr, "\n"); } +void dumpAttr(const Node *const node, int num, bool isReturned) +{ + if (!node) + { + fprintf(stderr, "node is null\n"); + return; + } + fprintf(stderr, "%s", node->getIndent().c_str()); + fprintf(stderr, "%s", node->nodeTypeName.c_str()); + if (!node->label.empty()) + fprintf(stderr, " %s", node->label.c_str()); + if (!node->file.empty()) + { + fprintf(stderr, " %s %d:%d", + node->file.c_str(), + node->line, + node->column); + } + if (!node->tag.empty()) + fprintf(stderr, " - %s", node->tag.c_str()); + + fprintf(stderr, " walkTree%d: %d\n", num, isReturned ? 1 : 0); +} + void warn(const int loc, const std::string &message, const std::string ¶m) diff --git a/src/logger.h b/src/logger.h index 815ece5..8fca641 100644 --- a/src/logger.h +++ b/src/logger.h @@ -54,6 +54,8 @@ namespace Log void warn(const int loc, const std::string &message, const std::string ¶m); + + void dumpAttr(const Node *const node, int num, bool isReturned); } #endif // LOGGER_H |