X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=common%2Ftrace_dump.cpp;h=6e67e08ab53e0f2585d5a1e952b9d00bae220b02;hb=abaef29db0cf1a3e2adb0c254886162368b1645a;hp=06c0079a5e2a8d9436a20ee91e3c71527fd12766;hpb=fc9939fc84a006ccddfad84b137b6915b1a55771;p=apitrace diff --git a/common/trace_dump.cpp b/common/trace_dump.cpp index 06c0079..6e67e08 100644 --- a/common/trace_dump.cpp +++ b/common/trace_dump.cpp @@ -24,6 +24,8 @@ **************************************************************************/ +#include + #include "formatter.hpp" #include "trace_dump.hpp" @@ -73,7 +75,7 @@ public: } void visit(Null *) { - os << "NULL"; + os << literal << "NULL" << normal; } void visit(Bool *node) { @@ -89,11 +91,15 @@ public: } void visit(Float *node) { + std::streamsize oldPrecision = os.precision(std::numeric_limits::digits10 + 1); os << literal << node->value << normal; + os.precision(oldPrecision); } void visit(Double *node) { + std::streamsize oldPrecision = os.precision(std::numeric_limits::digits10 + 1); os << literal << node->value << normal; + os.precision(oldPrecision); } void visit(String *node) { @@ -164,14 +170,32 @@ public: } } - 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 << "}"; } @@ -200,6 +224,37 @@ public: os << pointer << "0x" << std::hex << p->value << std::dec << normal; } + void visit(Repr *r) { + _visit(r->humanValue); + } + + void visit(StackFrame *frame) { + if (frame->module != NULL) { + os << frame->module << " "; + } + if (frame->function != NULL) { + os << "at " << frame->function << "() "; + } + if (frame->filename != NULL) { + os << "at " << frame->filename; + if (frame->linenumber >= 0) { + os << ":" << frame->linenumber << " "; + } + } + else { + if (frame->offset >= 0) { + os << "[" << "0x" << std::hex << frame->offset << std::dec << "]"; + } + } + } + + 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; @@ -243,6 +298,10 @@ public: os << "\n"; + if (call->backtrace != NULL) { + os << bold << red << "Backtrace:\n" << normal; + visit(*call->backtrace); + } if (callFlags & CALL_FLAG_END_FRAME) { os << "\n"; }