From 4220b1bd2f3baccc2d4cbb63dda6413e093a2954 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Fri, 3 Feb 2012 19:05:29 +0000 Subject: [PATCH] Be more specific when invoking the interface methods. There may be ambiguities. --- d3d9trace.py | 4 ++-- specs/stdapi.py | 8 ++++++++ trace.py | 16 ++++++++-------- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/d3d9trace.py b/d3d9trace.py index c408b49..ae4acd0 100644 --- a/d3d9trace.py +++ b/d3d9trace.py @@ -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 diff --git a/specs/stdapi.py b/specs/stdapi.py index 5ba621f..d9fd545 100644 --- a/specs/stdapi.py +++ b/specs/stdapi.py @@ -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): diff --git a/trace.py b/trace.py index 8fd5840..831af98 100644 --- 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);' -- 2.43.0