X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=trace.py;h=4f39129add7c782a754f226f81dd5a6d1db82d39;hb=b89c59301b6bedebe35e35e9bda913683ad265b3;hp=a9395339c2981b054a612fbbacdcd43c2adcf4ec;hpb=280a176f599484b3acf75f070e3f25b756786cc2;p=apitrace diff --git a/trace.py b/trace.py index a939533..4f39129 100644 --- a/trace.py +++ b/trace.py @@ -114,6 +114,9 @@ class ComplexValueSerializer(stdapi.OnceVisitor): def visitHandle(self, handle): self.visit(handle.type) + def visitReference(self, reference): + self.visit(reference.type) + def visitAlias(self, alias): self.visit(alias.type) @@ -211,6 +214,9 @@ class ValueSerializer(stdapi.Visitor): def visitLinearPointer(self, pointer, instance): print ' trace::localWriter.writeOpaque((const void *)%s);' % instance + def visitReference(self, reference, instance): + self.visit(reference.type, instance) + def visitHandle(self, handle, instance): self.visit(handle.type, instance) @@ -274,6 +280,9 @@ class ValueWrapper(stdapi.Visitor): def visitLinearPointer(self, pointer, instance): pass + def visitReference(self, reference, instance): + self.visit(reference.type, instance) + def visitHandle(self, handle, instance): self.visit(handle.type, instance) @@ -301,9 +310,14 @@ class ValueUnwrapper(ValueWrapper): def visitInterface(self, interface, instance): assert instance.startswith('*') instance = instance[1:] - print " if (%s) {" % instance - print " %s = static_cast<%s *>(%s)->m_pInstance;" % (instance, getWrapperInterfaceName(interface), instance) - print " }" + print r' if (%s) {' % instance + print r' %s *pWrapper = static_cast<%s*>(%s);' % (getWrapperInterfaceName(interface), getWrapperInterfaceName(interface), instance) + print r' if (pWrapper && pWrapper->m_dwMagic == 0xd8365d6c) {' + print r' %s = pWrapper->m_pInstance;' % (instance,) + print r' } else {' + print r' os::log("apitrace: warning: %%s: unexpected %%s pointer\n", __FUNCTION__, "%s");' % interface.name + print r' }' + print r' }' class Tracer: @@ -461,33 +475,35 @@ class Tracer: def declareWrapperInterfaceVariables(self, interface): #print "private:" + print " DWORD m_dwMagic;" print " %s * m_pInstance;" % (interface.name,) def implementWrapperInterface(self, interface): print '%s::%s(%s * pInstance) {' % (getWrapperInterfaceName(interface), getWrapperInterfaceName(interface), interface.name) + print ' m_dwMagic = 0xd8365d6c;' print ' m_pInstance = pInstance;' print '}' print 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);' @@ -496,7 +512,7 @@ class Tracer: print ' trace::localWriter.endArg();' from specs.winapi import REFIID - from specs.stdapi import Pointer, Opaque + from specs.stdapi import Pointer, Opaque, Interface riid = None for arg in method.args: @@ -507,7 +523,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: @@ -515,8 +531,11 @@ class Tracer: self.serializeArg(method, arg) self.wrapArg(method, arg) if riid is not None and isinstance(arg.type, Pointer): - assert isinstance(arg.type.type, Opaque) - self.wrapIid(interface, method, riid, arg) + if isinstance(arg.type.type, Opaque): + self.wrapIid(riid, arg) + else: + assert isinstance(arg.type.type, Pointer) + assert isinstance(arg.type.type.type, Interface) if method.type is not stdapi.Void: print ' trace::localWriter.beginReturn();' @@ -529,17 +548,18 @@ class Tracer: print ' if (!__result)' print ' delete this;' - def wrapIid(self, interface, method, riid, out): + def wrapIid(self, riid, out): print ' if (%s && *%s) {' % (out.name, out.name) print ' if (*%s == m_pInstance) {' % (out.name,) print ' *%s = this;' % (out.name,) print ' }' - for iface in self.api.interfaces: + for iface in self.api.getAllInterfaces(): print r' else if (%s == IID_%s) {' % (riid.name, iface.name) print r' *%s = new Wrap%s((%s *) *%s);' % (out.name, iface.name, iface.name, out.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' os::log("apitrace: warning: %s: 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' __FUNCTION__,' print r' %s.Data1, %s.Data2, %s.Data3,' % (riid.name, riid.name, riid.name) print r' %s.Data4[0],' % (riid.name,) print r' %s.Data4[1],' % (riid.name,) @@ -552,12 +572,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);'