summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-06-26 19:48:02 +0300
committerAndrei Karas <akaras@inbox.ru>2015-06-26 19:48:45 +0300
commitfec7d220fe6981088659033a3678c93c0b85ee68 (patch)
tree8c4166b7d6939e66fb85e458083b3f20029d988a
parent2850bd01b539f9d64c1c487cf4c899e3b9b7f5a2 (diff)
downloadparanucker-fec7d220fe6981088659033a3678c93c0b85ee68.tar.gz
paranucker-fec7d220fe6981088659033a3678c93c0b85ee68.tar.bz2
paranucker-fec7d220fe6981088659033a3678c93c0b85ee68.tar.xz
paranucker-fec7d220fe6981088659033a3678c93c0b85ee68.zip
Overload compare operators between pointer to Node and tree_code.
-rw-r--r--src/Makefile.files1
-rw-r--r--src/analysis/analysis.cpp15
-rw-r--r--src/analysis/expression.cpp39
-rw-r--r--src/analysis/function.cpp10
-rw-r--r--src/analysis/ref.cpp2
-rw-r--r--src/nodes/base/node.cpp30
-rw-r--r--src/nodes/base/node.h4
-rw-r--r--src/parsers/generic.cpp2
8 files changed, 63 insertions, 40 deletions
diff --git a/src/Makefile.files b/src/Makefile.files
index c95e6e5..2fdbed4 100644
--- a/src/Makefile.files
+++ b/src/Makefile.files
@@ -14,6 +14,7 @@ SRC = analysis/analysis.cpp \
nodes/base/cst.h \
nodes/base/decl.h \
nodes/base/expr.h \
+ nodes/base/node.cpp \
nodes/base/node.h \
nodes/base/ref.h \
nodes/base/stmt.h \
diff --git a/src/analysis/analysis.cpp b/src/analysis/analysis.cpp
index 024abc4..23df042 100644
--- a/src/analysis/analysis.cpp
+++ b/src/analysis/analysis.cpp
@@ -208,7 +208,7 @@ bool checkForReport(Node *node,
{
node = skipNop(node);
return node &&
- (node->nodeType == PARM_DECL || node->nodeType == VAR_DECL) &&
+ (node == PARM_DECL || node == VAR_DECL) &&
wi.checkNullVars.find(node->label) != wi.checkNullVars.end();
}
@@ -221,7 +221,7 @@ void reportParmDeclNullPointer(Node *mainNode,
{
if (!node->label.empty())
{
- if (node->nodeType == PARM_DECL)
+ if (node == PARM_DECL)
{
if (wi.checkNullVars.find(node->label) != wi.checkNullVars.end())
{
@@ -230,7 +230,7 @@ void reportParmDeclNullPointer(Node *mainNode,
node->label);
}
}
- else if (node->nodeType == VAR_DECL)
+ else if (node == VAR_DECL)
{
if (wi.checkNullVars.find(node->label) != wi.checkNullVars.end())
{
@@ -240,7 +240,7 @@ void reportParmDeclNullPointer(Node *mainNode,
}
}
}
- else if (node->nodeType == COMPONENT_REF)
+ else if (node == COMPONENT_REF)
{
std::string var = getComponentRefVariable(node);
if (wi.checkNullVars.find(var) != wi.checkNullVars.end())
@@ -256,8 +256,7 @@ void reportParmDeclNullPointer(Node *mainNode,
Node *skipNop(Node *node)
{
while (node &&
- (node->nodeType == NOP_EXPR ||
- node->nodeType == NON_LVALUE_EXPR))
+ (node == NOP_EXPR || node == NON_LVALUE_EXPR))
{
NopExprNode *nop = static_cast<NopExprNode*>(node);
if (nop && !nop->args.empty())
@@ -270,7 +269,7 @@ Node *skipNop(Node *node)
Node *skipBackNop(Node *node)
{
- while (node && node->nodeType == NOP_EXPR)
+ while (node && node == NOP_EXPR)
{
node = node->parent;
}
@@ -339,7 +338,7 @@ void analyseNode(Node *node, const WalkItem &wi, WalkItem &wo)
// remove check for vars what was requested from some childs.
// Except IF_STMT. Removing handled inside analyse function.
- if (node->nodeType != IF_STMT)
+ if (node != IF_STMT)
{
removeCheckNullVars(wi2);
// addCheckNullVars(wi2);
diff --git a/src/analysis/expression.cpp b/src/analysis/expression.cpp
index 0fa56a7..6c9b115 100644
--- a/src/analysis/expression.cpp
+++ b/src/analysis/expression.cpp
@@ -68,9 +68,9 @@ std::string getVariableName(Node *node)
if (!node)
return "";
- if (node->nodeType == PARM_DECL || node->nodeType == VAR_DECL)
+ if (node == PARM_DECL || node == VAR_DECL)
return node->label;
- else if (node->nodeType == COMPONENT_REF)
+ else if (node == COMPONENT_REF)
return getComponentRefVariable(node);
return "";
}
@@ -84,14 +84,12 @@ std::string getComponentRefVariable(Node *node)
{
Node *object = skipNop(comp->object);
Node *field = skipNop(comp->field);
- if (object &&
- field &&
- object->nodeType == INDIRECT_REF &&
- field->nodeType == FIELD_DECL)
+ if (object == INDIRECT_REF &&
+ field == FIELD_DECL)
{
IndirectRefNode *indirect = static_cast<IndirectRefNode*>(object);
Node *ref = skipNop(indirect->ref);
- if (ref && ref->nodeType == PARM_DECL)
+ if (ref == PARM_DECL)
{
str.append(ref->label).append("->").append(field->label);
}
@@ -109,13 +107,13 @@ void analyseModifyExpr(ModifyExprNode *node, const WalkItem &wi, WalkItem &wo)
Node *arg = skipNop(node->args[0]);
if (arg)
{
- if (arg->nodeType == INDIRECT_REF)
+ if (arg == INDIRECT_REF)
{
reportParmDeclNullPointer(node,
static_cast<IndirectRefNode*>(arg)->ref,
wi);
}
- else if (arg->nodeType == COMPONENT_REF && node->args.size() > 1)
+ else if (arg == COMPONENT_REF && node->args.size() > 1)
{
std::string var1 = getComponentRefVariable(arg);
std::string var2 = getVariableName(node->args[1]);
@@ -151,12 +149,12 @@ void analyseAddrExpr(AddrExprNode *node,
Node *node2 = skipBackNop(node->parent);
if (node2)
{
- while (node2 && node2->nodeType == ADDR_EXPR)
+ while (node2 == ADDR_EXPR)
{
node2 = skipBackNop(node2->parent);
}
// found what some parent is function or method call
- if (node2 && node2->nodeType == CALL_EXPR)
+ if (node2 == CALL_EXPR)
{
return;
}
@@ -187,8 +185,7 @@ void analyseNeExpr(NeExprNode *node, const WalkItem &wi, WalkItem &wo)
std::string var = getVariableName(node1);
// if (var != 0)
if (!var.empty() &&
- node2 &&
- node2->nodeType == INTEGER_CST &&
+ node2 == INTEGER_CST &&
wi.checkNullVars.find(var) != wi.checkNullVars.end() &&
node2->label == "0")
{
@@ -218,8 +215,7 @@ void analyseEqExpr(EqExprNode *node, const WalkItem &wi, WalkItem &wo)
std::string var = getVariableName(node1);
// if (var == 0)
if (!var.empty() &&
- node2 &&
- node2->nodeType == INTEGER_CST &&
+ node2 == INTEGER_CST &&
wi.checkNullVars.find(var) != wi.checkNullVars.end() &&
node2->label == "0")
{
@@ -408,8 +404,7 @@ void analyseBindExpr(BindExprNode *node, const WalkItem &wi, WalkItem &wo)
}
Node *node1 = skipNop(node->args[0]);
- if (node1 &&
- node1->nodeType == VAR_DECL)
+ if (node1 == VAR_DECL)
{
VarDeclNode *varDecl = static_cast<VarDeclNode*>(node1);
Node *initial = skipNop(varDecl->initial);
@@ -432,8 +427,7 @@ void analyseDeclExpr(DeclExprNode *node, const WalkItem &wi, WalkItem &wo)
Node *node1 = skipNop(node->args[0]);
- if (node1 &&
- node1->nodeType == VAR_DECL)
+ if (node1 == VAR_DECL)
{
VarDeclNode *varDecl = static_cast<VarDeclNode*>(node1);
Node *initial = skipNop(varDecl->initial);
@@ -477,17 +471,16 @@ void analyseCallExpr(CallExprNode *node, const WalkItem &wi, WalkItem &wo)
{
walkTree(node->function, wi, wo2);
Log::dumpWI(node, "wo function ", wo2);
- if (node->function->nodeType == ADDR_EXPR)
+ if (node->function == ADDR_EXPR)
{
AddrExprNode *addrNode = static_cast<AddrExprNode*>(node->function);
if (!addrNode->args.empty())
{
- if (addrNode->args[0]->nodeType == FUNCTION_DECL)
+ if (addrNode->args[0] == FUNCTION_DECL)
{
FunctionDeclNode *declNode = static_cast<FunctionDeclNode*>(
addrNode->args[0]);
- if (declNode->functionType &&
- declNode->functionType->nodeType == FUNCTION_TYPE)
+ if (declNode->functionType == FUNCTION_TYPE)
{
enableCheck = false;
}
diff --git a/src/analysis/function.cpp b/src/analysis/function.cpp
index 156534e..df911ae 100644
--- a/src/analysis/function.cpp
+++ b/src/analysis/function.cpp
@@ -42,14 +42,10 @@ namespace Analysis
void getFunctionArgTypes(FunctionDeclNode *node,
std::vector<TypeNode*> &arr)
{
- // function not have type
- if (!node->functionType)
- return;
-
TreeListNode *types = nullptr;
- if (node->functionType->nodeType == FUNCTION_TYPE)
+ if (node->functionType == FUNCTION_TYPE)
types = static_cast<FunctionTypeNode*>(node->functionType)->argTypes;
- else if (node->functionType->nodeType == METHOD_TYPE)
+ else if (node->functionType == METHOD_TYPE)
types = static_cast<MethodTypeNode*>(node->functionType)->argTypes;
else
return;
@@ -125,7 +121,7 @@ void analyseFunction(FunctionDeclNode *node, const WalkItem &wi, WalkItem &wo)
for (size_t f = 0; f < sz; f ++)
{
const TypeNode *const type = types[f];
- if (!type || type->nodeType != POINTER_TYPE)
+ if (!type || type != POINTER_TYPE)
continue;
const ParmDeclNode *const name = node->args[f];
if (f == 0 && name->label == "this")
diff --git a/src/analysis/ref.cpp b/src/analysis/ref.cpp
index f59bce8..b638c53 100644
--- a/src/analysis/ref.cpp
+++ b/src/analysis/ref.cpp
@@ -48,7 +48,7 @@ void analyseComponentRef(ComponentRefNode *node,
return;
Node *arg = skipNop(node->object);
- if (arg && arg->nodeType == INDIRECT_REF)
+ if (arg == INDIRECT_REF)
{
reportParmDeclNullPointer(node,
static_cast<IndirectRefNode*>(arg)->ref,
diff --git a/src/nodes/base/node.cpp b/src/nodes/base/node.cpp
new file mode 100644
index 0000000..b26dfb1
--- /dev/null
+++ b/src/nodes/base/node.cpp
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2015 Andrei Karas
+ *
+ * This file is part of AstDumper.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "nodes/base/node.h"
+
+bool operator ==(const Node *const node, const tree_code &code)
+{
+ return node && node->nodeType == code;
+}
+
+bool operator !=(const Node *const node, const tree_code &code)
+{
+ return !node || node->nodeType != code;
+}
diff --git a/src/nodes/base/node.h b/src/nodes/base/node.h
index e8d89ce..83b4314 100644
--- a/src/nodes/base/node.h
+++ b/src/nodes/base/node.h
@@ -80,4 +80,8 @@ struct Node
bool complete;
};
+bool operator ==(const Node *const node, const tree_code &code);
+
+bool operator !=(const Node *const node, const tree_code &code);
+
#endif // NODES_BASE_NODE_H
diff --git a/src/parsers/generic.cpp b/src/parsers/generic.cpp
index a6308b3..731732e 100644
--- a/src/parsers/generic.cpp
+++ b/src/parsers/generic.cpp
@@ -163,7 +163,7 @@ void updateNodes()
{
Node *node1 = (*it).first;
Node *node2 = (*it).second;
- if (node1->nodeType == VAR_DECL)
+ if (node1 == VAR_DECL)
{
parseVarDeclNode(static_cast<VarDeclNode*>(node1),
static_cast<VarDeclNode*>(node2));