]> git.cworth.org Git - apitrace/commitdiff
Handle zero valued bitmask flags.
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Mon, 23 Apr 2012 09:13:48 +0000 (10:13 +0100)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Mon, 23 Apr 2012 09:13:48 +0000 (10:13 +0100)
common/trace_dump.cpp
gui/apitracecall.cpp

index 0f7ee3656e76288ccd12caca37ec5e62394ce76b..06c0079a5e2a8d9436a20ee91e3c71527fd12766 100644 (file)
@@ -142,6 +142,7 @@ public:
         const BitmaskSig *sig = bitmask->sig;
         bool first = true;
         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) {
index dfaaeef0e478a6a7b7a9fba76b02ec510a67bcba..25b035d2ca90e82b8cfe2733b29fe2098e2a83c4 100644 (file)
@@ -336,7 +336,6 @@ void ApiBitmask::init(const trace::Bitmask *bitmask)
     m_value = bitmask->value;
     for (const trace::BitmaskFlag *it = bitmask->sig->flags;
          it != bitmask->sig->flags + bitmask->sig->num_flags; ++it) {
-        assert(it->value);
         QPair<QString, unsigned long long> pair;
 
         pair.first = QString::fromStdString(it->name);
@@ -351,10 +350,10 @@ QString ApiBitmask::toString() const
     QString str;
     unsigned long long value = m_value;
     bool first = true;
-    for (Signature::const_iterator it = m_sig.begin();
-         value != 0 && it != m_sig.end(); ++it) {
-        Q_ASSERT(it->second);
-        if ((value & it->second) == it->second) {
+    for (Signature::const_iterator it = m_sig.begin(); it != m_sig.end(); ++it) {
+        Q_ASSERT(it->second || first);
+        if ((it->second && (value & it->second) == it->second) ||
+            (!it->second && value == 0)) {
             if (!first) {
                 str += QLatin1String(" | ");
             }
@@ -362,6 +361,9 @@ QString ApiBitmask::toString() const
             value &= ~it->second;
             first = false;
         }
+        if (value == 0) {
+            break;
+        }
     }
     if (value || first) {
         if (!first) {