From 7a04a5b9a8d8cece01ea934625eb556ac00d197a Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Sat, 30 Nov 2024 22:55:16 -0500 Subject: [PATCH] Internals: Refactor symIterate functions. No functional change intended --- src/V3LinkDot.cpp | 82 ++++++++++++++++++++++------------------------- 1 file changed, 39 insertions(+), 43 deletions(-) diff --git a/src/V3LinkDot.cpp b/src/V3LinkDot.cpp index 95a200463..bde24b439 100644 --- a/src/V3LinkDot.cpp +++ b/src/V3LinkDot.cpp @@ -2448,17 +2448,32 @@ class LinkDotResolveVisitor final : public VNVisitor { // A class reference might be to a class that is later in Ast due to // e.g. parmaeterization or referring to a "class (type T) extends T" // Resolve it so later Class:: references into its base classes work - VL_RESTORER(m_ds); - VSymEnt* const srcp = m_statep->getNodeSym(nodep); - m_ds.init(srcp); - iterate(nodep); + symIterateNull(nodep, m_statep->getNodeSym(nodep)); } + void updateVarUse(AstVar* nodep) { // Avoid dotted.PARAM false positive when in a parameter block // that is if ()'ed off by same dotted name as another block if (nodep && nodep->isParam()) nodep->usedParam(true); } + void symIterateChildren(AstNode* nodep, VSymEnt* symp) { + // Iterate children, changing to given context, with restore to old context + VL_RESTORER(m_ds); + VL_RESTORER(m_curSymp); + m_curSymp = symp; + m_ds.init(m_curSymp); + iterateChildren(nodep); + } + void symIterateNull(AstNode* nodep, VSymEnt* symp) { + // Iterate node, changing to given context, with restore to old context + VL_RESTORER(m_ds); + VL_RESTORER(m_curSymp); + m_curSymp = symp; + m_ds.init(m_curSymp); + iterateNull(nodep); + } + #define LINKDOT_VISIT_START() \ VL_RESTORER(m_indent); \ ++m_indent; @@ -2494,14 +2509,12 @@ class LinkDotResolveVisitor final : public VNVisitor { void visit(AstScope* nodep) override { LINKDOT_VISIT_START(); UINFO(8, indent() << "visit " << nodep << endl); + checkNoDot(nodep); VL_RESTORER(m_modSymp); VL_RESTORER(m_curSymp); - { - checkNoDot(nodep); - m_ds.m_dotSymp = m_curSymp = m_modSymp = m_statep->getScopeSym(nodep); - iterateChildren(nodep); - m_ds.m_dotSymp = m_curSymp = m_modSymp = nullptr; - } + m_ds.m_dotSymp = m_curSymp = m_modSymp = m_statep->getScopeSym(nodep); + iterateChildren(nodep); + m_ds.m_dotSymp = m_curSymp = m_modSymp = nullptr; } void visit(AstCellInline* nodep) override { LINKDOT_VISIT_START(); @@ -2670,6 +2683,8 @@ class LinkDotResolveVisitor final : public VNVisitor { } else { if (m_statep->forPrimary() && m_extendsParam.find(classp) != m_extendsParam.end()) { + UINFO(9, indent() << "deferring until post-V3Param: " << nodep->lhsp() + << endl); m_ds.m_unresolvedClass = true; } else { const auto baseClassp = cextp->classp(); @@ -2696,6 +2711,7 @@ class LinkDotResolveVisitor final : public VNVisitor { } if (m_statep->forPrimary() && isParamedClassRef(nodep->lhsp())) { // Dots of paramed classes will be linked after deparameterization + UINFO(9, indent() << "deferring until post-V3Param: " << nodep->lhsp() << endl); m_ds.m_unresolvedClass = true; } if (m_ds.m_unresolvedCell @@ -3024,6 +3040,8 @@ class LinkDotResolveVisitor final : public VNVisitor { refp->dotted(dotted.substr(0, pos)); newp = refp; } else { + UINFO(9, indent() + << "deferring until post-V3Param: " << refp << endl); newp = new AstUnlinkedRef{nodep->fileline(), refp, refp->name(), m_ds.m_unlinkedScopep->unlinkFrBack()}; m_ds.m_unlinkedScopep = nullptr; @@ -3475,9 +3493,7 @@ class LinkDotResolveVisitor final : public VNVisitor { if (m_ds.m_dotPos != DP_MEMBER || nodep->name() != "randomize") { // Visit arguments at the beginning. // They may be visitted even if the current node can't be linked now. - VL_RESTORER(m_ds); - m_ds.init(m_curSymp); - iterateChildren(nodep); + symIterateChildren(nodep, m_curSymp); } if (m_ds.m_super) { @@ -3732,16 +3748,10 @@ class LinkDotResolveVisitor final : public VNVisitor { m_ds.m_unresolvedCell = true; // And pass up m_ds.m_dotText } - // Pass dot state down to fromp() + // Pass dot state down to only fromp() iterateAndNextNull(nodep->fromp()); - { - VL_RESTORER(m_ds); - { - m_ds.init(m_curSymp); - iterateAndNextNull(nodep->bitp()); - iterateAndNextNull(nodep->attrp()); - } - } + symIterateNull(nodep->bitp(), m_curSymp); + symIterateNull(nodep->attrp(), m_curSymp); if (m_ds.m_unresolvedCell && (m_ds.m_dotPos == DP_SCOPE || m_ds.m_dotPos == DP_FIRST)) { AstNodeExpr* const exprp = nodep->bitp()->unlinkFrBack(); AstCellArrayRef* const newp @@ -3763,12 +3773,8 @@ class LinkDotResolveVisitor final : public VNVisitor { return; } iterateAndNextNull(nodep->fromp()); - VL_RESTORER(m_ds); - { - m_ds.init(m_curSymp); - iterateAndNextNull(nodep->rhsp()); - iterateAndNextNull(nodep->thsp()); - } + symIterateNull(nodep->rhsp(), m_curSymp); + symIterateNull(nodep->thsp(), m_curSymp); if (nodep->attrp()) { AstNode* const attrp = nodep->attrp()->unlinkFrBack(); @@ -3792,15 +3798,15 @@ class LinkDotResolveVisitor final : public VNVisitor { LINKDOT_VISIT_START(); UINFO(5, indent() << "visit " << nodep << endl); checkNoDot(nodep); - VL_RESTORER(m_curSymp); { + VL_RESTORER(m_curSymp); + VL_RESTORER(m_ds); if (nodep->name() != "") { m_ds.m_dotSymp = m_curSymp = m_statep->getNodeSym(nodep); UINFO(5, indent() << "cur=se" << cvtToHex(m_curSymp) << endl); } iterateChildren(nodep); } - m_ds.m_dotSymp = VL_RESTORER_PREV(m_curSymp); UINFO(5, indent() << "cur=se" << cvtToHex(m_curSymp) << endl); } void visit(AstNodeFTask* nodep) override { @@ -3849,25 +3855,15 @@ class LinkDotResolveVisitor final : public VNVisitor { LINKDOT_VISIT_START(); UINFO(5, indent() << "visit " << nodep << endl); checkNoDot(nodep); - VL_RESTORER(m_curSymp); - { - m_ds.m_dotSymp = m_curSymp = m_statep->getNodeSym(nodep); - iterateChildren(nodep); - } - m_ds.m_dotSymp = VL_RESTORER_PREV(m_curSymp); + symIterateChildren(nodep, m_statep->getNodeSym(nodep)); } void visit(AstWith* nodep) override { LINKDOT_VISIT_START(); UINFO(5, indent() << "visit " << nodep << endl); checkNoDot(nodep); - VL_RESTORER(m_curSymp); VL_RESTORER(m_inWith); - { - m_ds.m_dotSymp = m_curSymp = m_statep->getNodeSym(nodep); - m_inWith = true; - iterateChildren(nodep); - } - m_ds.m_dotSymp = VL_RESTORER_PREV(m_curSymp); + m_inWith = true; + symIterateChildren(nodep, m_statep->getNodeSym(nodep)); } void visit(AstLambdaArgRef* nodep) override { LINKDOT_VISIT_START();