Accept zero valued bitmasks.
authorJosé Fonseca <jfonseca@vmware.com>
Wed, 13 Apr 2011 16:37:41 +0000 (17:37 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Wed, 13 Apr 2011 16:37:41 +0000 (17:37 +0100)
When the zero valued flag appears before the non zero valued flags.

trace_model.cpp
trace_parser.cpp
trace_write.cpp

index c74aaae..b083186 100644 (file)
@@ -236,8 +236,8 @@ public:
         const Bitmask::Signature *sig = bitmask->sig;
         bool first = true;
         for (Bitmask::Signature::const_iterator it = sig->begin(); value != 0 && it != sig->end(); ++it) {
-            assert(it->second);
-            if ((value & it->second) == it->second) {
+            if ((it->second && (value & it->second) == it->second) ||
+                (!it->second && value == 0)) {
                 if (!first) {
                     os << " | ";
                 }
index 3d53b8f..8051973 100644 (file)
@@ -282,7 +282,9 @@ Value *Parser::parse_bitmask() {
         for (Bitmask::Signature::iterator it = sig->begin(); it != sig->end(); ++it) {
             it->first = read_string();
             it->second = read_uint();
-            assert(it->second);
+            if (it->second == 0 && it != sig->begin()) {
+                std::cerr << "warning: bitmask " << it->first << " is zero but is not first flag\n";
+            }
         }
         bitmasks[id] = sig;
     }
index 15d1d1f..6a44b28 100644 (file)
@@ -315,6 +315,9 @@ void LiteralBitmask(const BitmaskSig &bitmask, unsigned long long value) {
     if (!lookup(bitmasks, bitmask.id)) {
         WriteUInt(bitmask.count);
         for (unsigned i = 0; i < bitmask.count; ++i) {
+            if (i != 0 && bitmask.values[i].value == 0) {
+                OS::DebugMessage("apitrace: bitmask %s is zero but is not first flag\n", bitmask.values[i].name);
+            }
             WriteString(bitmask.values[i].name);
             WriteUInt(bitmask.values[i].value);
         }