]> git.cworth.org Git - apitrace/blobdiff - common/trace_dump.cpp
Highlight NULL as a literal.
[apitrace] / common / trace_dump.cpp
index 6a0e6a79d853389bc6031d044d6d0bdd2ca76411..d9dcf1197737a7d1a2033fc463d0b20edfc27842 100644 (file)
@@ -35,7 +35,7 @@ class Dumper : public Visitor
 {
 protected:
     std::ostream &os;
-    DumpFlags flags;
+    DumpFlags dumpFlags;
     formatter::Formatter *formatter;
     formatter::Attribute *normal;
     formatter::Attribute *bold;
@@ -48,9 +48,9 @@ protected:
 public:
     Dumper(std::ostream &_os, DumpFlags _flags) : 
         os(_os),
-        flags(_flags)
+        dumpFlags(_flags)
     {
-        bool color = !(flags & DUMP_FLAG_NO_COLOR);
+        bool color = !(dumpFlags & DUMP_FLAG_NO_COLOR);
         formatter = formatter::defaultFormatter(color);
         normal = formatter->normal();
         bold = formatter->bold();
@@ -73,7 +73,7 @@ public:
     }
 
     void visit(Null *) {
-        os << "NULL";
+        os << literal << "NULL" << normal;
     }
 
     void visit(Bool *node) {
@@ -129,12 +129,10 @@ public:
     }
 
     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;
-            }
+        const EnumValue *it = node->lookup();
+        if (it) {
+            os << literal << it->name << normal;
+            return;
         }
         os << literal << node->value << normal;
     }
@@ -143,7 +141,8 @@ public:
         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) {
+        for (const BitmaskFlag *it = sig->flags; it != sig->flags + sig->num_flags; ++it) {
+            assert(it->value || first);
             if ((it->value && (value & it->value) == it->value) ||
                 (!it->value && value == 0)) {
                 if (!first) {
@@ -153,6 +152,9 @@ public:
                 value &= ~it->value;
                 first = false;
             }
+            if (value == 0) {
+                break;
+            }
         }
         if (value || first) {
             if (!first) {
@@ -198,12 +200,20 @@ public:
         os << pointer << "0x" << std::hex << p->value << std::dec << normal;
     }
 
+    void visit(Repr *r) {
+        _visit(r->humanValue);
+    }
+
     void visit(Call *call) {
-        CallFlags flags = call->flags;
+        CallFlags callFlags = call->flags;
+        
+        if (!(dumpFlags & DUMP_FLAG_NO_CALL_NO)) {
+            os << call->no << " ";
+        }
 
-        if (flags & CALL_FLAG_NON_REPRODUCIBLE) {
+        if (callFlags & CALL_FLAG_NON_REPRODUCIBLE) {
             os << strike;
-        } else if (flags & (CALL_FLAG_FAKE | CALL_FLAG_NO_SIDE_EFFECTS)) {
+        } else if (callFlags & (CALL_FLAG_FAKE | CALL_FLAG_NO_SIDE_EFFECTS)) {
             os << normal;
         } else {
             os << bold;
@@ -214,11 +224,11 @@ public:
         const char *sep = "";
         for (unsigned i = 0; i < call->args.size(); ++i) {
             os << sep;
-            if (!(flags = DUMP_FLAG_NO_ARG_NAMES)) {
+            if (!(dumpFlags & DUMP_FLAG_NO_ARG_NAMES)) {
                 os << italic << call->sig->arg_names[i] << normal << " = ";
             }
-            if (call->args[i]) {
-                _visit(call->args[i]);
+            if (call->args[i].value) {
+                _visit(call->args[i].value);
             } else {
                os << "?";
             }
@@ -231,13 +241,13 @@ public:
             _visit(call->ret);
         }
         
-        if (flags & CALL_FLAG_INCOMPLETE) {
+        if (callFlags & CALL_FLAG_INCOMPLETE) {
             os << " // " << red << "incomplete" << normal;
         }
         
         os << "\n";
 
-        if (flags & CALL_FLAG_END_FRAME) {
+        if (callFlags & CALL_FLAG_END_FRAME) {
             os << "\n";
         }
     }
@@ -252,7 +262,6 @@ void dump(Value *value, std::ostream &os, DumpFlags flags) {
 
 void dump(Call &call, std::ostream &os, DumpFlags flags) {
     Dumper d(os, flags);
-    os << call.no << " ";
     d.visit(&call);
 }