Fix function locals in display %p
This commit is contained in:
parent
2efcfa567c
commit
af65a85a1e
|
|
@ -107,7 +107,7 @@ static void makeToStringMiddle(AstClass* nodep) {
|
||||||
funcp->isConst(true);
|
funcp->isConst(true);
|
||||||
funcp->isStatic(false);
|
funcp->isStatic(false);
|
||||||
funcp->protect(false);
|
funcp->protect(false);
|
||||||
funcp->addStmtsp(new AstCStmt{nodep->fileline(), "std::string out;"});
|
AstNodeStmt* stmtsp = nullptr;
|
||||||
std::string comma;
|
std::string comma;
|
||||||
for (AstNode* itemp = nodep->membersp(); itemp; itemp = itemp->nextp()) {
|
for (AstNode* itemp = nodep->membersp(); itemp; itemp = itemp->nextp()) {
|
||||||
if (const auto* const varp = VN_CAST(itemp, Var)) {
|
if (const auto* const varp = VN_CAST(itemp, Var)) {
|
||||||
|
|
@ -122,7 +122,7 @@ static void makeToStringMiddle(AstClass* nodep) {
|
||||||
stmt += V3Common::makeToStringCall(itemp->dtypep(), itemp->nameProtect());
|
stmt += V3Common::makeToStringCall(itemp->dtypep(), itemp->nameProtect());
|
||||||
stmt += ";";
|
stmt += ";";
|
||||||
nodep->user1(true); // So what we extend dumps this
|
nodep->user1(true); // So what we extend dumps this
|
||||||
funcp->addStmtsp(new AstCStmt{nodep->fileline(), stmt});
|
stmtsp = AstNode::addNextNull(stmtsp, new AstCStmt{nodep->fileline(), stmt});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -133,11 +133,18 @@ static void makeToStringMiddle(AstClass* nodep) {
|
||||||
stmt += EmitCUtil::prefixNameProtect(nodep->extendsp()->dtypep());
|
stmt += EmitCUtil::prefixNameProtect(nodep->extendsp()->dtypep());
|
||||||
stmt += "::to_string_middle();";
|
stmt += "::to_string_middle();";
|
||||||
nodep->user1(true); // So what we extend dumps this
|
nodep->user1(true); // So what we extend dumps this
|
||||||
funcp->addStmtsp(new AstCStmt{nodep->fileline(), stmt});
|
stmtsp = AstNode::addNextNull(stmtsp, new AstCStmt{nodep->fileline(), stmt});
|
||||||
}
|
}
|
||||||
|
|
||||||
AstCExpr* const exprp = new AstCExpr{nodep->fileline(), "out"};
|
AstNodeExpr* exprp;
|
||||||
exprp->dtypeSetString();
|
if (stmtsp) {
|
||||||
|
funcp->addStmtsp(new AstCStmt{nodep->fileline(), "std::string out;"});
|
||||||
|
funcp->addStmtsp(stmtsp);
|
||||||
|
exprp = new AstCExpr{nodep->fileline(), "out"};
|
||||||
|
exprp->dtypeSetString();
|
||||||
|
} else { // Nothing to print, return ""
|
||||||
|
exprp = new AstConst{nodep->fileline(), AstConst::String{}, ""};
|
||||||
|
}
|
||||||
funcp->addStmtsp(new AstCReturn{nodep->fileline(), exprp});
|
funcp->addStmtsp(new AstCReturn{nodep->fileline(), exprp});
|
||||||
|
|
||||||
nodep->addStmtsp(funcp);
|
nodep->addStmtsp(funcp);
|
||||||
|
|
|
||||||
|
|
@ -451,6 +451,7 @@ class TaskVisitor final : public VNVisitor {
|
||||||
= new AstVar{invarp->fileline(), VVarType::BLOCKTEMP, name, invarp};
|
= new AstVar{invarp->fileline(), VVarType::BLOCKTEMP, name, invarp};
|
||||||
newvarp->funcLocal(false);
|
newvarp->funcLocal(false);
|
||||||
newvarp->propagateAttrFrom(invarp);
|
newvarp->propagateAttrFrom(invarp);
|
||||||
|
newvarp->isInternal(true);
|
||||||
m_modp->addStmtsp(newvarp);
|
m_modp->addStmtsp(newvarp);
|
||||||
AstVarScope* const newvscp = new AstVarScope{newvarp->fileline(), m_scopep, newvarp};
|
AstVarScope* const newvscp = new AstVarScope{newvarp->fileline(), m_scopep, newvarp};
|
||||||
m_scopep->addVarsp(newvscp);
|
m_scopep->addVarsp(newvscp);
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,14 @@ endclass
|
||||||
|
|
||||||
class Base;
|
class Base;
|
||||||
int m_in_base;
|
int m_in_base;
|
||||||
|
virtual function string fs(input string add = "default");
|
||||||
|
static string s_f = "foo";
|
||||||
|
fs = {s_f, add};
|
||||||
|
endfunction
|
||||||
|
virtual function string other(input string add = "default");
|
||||||
|
string other = "other";
|
||||||
|
other = {other, fs(add)};
|
||||||
|
endfunction
|
||||||
endclass
|
endclass
|
||||||
|
|
||||||
class ClsA extends Base;
|
class ClsA extends Base;
|
||||||
|
|
@ -54,8 +62,11 @@ module t;
|
||||||
c.debug();
|
c.debug();
|
||||||
|
|
||||||
ca = new;
|
ca = new;
|
||||||
$display("'%p'", ca);
|
if (ca.fs("-s") !== "foo-s") $stop; // So not optimized away
|
||||||
|
if (ca.other("-o") !== "otherfoo-o") $stop; // So not optimized away
|
||||||
|
|
||||||
cb = new;
|
cb = new;
|
||||||
|
$display("'%p'", ca);
|
||||||
ca.m_b = cb;
|
ca.m_b = cb;
|
||||||
$display("'%p'", ca);
|
$display("'%p'", ca);
|
||||||
cb.m_a = ca; // Circular
|
cb.m_a = ca; // Circular
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue