def visitStruct(self, struct):
print 'static const char * _struct%s_members[%u] = {' % (struct.tag, len(struct.members))
for type, name, in struct.members:
- print ' "%s",' % (name,)
+ if name is None:
+ print ' "",'
+ else:
+ print ' "%s",' % (name,)
print '};'
print 'static const trace::StructSig _struct%s_sig = {' % (struct.tag,)
- print ' %u, "%s", %u, _struct%s_members' % (struct.id, struct.name, len(struct.members), struct.tag)
+ if struct.name is None:
+ structName = '""'
+ else:
+ structName = '"%s"' % struct.name
+ print ' %u, %s, %u, _struct%s_members' % (struct.id, structName, len(struct.members), struct.tag)
print '};'
print
def visitEnum(self, enum):
print 'static const trace::EnumValue _enum%s_values[] = {' % (enum.tag)
for value in enum.values:
- print ' {"%s", %s},' % (value, value)
+ print ' {"%s", %s},' % (value, value)
print '};'
print
print 'static const trace::EnumSig _enum%s_sig = {' % (enum.tag)
- print ' %u, %u, _enum%s_values' % (enum.id, len(enum.values), enum.tag)
+ print ' %u, %u, _enum%s_values' % (enum.id, len(enum.values), enum.tag)
print '};'
print
def visitBitmask(self, bitmask):
print 'static const trace::BitmaskFlag _bitmask%s_flags[] = {' % (bitmask.tag)
for value in bitmask.values:
- print ' {"%s", %s},' % (value, value)
+ print ' {"%s", %s},' % (value, value)
print '};'
print
print 'static const trace::BitmaskSig _bitmask%s_sig = {' % (bitmask.tag)
- print ' %u, %u, _bitmask%s_flags' % (bitmask.id, len(bitmask.values), bitmask.tag)
+ print ' %u, %u, _bitmask%s_flags' % (bitmask.id, len(bitmask.values), bitmask.tag)
print '};'
print
ComplexValueSerializer visitor above.
'''
- def __init__(self):
- #stdapi.Visitor.__init__(self)
- self.indices = []
- self.instances = []
-
def visitLiteral(self, literal, instance):
print ' trace::localWriter.write%s(%s);' % (literal.kind, instance)
# reinterpret_cast is necessary for GLubyte * <=> char *
instance = 'reinterpret_cast<%s>(%s)' % (cast, instance)
if string.length is not None:
- length = ', %s' % string.length
+ length = ', %s' % self.expand(string.length)
else:
length = ''
print ' trace::localWriter.write%s(%s%s);' % (suffix, instance, length)
def visitStruct(self, struct, instance):
print ' trace::localWriter.beginStruct(&_struct%s_sig);' % (struct.tag,)
for type, name in struct.members:
- self.visitMember(instance, type, '(%s).%s' % (instance, name,))
+ if name is None:
+ # Anonymous structure/union member
+ memberInstance = instance
+ else:
+ memberInstance = '(%s).%s' % (instance, name)
+ self.visitMember(instance, type, memberInstance)
print ' trace::localWriter.endStruct();'
def visitArray(self, array, instance):
if polymorphic.contextLess:
print ' _write__%s(%s, %s);' % (polymorphic.tag, polymorphic.switchExpr, instance)
else:
- print ' switch (%s) {' % polymorphic.switchExpr
+ print ' switch (%s) {' % self.expand(polymorphic.switchExpr)
for cases, type in polymorphic.iterSwitch():
for case in cases:
print ' %s:' % case
- self.visit(type, 'static_cast<%s>(%s)' % (type, instance))
+ caseInstance = instance
+ if type.expr is not None:
+ caseInstance = 'static_cast<%s>(%s)' % (type, caseInstance)
+ self.visit(type, caseInstance)
print ' break;'
print ' }'
def visitStruct(self, struct, instance):
for type, name in struct.members:
- self.visitMember(instance, type, "(%s).%s" % (instance, name))
+ if name is None:
+ # Anonymous structure/union member
+ memberInstance = instance
+ else:
+ memberInstance = '(%s).%s' % (instance, name)
+ self.visitMember(instance, type, memberInstance)
def visitArray(self, array, instance):
array_length = self.expand(array.length)
elem_type = pointer.type.mutable()
if isinstance(elem_type, stdapi.Interface):
self.visitInterfacePointer(elem_type, instance)
+ elif isinstance(elem_type, stdapi.Alias) and isinstance(elem_type.type, stdapi.Interface):
+ self.visitInterfacePointer(elem_type.type, instance)
else:
self.visitPointer(pointer, instance)
allocated = False
+ def visitStruct(self, struct, instance):
+ if not self.allocated:
+ # Argument is constant. We need to create a non const
+ print ' {'
+ print " %s * _t = static_cast<%s *>(alloca(sizeof *_t));" % (struct, struct)
+ print ' *_t = %s;' % (instance,)
+ assert instance.startswith('*')
+ print ' %s = _t;' % (instance[1:],)
+ instance = '*_t'
+ self.allocated = True
+ try:
+ return ValueWrapper.visitStruct(self, struct, instance)
+ finally:
+ print ' }'
+ else:
+ return ValueWrapper.visitStruct(self, struct, instance)
+
def visitArray(self, array, instance):
if self.allocated or isinstance(instance, stdapi.Interface):
return ValueWrapper.visitArray(self, array, instance)
self.header(api)
# Includes
- for header in api.headers:
- print header
+ for module in api.modules:
+ for header in module.headers:
+ print header
print
# Generate the serializer functions
# Function wrappers
self.interface = None
self.base = None
- map(self.traceFunctionDecl, api.functions)
- map(self.traceFunctionImpl, api.functions)
+ for function in api.getAllFunctions():
+ self.traceFunctionDecl(function)
+ for function in api.getAllFunctions():
+ self.traceFunctionImpl(function)
print
self.footer(api)
return 'true'
if str(function.type) == 'HRESULT':
return 'SUCCEEDED(_result)'
- return 'false'
+ return 'true'
def serializeArg(self, function, arg):
print ' trace::localWriter.beginArg(%u);' % (arg.index,)