diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-06-18 00:07:12 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-06-18 00:07:12 +0300 |
commit | ca7fb26da9b7c4d3d32ebd7739b937ccf591167b (patch) | |
tree | df8c2899261734cf85c68cb4201cebadab633723 /src/analysis | |
parent | ada4bce8b0199d2f5c42a64f391ccab441ec6429 (diff) | |
download | paranucker-ca7fb26da9b7c4d3d32ebd7739b937ccf591167b.tar.gz paranucker-ca7fb26da9b7c4d3d32ebd7739b937ccf591167b.tar.bz2 paranucker-ca7fb26da9b7c4d3d32ebd7739b937ccf591167b.tar.xz paranucker-ca7fb26da9b7c4d3d32ebd7739b937ccf591167b.zip |
Add support for checking is return present inside if statement.
Diffstat (limited to 'src/analysis')
-rw-r--r-- | src/analysis/analysis.cpp | 6 | ||||
-rw-r--r-- | src/analysis/statement.cpp | 13 | ||||
-rw-r--r-- | src/analysis/walkitem.h | 2 |
3 files changed, 20 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) { } |