]> git.cworth.org Git - apitrace/blobdiff - trace.py
Use bitmap instead of vector.
[apitrace] / trace.py
index 95e84b5e732cc8cbd676e36fe9de35b43efd7939..c497a048c86ef02a8353a7ba07dc68559288683d 100644 (file)
--- a/trace.py
+++ b/trace.py
@@ -51,11 +51,16 @@ class DumpDeclarator(stdapi.OnceVisitor):
         for type, name in struct.members:
             self.visit(type)
         print 'static void __traceStruct%s(const %s &value) {' % (struct.id, struct.expr)
-        print '    Trace::BeginStruct(%u);' % len(struct.members)
+        print '    static const char * members[%u] = {' % (len(struct.members),)
+        for type, name,  in struct.members:
+            print '        "%s",' % (name,)
+        print '    };'
+        print '    static const Trace::StructSig sig = {'
+        print '       %u, "%s", %u, members' % (int(struct.id), struct.name, len(struct.members))
+        print '    };'
+        print '    Trace::BeginStruct(&sig);'
         for type, name in struct.members:
-            print '    Trace::BeginMember("%s");' % (name,)
             dump_instance(type, 'value.%s' % (name,))
-            print '    Trace::EndMember();'
         print '    Trace::EndStruct();'
         print '}'
         print
@@ -68,15 +73,22 @@ class DumpDeclarator(stdapi.OnceVisitor):
 
     def visit_enum(self, enum):
         print 'static void __traceEnum%s(const %s value) {' % (enum.id, 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, enum.vid + i, value, value)
+        print '    const Trace::EnumSig *sig;'
         print '    switch(value) {'
-        for value in enum.values:
+        for i in range(n):
+            value = enum.values[i]
             print '    case %s:' % value
-            print '        Trace::LiteralNamedConstant("%s", %s);' % (value, value)
+            print '        sig = &sig%u;' % i
             print '        break;'
         print '    default:'
         print '        Trace::LiteralSInt(value);'
-        print '        break;'
+        print '        return;'
         print '    }'
+        print '        Trace::LiteralEnum(sig);'
         print '}'
         print
 
@@ -283,6 +295,16 @@ class Tracer:
         print 'typedef ' + function.prototype('* %s' % ptype) + ';'
         print 'static %s %s = NULL;' % (ptype, pvalue)
         print
+        print 'static const char * __%s_args[] = {' % (function.name)
+        for arg in function.args:
+            print '   "%s",' % (arg.name,)
+        print '};'
+        print
+        print 'static const Trace::FunctionSig __%s_sig = {' % (function.name)
+        print '   %u, "%s", %u, __%s_args' % (int(function.id), function.name, len(function.args), function.name)
+        print '};'
+        print
+
 
     def trace_function_fail(self, function):
         if function.fail is not None:
@@ -316,7 +338,7 @@ class Tracer:
             print '    %s __result;' % function.type
             result = '__result = '
         self._get_true_pointer(function)
-        print '    unsigned __call = Trace::BeginEnter("%s");' % (function.name)
+        print '    unsigned __call = Trace::BeginEnter(__%s_sig);' % (function.name)
         for arg in function.args:
             if not arg.output:
                 self.unwrap_arg(function, arg)
@@ -338,7 +360,7 @@ class Tracer:
         print
 
     def dump_arg(self, function, arg):
-        print '    Trace::BeginArg(%u, "%s");' % (arg.index, arg.name,)
+        print '    Trace::BeginArg(%u);' % (arg.index,)
         dump_instance(arg.type, arg.name)
         print '    Trace::EndArg();'
 
@@ -400,7 +422,7 @@ class Tracer:
             print '    %s __result;' % method.type
             result = '__result = '
         print '    Trace::BeginCall("%s");' % (interface.name + '::' + method.name)
-        print '    Trace::BeginArg(0, "this");'
+        print '    Trace::BeginArg(0);'
         print '    Trace::LiteralOpaque((const void *)m_pInstance);'
         print '    Trace::EndArg();'
         for arg in method.args: