Internals: Move iterators to AstNVisitor to avoid null this.

This commit is contained in:
Wilson Snyder
2018-05-10 20:55:37 -04:00
parent 489f58011b
commit 05db8ce6c8
71 changed files with 1145 additions and 1099 deletions
+30 -30
View File
@@ -64,9 +64,9 @@ private:
virtual void visit(AstNodeAssign* nodep) {
//AstNode::user4ClearTree(); // Implied by AstUser4InUse
// LHS first as fewer varrefs
nodep->lhsp()->iterateAndNext(*this);
iterateAndNextNull(nodep->lhsp());
// Now find vars marked as lhs
nodep->rhsp()->iterateAndNext(*this);
iterateAndNextNull(nodep->rhsp());
}
virtual void visit(AstVarRef* nodep) {
// it's LHS var is used so need a deep temporary
@@ -80,7 +80,7 @@ private:
}
}
virtual void visit(AstNode* nodep) {
nodep->iterateChildren(*this);
iterateChildren(nodep);
}
public:
@@ -88,7 +88,7 @@ public:
explicit PremitAssignVisitor(AstNodeAssign* nodep) {
UINFO(4," PremitAssignVisitor on "<<nodep<<endl);
m_noopt = false;
nodep->accept(*this);
iterate(nodep);
}
virtual ~PremitAssignVisitor() {}
bool noOpt() const { return m_noopt; }
@@ -209,12 +209,12 @@ private:
UINFO(4," MOD "<<nodep<<endl);
m_modp = nodep;
m_funcp = NULL;
nodep->iterateChildren(*this);
iterateChildren(nodep);
m_modp = NULL;
}
virtual void visit(AstCFunc* nodep) {
m_funcp = nodep;
nodep->iterateChildren(*this);
iterateChildren(nodep);
m_funcp = NULL;
}
void startStatement(AstNode* nodep) {
@@ -224,14 +224,14 @@ private:
virtual void visit(AstWhile* nodep) {
UINFO(4," WHILE "<<nodep<<endl);
startStatement(nodep);
nodep->precondsp()->iterateAndNext(*this);
iterateAndNextNull(nodep->precondsp());
startStatement(nodep);
m_inWhilep = nodep;
nodep->condp()->iterateAndNext(*this);
iterateAndNextNull(nodep->condp());
m_inWhilep = NULL;
startStatement(nodep);
nodep->bodysp()->iterateAndNext(*this);
nodep->incsp()->iterateAndNext(*this);
iterateAndNextNull(nodep->bodysp());
iterateAndNextNull(nodep->incsp());
m_stmtp = NULL;
}
virtual void visit(AstNodeAssign* nodep) {
@@ -244,22 +244,22 @@ private:
createDeepTemp(nodep->rhsp(), false);
}
}
nodep->rhsp()->iterateAndNext(*this);
iterateAndNextNull(nodep->rhsp());
m_assignLhs = true;
nodep->lhsp()->iterateAndNext(*this);
iterateAndNextNull(nodep->lhsp());
m_assignLhs = false;
m_stmtp = NULL;
}
virtual void visit(AstNodeStmt* nodep) {
UINFO(4," STMT "<<nodep<<endl);
startStatement(nodep);
nodep->iterateChildren(*this);
iterateChildren(nodep);
m_stmtp = NULL;
}
virtual void visit(AstTraceInc* nodep) {
startStatement(nodep);
m_inTracep = nodep;
nodep->iterateChildren(*this);
iterateChildren(nodep);
m_inTracep = NULL;
m_stmtp = NULL;
}
@@ -308,7 +308,7 @@ private:
replaceHandle.relink(newp);
}
}
nodep->iterateChildren(*this); checkNode(nodep);
iterateChildren(nodep); checkNode(nodep);
}
virtual void visit(AstShiftL* nodep) {
visitShift(nodep);
@@ -321,43 +321,43 @@ private:
}
// Operators
virtual void visit(AstNodeTermop* nodep) {
nodep->iterateChildren(*this); checkNode(nodep);
iterateChildren(nodep); checkNode(nodep);
}
virtual void visit(AstNodeUniop* nodep) {
nodep->iterateChildren(*this); checkNode(nodep);
iterateChildren(nodep); checkNode(nodep);
}
virtual void visit(AstNodeBiop* nodep) {
nodep->iterateChildren(*this); checkNode(nodep);
iterateChildren(nodep); checkNode(nodep);
}
virtual void visit(AstUCFunc* nodep) {
nodep->iterateChildren(*this); checkNode(nodep);
iterateChildren(nodep); checkNode(nodep);
}
virtual void visit(AstSel* nodep) {
nodep->fromp()->iterateAndNext(*this);
iterateAndNextNull(nodep->fromp());
{ // Only the 'from' is part of the assignment LHS
bool prevAssign = m_assignLhs;
m_assignLhs = false;
nodep->lsbp()->iterateAndNext(*this);
nodep->widthp()->iterateAndNext(*this);
iterateAndNextNull(nodep->lsbp());
iterateAndNextNull(nodep->widthp());
m_assignLhs = prevAssign;
}
checkNode(nodep);
}
virtual void visit(AstArraySel* nodep) {
nodep->fromp()->iterateAndNext(*this);
iterateAndNextNull(nodep->fromp());
{ // Only the 'from' is part of the assignment LHS
bool prevAssign = m_assignLhs;
m_assignLhs = false;
nodep->bitp()->iterateAndNext(*this);
iterateAndNextNull(nodep->bitp());
m_assignLhs = prevAssign;
}
checkNode(nodep);
}
virtual void visit(AstConst* nodep) {
nodep->iterateChildren(*this); checkNode(nodep);
iterateChildren(nodep); checkNode(nodep);
}
virtual void visit(AstNodeCond* nodep) {
nodep->iterateChildren(*this);
iterateChildren(nodep);
if (nodep->expr1p()->isWide()
&& !VN_IS(nodep->condp(), Const)
&& !VN_IS(nodep->condp(), VarRef)) {
@@ -371,7 +371,7 @@ private:
// Autoflush
virtual void visit(AstDisplay* nodep) {
startStatement(nodep);
nodep->iterateChildren(*this);
iterateChildren(nodep);
m_stmtp = NULL;
if (v3Global.opt.autoflush()) {
AstNode* searchp = nodep->nextp();
@@ -388,7 +388,7 @@ private:
}
}
virtual void visit(AstSFormatF* nodep) {
nodep->iterateChildren(*this);
iterateChildren(nodep);
// Any strings sent to a display must be var of string data type,
// to avoid passing a pointer to a temporary.
for (AstNode* expp=nodep->exprsp(); expp; expp = expp->nextp()) {
@@ -403,7 +403,7 @@ private:
// Default: Just iterate
virtual void visit(AstVar* nodep) {} // Don't hit varrefs under vars
virtual void visit(AstNode* nodep) {
nodep->iterateChildren(*this);
iterateChildren(nodep);
}
public:
@@ -414,7 +414,7 @@ public:
m_stmtp = NULL;
m_inWhilep = NULL;
m_inTracep = NULL;
nodep->accept(*this);
iterate(nodep);
}
virtual ~PremitVisitor() {}
};