X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=retrace.py;h=9e9af208f53186d3fe6054406b4f3aad6d99d8e0;hb=452d3256a3ba7f249222ef857d69c8caaaa753f3;hp=ee85f29d6d5de771e08b488ae0558a3e5d12a14f;hpb=4a2c57bacd9585990414ff8239d5091caa4a39dc;p=apitrace diff --git a/retrace.py b/retrace.py index ee85f29..9e9af20 100644 --- a/retrace.py +++ b/retrace.py @@ -33,6 +33,10 @@ import specs.stdapi as stdapi import specs.glapi as glapi +class UnsupportedType(Exception): + pass + + class MutableRebuilder(stdapi.Rebuilder): '''Type visitor which derives a mutable type.''' @@ -51,10 +55,6 @@ class MutableRebuilder(stdapi.Rebuilder): # Strip out references return reference.type - def visitOpaque(self, opaque): - # Don't recursule - return opaque - def lookupHandle(handle, value): if handle.key is None: @@ -114,6 +114,9 @@ class ValueAllocator(stdapi.Visitor): def visitPolymorphic(self, polymorphic, lvalue, rvalue): self.visit(polymorphic.defaultType, lvalue, rvalue) + def visitOpaque(self, opaque, lvalue, rvalue): + pass + class ValueDeserializer(stdapi.Visitor): @@ -205,6 +208,9 @@ class ValueDeserializer(stdapi.Visitor): def visitPolymorphic(self, polymorphic, lvalue, rvalue): self.visit(polymorphic.defaultType, lvalue, rvalue) + + def visitOpaque(self, opaque, lvalue, rvalue): + raise UnsupportedType class OpaqueValueDeserializer(ValueDeserializer): @@ -310,6 +316,9 @@ class SwizzledValueRegistrator(stdapi.Visitor): def visitPolymorphic(self, polymorphic, lvalue, rvalue): self.visit(polymorphic.defaultType, lvalue, rvalue) + + def visitOpaque(self, opaque, lvalue, rvalue): + pass class Retracer: @@ -327,9 +336,7 @@ class Retracer: print def retraceFunctionBody(self, function): - if not function.sideeffects: - print ' (void)call;' - return + assert function.sideeffects self.deserializeArgs(function) @@ -338,9 +345,7 @@ class Retracer: self.swizzleValues(function) def retraceInterfaceMethodBody(self, interface, method): - if not method.sideeffects: - print ' (void)call;' - return + assert method.sideeffects self.deserializeThisPointer(interface) @@ -369,7 +374,7 @@ class Retracer: lvalue = arg.name try: self.extractArg(function, arg, arg_type, lvalue, rvalue) - except NotImplementedError: + except UnsupportedType: success = False print ' memset(&%s, 0, sizeof %s); // FIXME' % (arg.name, arg.name) print @@ -389,14 +394,14 @@ class Retracer: lvalue = arg.name try: self.regiterSwizzledValue(arg_type, lvalue, rvalue) - except NotImplementedError: + except UnsupportedType: print ' // XXX: %s' % arg.name if function.type is not stdapi.Void: rvalue = '*call.ret' lvalue = '__result' try: self.regiterSwizzledValue(function.type, lvalue, rvalue) - except NotImplementedError: + except UnsupportedType: raise print ' // XXX: result' @@ -414,7 +419,7 @@ class Retracer: def extractOpaqueArg(self, function, arg, arg_type, lvalue, rvalue): try: ValueAllocator().visit(arg_type, lvalue, rvalue) - except NotImplementedError: + except UnsupportedType: pass OpaqueValueDeserializer().visit(arg_type, lvalue, rvalue) @@ -470,18 +475,26 @@ class Retracer: functions = filter(self.filterFunction, api.functions) for function in functions: - self.retraceFunction(function) + if function.sideeffects: + self.retraceFunction(function) interfaces = api.getAllInterfaces() for interface in interfaces: for method in interface.iterMethods(): - self.retraceInterfaceMethod(interface, method) + if method.sideeffects: + self.retraceInterfaceMethod(interface, method) print 'const retrace::Entry %s[] = {' % self.table_name for function in functions: - print ' {"%s", &retrace_%s},' % (function.name, function.name) + if function.sideeffects: + print ' {"%s", &retrace_%s},' % (function.name, function.name) + else: + print ' {"%s", &retrace::ignore},' % (function.name,) for interface in interfaces: - for method in interface.iterMethods(): - print ' {"%s::%s", &retrace_%s__%s},' % (interface.name, method.name, interface.name, method.name) + for method in interface.iterMethods(): + if method.sideeffects: + print ' {"%s::%s", &retrace_%s__%s},' % (interface.name, method.name, interface.name, method.name) + else: + print ' {"%s::%s", &retrace::ignore},' % (interface.name, method.name) print ' {NULL, NULL}' print '};' print