summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-06-18 00:07:12 +0300
committerAndrei Karas <akaras@inbox.ru>2015-06-18 00:07:12 +0300
commitca7fb26da9b7c4d3d32ebd7739b937ccf591167b (patch)
treedf8c2899261734cf85c68cb4201cebadab633723
parentada4bce8b0199d2f5c42a64f391ccab441ec6429 (diff)
downloadparanucker-ca7fb26da9b7c4d3d32ebd7739b937ccf591167b.tar.gz
paranucker-ca7fb26da9b7c4d3d32ebd7739b937ccf591167b.tar.bz2
paranucker-ca7fb26da9b7c4d3d32ebd7739b937ccf591167b.tar.xz
paranucker-ca7fb26da9b7c4d3d32ebd7739b937ccf591167b.zip
Add support for checking is return present inside if statement.
-rw-r--r--src/analysis/analysis.cpp6
-rw-r--r--src/analysis/statement.cpp13
-rw-r--r--src/analysis/walkitem.h2
-rw-r--r--src/logger.cpp24
-rw-r--r--src/logger.h2
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 &param)
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 &param);
+
+ void dumpAttr(const Node *const node, int num, bool isReturned);
}
#endif // LOGGER_H