X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=wrappers%2Ftrace.py;h=0064d86667afe5d48337b1fa23a56c6c022e1c80;hb=b95e37292dde2d11b48b1d2e927d4ca2766be8de;hp=6cb7934bfc684e4c153cca24fd3ef7b05561befe;hpb=1b6c87507810fe2d72c81fc109110c1ca25ce94f;p=apitrace diff --git a/wrappers/trace.py b/wrappers/trace.py index 6cb7934..0064d86 100644 --- a/wrappers/trace.py +++ b/wrappers/trace.py @@ -136,6 +136,8 @@ class ComplexValueSerializer(stdapi.OnceVisitor): pass def visitPolymorphic(self, polymorphic): + if not polymorphic.contextLess: + return print 'static void _write__%s(int selector, const %s & value) {' % (polymorphic.tag, polymorphic.expr) print ' switch (selector) {' for cases, type in polymorphic.iterSwitch(): @@ -218,13 +220,13 @@ class ValueSerializer(stdapi.Visitor): print ' }' def visitIntPointer(self, pointer, instance): - print ' trace::localWriter.writeOpaque((const void *)%s);' % instance + print ' trace::localWriter.writePointer((uintptr_t)%s);' % instance def visitObjPointer(self, pointer, instance): - print ' trace::localWriter.writeOpaque((const void *)%s);' % instance + print ' trace::localWriter.writePointer((uintptr_t)%s);' % instance def visitLinearPointer(self, pointer, instance): - print ' trace::localWriter.writeOpaque((const void *)%s);' % instance + print ' trace::localWriter.writePointer((uintptr_t)%s);' % instance def visitReference(self, reference, instance): self.visit(reference.type, instance) @@ -236,13 +238,22 @@ class ValueSerializer(stdapi.Visitor): self.visit(alias.type, instance) def visitOpaque(self, opaque, instance): - print ' trace::localWriter.writeOpaque((const void *)%s);' % instance + print ' trace::localWriter.writePointer((uintptr_t)%s);' % instance def visitInterface(self, interface, instance): - print ' trace::localWriter.writeOpaque((const void *)&%s);' % instance + assert False def visitPolymorphic(self, polymorphic, instance): - print ' _write__%s(%s, %s);' % (polymorphic.tag, polymorphic.switchExpr, instance) + if polymorphic.contextLess: + print ' _write__%s(%s, %s);' % (polymorphic.tag, polymorphic.switchExpr, instance) + else: + print ' switch (%s) {' % polymorphic.switchExpr + for cases, type in polymorphic.iterSwitch(): + for case in cases: + print ' %s:' % case + self.visit(type, 'static_cast<%s>(%s)' % (type, instance)) + print ' break;' + print ' }' class WrapDecider(stdapi.Traverser): @@ -556,7 +567,7 @@ class Tracer: 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);' print ' trace::localWriter.beginArg(0);' - print ' trace::localWriter.writeOpaque((const void *)m_pInstance);' + print ' trace::localWriter.writePointer((uintptr_t)m_pInstance);' print ' trace::localWriter.endArg();' for arg in method.args: if not arg.output: @@ -637,7 +648,7 @@ class Tracer: def emit_memcpy(self, dest, src, length): print ' unsigned __call = trace::localWriter.beginEnter(&trace::memcpy_sig);' print ' trace::localWriter.beginArg(0);' - print ' trace::localWriter.writeOpaque(%s);' % dest + print ' trace::localWriter.writePointer((uintptr_t)%s);' % dest print ' trace::localWriter.endArg();' print ' trace::localWriter.beginArg(1);' print ' trace::localWriter.writeBlob(%s, %s);' % (src, length)