]> git.cworth.org Git - apitrace/commitdiff
Be more specific when invoking the interface methods.
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Fri, 3 Feb 2012 19:05:29 +0000 (19:05 +0000)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Fri, 3 Feb 2012 19:07:25 +0000 (19:07 +0000)
There may be ambiguities.

d3d9trace.py
specs/stdapi.py
trace.py

index c408b497b48f9aad156f6e23b5cb78c0f4013799..ae4acd039fe39f2b274afdfa46f9f624f003611f 100644 (file)
@@ -45,13 +45,13 @@ class D3D9Tracer(DllTracer):
             print '    UINT m_SizeToLock;'
             print '    VOID *m_pbData;'
 
-    def implementWrapperInterfaceMethodBody(self, interface, method):
+    def implementWrapperInterfaceMethodBody(self, interface, base, method):
         if interface.name == 'IDirect3DVertexBuffer9' and method.name == 'Unlock':
             print '    if (m_pbData) {'
             self.emit_memcpy('(LPBYTE)m_pbData', '(LPBYTE)m_pbData', 'm_SizeToLock')
             print '    }'
 
-        DllTracer.implementWrapperInterfaceMethodBody(self, interface, method)
+        DllTracer.implementWrapperInterfaceMethodBody(self, interface, base, method)
 
         if interface.name == 'IDirect3DVertexBuffer9' and method.name == 'Lock':
             # FIXME: handle recursive locks
index 5ba621fff35ceb7e26df9d94d0d303240d77e68c..d9fd5455bbdf381d7dbcf008cc851f07f0a30764 100644 (file)
@@ -350,6 +350,14 @@ class Interface(Type):
             yield method
         raise StopIteration
 
+    def iterBaseMethods(self):
+        if self.base is not None:
+            for iface, method in self.base.iterBaseMethods():
+                yield iface, method
+        for method in self.methods:
+            yield self, method
+        raise StopIteration
+
 
 class Method(Function):
 
index 8fd5840736f85208ab1555191d8614fef1762f76..831af98640fb6970f143060fd430adf0939eee6d 100644 (file)
--- a/trace.py
+++ b/trace.py
@@ -478,23 +478,23 @@ class Tracer:
         print '%s::~%s() {' % (getWrapperInterfaceName(interface), getWrapperInterfaceName(interface))
         print '}'
         print
-        for method in interface.iterMethods():
-            self.implementWrapperInterfaceMethod(interface, method)
+        for base, method in interface.iterBaseMethods():
+            self.implementWrapperInterfaceMethod(interface, base, method)
         print
 
-    def implementWrapperInterfaceMethod(self, interface, method):
+    def implementWrapperInterfaceMethod(self, interface, base, method):
         print method.prototype(getWrapperInterfaceName(interface) + '::' + method.name) + ' {'
         if method.type is not stdapi.Void:
             print '    %s __result;' % method.type
     
-        self.implementWrapperInterfaceMethodBody(interface, method)
+        self.implementWrapperInterfaceMethodBody(interface, base, method)
     
         if method.type is not stdapi.Void:
             print '    return __result;'
         print '}'
         print
 
-    def implementWrapperInterfaceMethodBody(self, interface, method):
+    def implementWrapperInterfaceMethodBody(self, interface, base, method):
         print '    static const char * __args[%u] = {%s};' % (len(method.args) + 1, ', '.join(['"this"'] + ['"%s"' % arg.name for arg in method.args]))
         print '    static const trace::FunctionSig __sig = {%u, "%s", %u, __args};' % (method.id, interface.name + '::' + method.name, len(method.args) + 1)
         print '    unsigned __call = trace::localWriter.beginEnter(&__sig);'
@@ -514,7 +514,7 @@ class Tracer:
                     riid = arg
         print '    trace::localWriter.endEnter();'
         
-        self.invokeMethod(interface, method)
+        self.invokeMethod(interface, base, method)
 
         print '    trace::localWriter.beginLeave(__call);'
         for arg in method.args:
@@ -563,12 +563,12 @@ class Tracer:
             print r'        }'
             print '    }'
 
-    def invokeMethod(self, interface, method):
+    def invokeMethod(self, interface, base, method):
         if method.type is stdapi.Void:
             result = ''
         else:
             result = '__result = '
-        print '    %sm_pInstance->%s(%s);' % (result, method.name, ', '.join([str(arg.name) for arg in method.args]))
+        print '    %sstatic_cast<%s *>(m_pInstance)->%s(%s);' % (result, base, method.name, ', '.join([str(arg.name) for arg in method.args]))
     
     def emit_memcpy(self, dest, src, length):
         print '        unsigned __call = trace::localWriter.beginEnter(&trace::memcpy_sig);'