void Construct::dumpNode(int spc) { int nkid = getKidCount(); const char* name = nullptr; int type = 0; std::string scontext; std::string value; std::string type_info; int ef = 0; if (isStatement()) { Statement *s = static_cast<Statement*>(this); auto stype = s->getKindOf(); name = Statement::nameOfKind(stype); value = s->getName(); type = (int)stype; } else { assert(isExpression()); Expression *e = static_cast<Expression*>(this); ef = e->getLocalEffects(); Expression::KindOf etype = e->getKindOf(); name = Expression::nameOfKind(etype); switch (etype) { case Expression::KindOfSimpleFunctionCall: value = static_cast<SimpleFunctionCall*>(e)->getFullName(); break; case Expression::KindOfSimpleVariable: value = static_cast<SimpleVariable*>(e)->getName(); break; case Expression::KindOfConstantExpression: value = e->getText(); break; case Expression::KindOfScalarExpression: value = e->getText(); break; default: break; } int c = e->getContext(); if ((c & Expression::Declaration) == Expression::Declaration) { scontext += "|Declaration"; } else if (c & Expression::LValue) { scontext += "|LValue"; } if (c & Expression::NoLValueWrapper) { scontext += "|NoLValueWrapper"; } if (c & Expression::RefValue) { scontext += "|RefValue"; } if (c & Expression::RefParameter) { scontext += "|RefParameter"; } if (c & Expression::DeepReference) { scontext += "|DeepReference"; } if (c & Expression::ObjectContext) { scontext += "|ObjectContext"; } if (c & Expression::InParameterExpression) { scontext += "|InParameterExpression"; } if (c & Expression::ExistContext) { scontext += "|ExistContext"; } if (c & Expression::UnsetContext) { scontext += "|UnsetContext"; } if (c & Expression::AssignmentLHS) { scontext += "|AssignmentLHS"; } if (c & Expression::RefAssignmentLHS) { scontext += "|RefAssignmentLHS"; } if (c & Expression::DeepAssignmentLHS) { scontext += "|DeepAssignmentLHS"; } if (c & Expression::AssignmentRHS) { scontext += "|AssignmentRHS"; } if (c & Expression::InvokeArgument) { scontext += "|InvokeArgument"; } if (c & Expression::OprLValue) { scontext += "|OprLValue"; } if (c & Expression::DeepOprLValue) { scontext += "|DeepOprLValue"; } if (c & Expression::AccessContext) { scontext += "|AccessContext"; } if (c & Expression::ReturnContext) { scontext += "|ReturnContext"; } if (scontext != "") { scontext = " (" + scontext.substr(1) + ")"; } type = (int)etype; } int s = spc; while (s > 0) { int n = s > 10 ? 10 : s; std::cout << (" "+10-n); s -= n; } std::cout << "-> 0x" << std::hex << std::setfill('0') << std::setw(10) << (int64_t)this << std::dec; std::cout << " " << name << "(" << type << ") "; if (value != "") { std::cout << "[" << value << "] "; } std::string sef; if ((ef & UnknownEffect) == UnknownEffect) { sef = "|UnknownEffect"; } else { if (ef & IOEffect) sef += "|IOEffect"; if (ef & AssignEffect) sef += "|AssignEffect"; if (ef & GlobalEffect) sef += "|GlobalEffect"; if (ef & LocalEffect) sef += "|LocalEffect"; if (ef & ParamEffect) sef += "|ParamEffect"; if (ef & DeepParamEffect) sef += "|DeepParamEffect"; if (ef & DynamicParamEffect) sef += "|DynamicParamEffect"; if (ef & CanThrow) sef += "|CanThrow"; if (ef & AccessorEffect) sef += "|AccessorEffect"; if (ef & CreateEffect) sef += "|CreateEffect"; if (ef & DiagnosticEffect) sef += "|DiagnosticEffect"; if (ef & OtherEffect) sef += "|OtherEffect"; } if (sef != "") { sef = " (" + sef.substr(1) + ")"; } std::string objstr; if (dynamic_cast<SimpleVariable*>(this) != nullptr) { objstr = " (NoObjInfo)"; } std::cout << nkid << scontext << sef << objstr; if (auto scope = getFileScope()) { std::cout << " " << scope->getName() << ":" << "[" << m_r.line0 << "@" << m_r.char0 << ", " << m_r.line1 << "@" << m_r.char1 << "]"; } std::cout << "\n"; }
/** * Create an expression statement corresponding to a single expression, * using that expression's context as our own. */ StmtExpr(Expression *expr) : Statement(expr->getContext()), expr(expr) { }