]> git.cworth.org Git - apitrace/blobdiff - retrace.py
Move tracers to wrappers subdirectory.
[apitrace] / retrace.py
index ee85f29d6d5de771e08b488ae0558a3e5d12a14f..9e9af208f53186d3fe6054406b4f3aad6d99d8e0 100644 (file)
@@ -33,6 +33,10 @@ import specs.stdapi as stdapi
 import specs.glapi as glapi
 
 
+class UnsupportedType(Exception):
+    pass
+
+
 class MutableRebuilder(stdapi.Rebuilder):
     '''Type visitor which derives a mutable type.'''
 
@@ -51,10 +55,6 @@ class MutableRebuilder(stdapi.Rebuilder):
         # Strip out references
         return reference.type
 
-    def visitOpaque(self, opaque):
-        # Don't recursule
-        return opaque
-
 
 def lookupHandle(handle, value):
     if handle.key is None:
@@ -114,6 +114,9 @@ class ValueAllocator(stdapi.Visitor):
     def visitPolymorphic(self, polymorphic, lvalue, rvalue):
         self.visit(polymorphic.defaultType, lvalue, rvalue)
 
+    def visitOpaque(self, opaque, lvalue, rvalue):
+        pass
+
 
 class ValueDeserializer(stdapi.Visitor):
 
@@ -205,6 +208,9 @@ class ValueDeserializer(stdapi.Visitor):
 
     def visitPolymorphic(self, polymorphic, lvalue, rvalue):
         self.visit(polymorphic.defaultType, lvalue, rvalue)
+    
+    def visitOpaque(self, opaque, lvalue, rvalue):
+        raise UnsupportedType
 
 
 class OpaqueValueDeserializer(ValueDeserializer):
@@ -310,6 +316,9 @@ class SwizzledValueRegistrator(stdapi.Visitor):
     
     def visitPolymorphic(self, polymorphic, lvalue, rvalue):
         self.visit(polymorphic.defaultType, lvalue, rvalue)
+    
+    def visitOpaque(self, opaque, lvalue, rvalue):
+        pass
 
 
 class Retracer:
@@ -327,9 +336,7 @@ class Retracer:
         print
 
     def retraceFunctionBody(self, function):
-        if not function.sideeffects:
-            print '    (void)call;'
-            return
+        assert function.sideeffects
 
         self.deserializeArgs(function)
         
@@ -338,9 +345,7 @@ class Retracer:
         self.swizzleValues(function)
 
     def retraceInterfaceMethodBody(self, interface, method):
-        if not method.sideeffects:
-            print '    (void)call;'
-            return
+        assert method.sideeffects
 
         self.deserializeThisPointer(interface)
 
@@ -369,7 +374,7 @@ class Retracer:
             lvalue = arg.name
             try:
                 self.extractArg(function, arg, arg_type, lvalue, rvalue)
-            except NotImplementedError:
+            except UnsupportedType:
                 success =  False
                 print '    memset(&%s, 0, sizeof %s); // FIXME' % (arg.name, arg.name)
             print
@@ -389,14 +394,14 @@ class Retracer:
                 lvalue = arg.name
                 try:
                     self.regiterSwizzledValue(arg_type, lvalue, rvalue)
-                except NotImplementedError:
+                except UnsupportedType:
                     print '    // XXX: %s' % arg.name
         if function.type is not stdapi.Void:
             rvalue = '*call.ret'
             lvalue = '__result'
             try:
                 self.regiterSwizzledValue(function.type, lvalue, rvalue)
-            except NotImplementedError:
+            except UnsupportedType:
                 raise
                 print '    // XXX: result'
 
@@ -414,7 +419,7 @@ class Retracer:
     def extractOpaqueArg(self, function, arg, arg_type, lvalue, rvalue):
         try:
             ValueAllocator().visit(arg_type, lvalue, rvalue)
-        except NotImplementedError:
+        except UnsupportedType:
             pass
         OpaqueValueDeserializer().visit(arg_type, lvalue, rvalue)
 
@@ -470,18 +475,26 @@ class Retracer:
 
         functions = filter(self.filterFunction, api.functions)
         for function in functions:
-            self.retraceFunction(function)
+            if function.sideeffects:
+                self.retraceFunction(function)
         interfaces = api.getAllInterfaces()
         for interface in interfaces:
             for method in interface.iterMethods():
-                self.retraceInterfaceMethod(interface, method)
+                if method.sideeffects:
+                    self.retraceInterfaceMethod(interface, method)
 
         print 'const retrace::Entry %s[] = {' % self.table_name
         for function in functions:
-            print '    {"%s", &retrace_%s},' % (function.name, function.name)
+            if function.sideeffects:
+                print '    {"%s", &retrace_%s},' % (function.name, function.name)
+            else:
+                print '    {"%s", &retrace::ignore},' % (function.name,)
         for interface in interfaces:
-            for method in interface.iterMethods():
-                print '    {"%s::%s", &retrace_%s__%s},' % (interface.name, method.name, interface.name, method.name)
+            for method in interface.iterMethods():                
+                if method.sideeffects:
+                    print '    {"%s::%s", &retrace_%s__%s},' % (interface.name, method.name, interface.name, method.name)
+                else:
+                    print '    {"%s::%s", &retrace::ignore},' % (interface.name, method.name)
         print '    {NULL, NULL}'
         print '};'
         print