X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=common%2Ftrace_model.cpp;h=e05ca276cf59dedc2f1496a329f8b2ce01501117;hb=946da143b5fa8b5babddd5668743e4048bf08e7d;hp=2ceb81074a846ce494951b10918fb14f840aa034;hpb=e26d30e9121ba10bcff16df43c27cce7223038b3;p=apitrace diff --git a/common/trace_model.cpp b/common/trace_model.cpp index 2ceb810..e05ca27 100644 --- a/common/trace_model.cpp +++ b/common/trace_model.cpp @@ -24,7 +24,6 @@ **************************************************************************/ -#include "formatter.hpp" #include "trace_model.hpp" @@ -183,217 +182,6 @@ void Visitor::visit(Blob *) { assert(0); } void Visitor::visit(Pointer *) { assert(0); } -class Dumper : public Visitor -{ -protected: - std::ostream &os; - formatter::Formatter *formatter; - formatter::Attribute *normal; - formatter::Attribute *bold; - formatter::Attribute *italic; - formatter::Attribute *strike; - formatter::Attribute *red; - formatter::Attribute *pointer; - formatter::Attribute *literal; - -public: - Dumper(std::ostream &_os, bool color) : os(_os) { - formatter = formatter::defaultFormatter(color); - normal = formatter->normal(); - bold = formatter->bold(); - italic = formatter->italic(); - strike = formatter->strike(); - red = formatter->color(formatter::RED); - pointer = formatter->color(formatter::GREEN); - literal = formatter->color(formatter::BLUE); - } - - ~Dumper() { - delete normal; - delete bold; - delete italic; - delete strike; - delete red; - delete pointer; - delete literal; - delete formatter; - } - - void visit(Null *) { - os << "NULL"; - } - - void visit(Bool *node) { - os << literal << (node->value ? "true" : "false") << normal; - } - - void visit(SInt *node) { - os << literal << node->value << normal; - } - - void visit(UInt *node) { - os << literal << node->value << normal; - } - - void visit(Float *node) { - os << literal << node->value << normal; - } - - void visit(Double *node) { - os << literal << node->value << normal; - } - - void visit(String *node) { - os << literal << "\""; - for (const char *it = node->value; *it; ++it) { - unsigned char c = (unsigned char) *it; - if (c == '\"') - os << "\\\""; - else if (c == '\\') - os << "\\\\"; - else if (c >= 0x20 && c <= 0x7e) - os << c; - else if (c == '\t') { - os << "\t"; - } else if (c == '\r') { - // Ignore carriage-return - } else if (c == '\n') { - // Reset formatting so that it looks correct with 'less -R' - os << normal << '\n' << literal; - } else { - unsigned octal0 = c & 0x7; - unsigned octal1 = (c >> 3) & 0x7; - unsigned octal2 = (c >> 3) & 0x7; - os << "\\"; - if (octal2) - os << octal2; - if (octal1) - os << octal1; - os << octal0; - } - } - os << "\"" << normal; - } - - void visit(Enum *node) { - const EnumSig *sig = node->sig; - for (const EnumValue *it = sig->values; it != sig->values + sig->num_values; ++it) { - if (it->value == node->value) { - os << literal << it->name << normal; - return; - } - } - os << literal << node->value << normal; - } - - void visit(Bitmask *bitmask) { - unsigned long long value = bitmask->value; - const BitmaskSig *sig = bitmask->sig; - bool first = true; - for (const BitmaskFlag *it = sig->flags; value != 0 && it != sig->flags + sig->num_flags; ++it) { - if ((it->value && (value & it->value) == it->value) || - (!it->value && value == 0)) { - if (!first) { - os << " | "; - } - os << literal << it->name << normal; - value &= ~it->value; - first = false; - } - } - if (value || first) { - if (!first) { - os << " | "; - } - os << literal << "0x" << std::hex << value << std::dec << normal; - } - } - - void visit(Struct *s) { - const char *sep = ""; - os << "{"; - for (unsigned i = 0; i < s->members.size(); ++i) { - os << sep << italic << s->sig->member_names[i] << normal << " = "; - _visit(s->members[i]); - sep = ", "; - } - os << "}"; - } - - void visit(Array *array) { - if (array->values.size() == 1) { - os << "&"; - _visit(array->values[0]); - } - else { - const char *sep = ""; - os << "{"; - for (std::vector::iterator it = array->values.begin(); it != array->values.end(); ++it) { - os << sep; - _visit(*it); - sep = ", "; - } - os << "}"; - } - } - - void visit(Blob *blob) { - os << pointer << "blob(" << blob->size << ")" << normal; - } - - void visit(Pointer *p) { - os << pointer << "0x" << std::hex << p->value << std::dec << normal; - } - - void visit(Call *call) { - CallFlags flags = call->flags; - - if (flags & CALL_FLAG_NON_REPRODUCIBLE) { - os << strike; - } else if (flags & (CALL_FLAG_FAKE | CALL_FLAG_NO_SIDE_EFFECTS)) { - os << normal; - } else { - os << bold; - } - os << call->sig->name << normal; - - os << "("; - const char *sep = ""; - for (unsigned i = 0; i < call->args.size(); ++i) { - os << sep << italic << call->sig->arg_names[i] << normal << " = "; - if (call->args[i]) { - _visit(call->args[i]); - } else { - os << "?"; - } - sep = ", "; - } - os << ")"; - - if (call->ret) { - os << " = "; - _visit(call->ret); - } - - if (flags & CALL_FLAG_INCOMPLETE) { - os << " // " << red << "incomplete" << normal; - } - - os << "\n"; - - if (flags & CALL_FLAG_END_FRAME) { - os << "\n"; - } - } -}; - - -void Value::dump(std::ostream &os, bool color) { - Dumper d(os, color); - visit(d); -} - - static Null null; const Value & Value::operator[](size_t index) const { @@ -406,11 +194,4 @@ const Value & Value::operator[](size_t index) const { return null; } -void Call::dump(std::ostream &os, bool color) { - Dumper d(os, color); - os << no << " "; - d.visit(this); -} - - } /* namespace trace */