void visit(Visitor &visitor);
const EnumSig *sig;
+
+ const EnumValue *
+ lookup() {
+ // TODO: use a std::map
+ for (const EnumValue *it = sig->values; it != sig->values + sig->num_values; ++it) {
+ if (it->value == value) {
+ return it;
+ }
+ }
+ return NULL;
+ }
};
void visit(Visitor &visitor);
std::vector<Value *> values;
+
+ inline size_t
+ size(void) const {
+ return values.size();
+ }
};
};
+class Repr : public Value
+{
+public:
+ Repr(Value *human, Value *machine) :
+ humanValue(human),
+ machineValue(machine)
+ {}
+
+ /** Human-readible value */
+ Value *humanValue;
+
+ /** Machine-readible value */
+ Value *machineValue;
+
+ virtual bool toBool(void) const;
+ virtual signed long long toSInt(void) const;
+ virtual unsigned long long toUInt(void) const;
+ virtual float toFloat(void) const;
+ virtual double toDouble(void) const;
+
+ virtual void *toPointer(void) const;
+ virtual void *toPointer(bool bind);
+ virtual unsigned long long toUIntPtr(void) const;
+ virtual const char *toString(void) const;
+
+ void visit(Visitor &visitor);
+};
+
+class StackFrame {
+public:
+ String* module;
+ String* function;
+ String* filename;
+ String* linenumber;
+ String* offset;
+ StackFrame() :
+ module(NULL),
+ function(NULL),
+ filename(NULL),
+ linenumber(NULL),
+ offset(NULL)
+ {}
+ ~StackFrame();
+};
+
+class Backtrace {
+public:
+ std::vector<StackFrame*> frames;
+ ~Backtrace();
+ void addFrame(StackFrame* frame);
+};
+
class Visitor
{
public:
virtual void visit(Array *);
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) {
Value *ret;
CallFlags flags;
+ Backtrace* backtrace;
- Call(FunctionSig *_sig, const CallFlags &_flags, unsigned _thread_id) :
+ 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();