diff options
author | Andrei Karas <akaras@inbox.ru> | 2015-06-26 19:48:02 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2015-06-26 19:48:45 +0300 |
commit | fec7d220fe6981088659033a3678c93c0b85ee68 (patch) | |
tree | 8c4166b7d6939e66fb85e458083b3f20029d988a | |
parent | 2850bd01b539f9d64c1c487cf4c899e3b9b7f5a2 (diff) | |
download | paranucker-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.files | 1 | ||||
-rw-r--r-- | src/analysis/analysis.cpp | 15 | ||||
-rw-r--r-- | src/analysis/expression.cpp | 39 | ||||
-rw-r--r-- | src/analysis/function.cpp | 10 | ||||
-rw-r--r-- | src/analysis/ref.cpp | 2 | ||||
-rw-r--r-- | src/nodes/base/node.cpp | 30 | ||||
-rw-r--r-- | src/nodes/base/node.h | 4 | ||||
-rw-r--r-- | src/parsers/generic.cpp | 2 |
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)); |