X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=common%2Ftrace_model.hpp;h=36f0a03eff83cb15d5919fb86b661eb0cd271513;hb=c037ae2b4f749aed15ede635a6b517534bc5a901;hp=95582253190687446a4c0d98e529047c33e98155;hpb=caa8428eb4c4292d3ea53405d4dc9c3c3f21f10a;p=apitrace diff --git a/common/trace_model.hpp b/common/trace_model.hpp index 9558225..36f0a03 100644 --- a/common/trace_model.hpp +++ b/common/trace_model.hpp @@ -41,6 +41,10 @@ namespace trace { +// Should match Call::no +typedef unsigned CallNo; + + typedef unsigned Id; @@ -87,6 +91,9 @@ struct BitmaskSig { class Visitor; +class Null; +class Struct; +class Array; class Value @@ -106,6 +113,15 @@ public: virtual unsigned long long toUIntPtr(void) const; virtual const char *toString(void) const; + virtual const Null *toNull(void) const { return NULL; } + virtual Null *toNull(void) { return NULL; } + + virtual const Array *toArray(void) const { return NULL; } + virtual Array *toArray(void) { return NULL; } + + virtual const Struct *toStruct(void) const { return NULL; } + virtual Struct *toStruct(void) { return NULL; } + const Value & operator[](size_t index) const; }; @@ -123,6 +139,9 @@ public: unsigned long long toUIntPtr(void) const; const char *toString(void) const; void visit(Visitor &visitor); + + const Null *toNull(void) const { return this; } + Null *toNull(void) { return this; } }; @@ -262,6 +281,9 @@ public: bool toBool(void) const; void visit(Visitor &visitor); + const Struct *toStruct(void) const { return this; } + Struct *toStruct(void) { return this; } + const StructSig *sig; std::vector members; }; @@ -276,6 +298,9 @@ public: bool toBool(void) const; void visit(Visitor &visitor); + const Array *toArray(void) const { return this; } + Array *toArray(void) { return this; } + std::vector values; inline size_t @@ -348,6 +373,29 @@ public: void visit(Visitor &visitor); }; +struct RawStackFrame { + Id id; + const char * module; + const char * function; + const char * filename; + int linenumber; + long long offset; + RawStackFrame() : + module(0), + function(0), + filename(0), + linenumber(-1), + offset(-1) + { + } +}; + +class StackFrame : public RawStackFrame { +public: + ~StackFrame(); +}; + +typedef std::vector Backtrace; class Visitor { @@ -366,7 +414,8 @@ public: virtual void visit(Blob *); virtual void visit(Pointer *); virtual void visit(Repr *); - + virtual void visit(Backtrace *); + virtual void visit(StackFrame *); protected: inline void _visit(Value *value) { if (value) { @@ -468,13 +517,15 @@ public: Value *ret; CallFlags flags; + Backtrace* backtrace; Call(const FunctionSig *_sig, const CallFlags &_flags, unsigned _thread_id) : thread_id(_thread_id), sig(_sig), args(_sig->num_args), ret(0), - flags(_flags) { + flags(_flags), + backtrace(0) { } ~Call();