}
}
- void visit(Struct *s) {
- const char *sep = "";
- os << "{";
+ const char *
+ visitMembers(Struct *s, const char *sep = "") {
for (unsigned i = 0; i < s->members.size(); ++i) {
- os << sep << italic << s->sig->member_names[i] << normal << " = ";
- _visit(s->members[i]);
+ const char *memberName = s->sig->member_names[i];
+ Value *memberValue = s->members[i];
+
+ if (!memberName || !*memberName) {
+ // Anonymous structure
+ Struct *memberStruct = memberValue->toStruct();
+ assert(memberStruct);
+ if (memberStruct) {
+ sep = visitMembers(memberStruct, sep);
+ continue;
+ }
+ }
+
+ os << sep << italic << memberName << normal << " = ",
+ _visit(memberValue);
sep = ", ";
}
+ return sep;
+ }
+
+ void visit(Struct *s) {
+ os << "{";
+ visitMembers(s);
os << "}";
}
_visit(r->humanValue);
}
+ void visit(StackFrame *frame) {
+ frame->dump(os);
+ }
+
+ void visit(Backtrace & backtrace) {
+ for (int i = 0; i < backtrace.size(); i ++) {
+ visit(backtrace[i]);
+ os << "\n";
+ }
+ }
+
void visit(Call *call) {
CallFlags callFlags = call->flags;
os << "\n";
+ if (call->backtrace != NULL) {
+ os << bold << red << "Backtrace:\n" << normal;
+ visit(*call->backtrace);
+ }
if (callFlags & CALL_FLAG_END_FRAME) {
os << "\n";
}