X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=trace.py;h=4d6d97450501b12280740aecbd06b45a9d22979e;hb=2672a7dbb0e0acd666abfd2498bb19aeca41fe09;hp=3f385fa8685d63fbbcd7f180e6084fa35ff804a6;hpb=97ac28e65ca20b5649552597afaeee1d67766f6a;p=apitrace diff --git a/trace.py b/trace.py index 3f385fa..4d6d974 100644 --- a/trace.py +++ b/trace.py @@ -108,12 +108,18 @@ class ComplexValueSerializer(stdapi.OnceVisitor): def visitIntPointer(self, pointer): pass + def visitObjPointer(self, pointer): + self.visit(pointer.type) + def visitLinearPointer(self, pointer): self.visit(pointer.type) def visitHandle(self, handle): self.visit(handle.type) + def visitReference(self, reference): + self.visit(reference.type) + def visitAlias(self, alias): self.visit(alias.type) @@ -208,9 +214,15 @@ class ValueSerializer(stdapi.Visitor): def visitIntPointer(self, pointer, instance): print ' trace::localWriter.writeOpaque((const void *)%s);' % instance + def visitObjPointer(self, pointer, instance): + print ' trace::localWriter.writeOpaque((const void *)%s);' % instance + 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) @@ -271,9 +283,17 @@ class ValueWrapper(stdapi.Visitor): def visitIntPointer(self, pointer, instance): pass + def visitObjPointer(self, pointer, instance): + print " if (%s) {" % instance + self.visit(pointer.type, "*" + instance) + print " }" + 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) @@ -523,7 +543,7 @@ class Tracer: self.wrapArg(method, arg) if riid is not None and isinstance(arg.type, Pointer): if isinstance(arg.type.type, Opaque): - self.wrapIid(riid, arg) + self.wrapIid(interface, method, riid, arg) else: assert isinstance(arg.type.type, Pointer) assert isinstance(arg.type.type.type, Interface) @@ -539,7 +559,7 @@ class Tracer: print ' if (!__result)' print ' delete this;' - def wrapIid(self, riid, out): + def wrapIid(self, interface, method, riid, out): print ' if (%s && *%s) {' % (out.name, out.name) print ' if (*%s == m_pInstance) {' % (out.name,) print ' *%s = this;' % (out.name,) @@ -549,8 +569,8 @@ class Tracer: 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: %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' os::log("apitrace: warning: %s::%s: unknown IID {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' "%s", "%s",' % (interface.name, method.name) 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,)