]> git.cworth.org Git - apitrace/blobdiff - trace.py
Trace enum signatures as a whole.
[apitrace] / trace.py
index ee276532821c08d53a4f8974abcf1171cc16d956..c1b48598f2501dd038d05132ab6a96a3689973e1 100644 (file)
--- a/trace.py
+++ b/trace.py
@@ -76,25 +76,14 @@ class DumpDeclarator(stdapi.OnceVisitor):
     __enum_id = 0
 
     def visit_enum(self, enum):
-        print 'static void _write__%s(const %s value) {' % (enum.tag, enum.expr)
-        n = len(enum.values)
-        for i in range(n):
-            value = enum.values[i]
-            print '    static const trace::EnumSig sig%u = {%u, "%s", %s};' % (i, DumpDeclarator.__enum_id, value, value)
-            DumpDeclarator.__enum_id += 1
-        print '    const trace::EnumSig *sig;'
-        print '    switch (value) {'
-        for i in range(n):
-            value = enum.values[i]
-            print '    case %s:' % value
-            print '        sig = &sig%u;' % i
-            print '        break;'
-        print '    default:'
-        print '        trace::localWriter.writeSInt(value);'
-        print '        return;'
-        print '    }'
-        print '    trace::localWriter.writeEnum(sig);'
-        print '}'
+        print 'static const trace::EnumValue __enum%s_values[] = {' % (enum.tag)
+        for value in enum.values:
+            print '   {"%s", %s},' % (value, value)
+        print '};'
+        print
+        print 'static const trace::EnumSig __enum%s_sig = {' % (enum.tag)
+        print '   %u, %u, __enum%s_values' % (enum.id, len(enum.values), enum.tag)
+        print '};'
         print
 
     def visit_bitmask(self, bitmask):
@@ -186,7 +175,7 @@ class DumpImplementer(stdapi.Visitor):
         print '    trace::localWriter.writeBlob(%s, %s);' % (instance, blob.size)
 
     def visit_enum(self, enum, instance):
-        print '    _write__%s(%s);' % (enum.tag, instance)
+        print '    trace::localWriter.writeEnum(&__enum%s_sig, %s);' % (enum.tag, instance)
 
     def visit_bitmask(self, bitmask, instance):
         print '    trace::localWriter.writeBitmask(&__bitmask%s_sig, %s);' % (bitmask.tag, instance)
@@ -459,9 +448,21 @@ class Tracer:
             print '            *ppvObj = this;'
             print '        }'
             for iface in self.api.interfaces:
-                print '        else if (riid == IID_%s) {' % iface.name
-                print '            *ppvObj = new Wrap%s((%s *) *ppvObj);' % (iface.name, iface.name)
-                print '        }'
+                print r'        else if (riid == IID_%s) {' % iface.name
+                print r'            *ppvObj = new Wrap%s((%s *) *ppvObj);' % (iface.name, iface.name)
+                print r'        }'
+            print r'        else {'
+            print r'            os::log("apitrace: warning: unknown REFIID {0x%08lX,0x%04X,0x%04X,{0x%02X,0x%02X,0x%02X,0x%02X,0x%02X,0x%02X,0x%02X,0x%02X}}\n",'
+            print r'                    riid.Data1, riid.Data2, riid.Data3,'
+            print r'                    riid.Data4[0],'
+            print r'                    riid.Data4[1],'
+            print r'                    riid.Data4[2],'
+            print r'                    riid.Data4[3],'
+            print r'                    riid.Data4[4],'
+            print r'                    riid.Data4[5],'
+            print r'                    riid.Data4[6],'
+            print r'                    riid.Data4[7]);'
+            print r'        }'
             print '    }'
         if method.name == 'Release':
             assert method.type is not stdapi.Void