import specs.glapi as glapi
+class UnsupportedType(Exception):
+ pass
+
+
class MutableRebuilder(stdapi.Rebuilder):
'''Type visitor which derives a mutable type.'''
# Strip out references
return reference.type
- def visitOpaque(self, opaque):
- # Don't recursule
- return opaque
-
def lookupHandle(handle, value):
if handle.key is None:
def visitPolymorphic(self, polymorphic, lvalue, rvalue):
self.visit(polymorphic.defaultType, lvalue, rvalue)
+ def visitOpaque(self, opaque, lvalue, rvalue):
+ pass
+
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):
def visitPolymorphic(self, polymorphic, lvalue, rvalue):
self.visit(polymorphic.defaultType, lvalue, rvalue)
+
+ def visitOpaque(self, opaque, lvalue, rvalue):
+ pass
class Retracer:
print
def retraceFunctionBody(self, function):
- if not function.sideeffects:
- print ' (void)call;'
- return
+ assert function.sideeffects
self.deserializeArgs(function)
self.swizzleValues(function)
def retraceInterfaceMethodBody(self, interface, method):
- if not method.sideeffects:
- print ' (void)call;'
- return
+ assert method.sideeffects
self.deserializeThisPointer(interface)
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
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'
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)
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