if self.need_sizeof:
if self.c_sizeof_name not in finished_sizeof:
- finished_sizeof.append(self.c_sizeof_name)
- _c_serialize('sizeof', self)
+ if not module.namespace.is_ext or self.name[:2] == module.namespace.prefix:
+ finished_sizeof.append(self.c_sizeof_name)
+ _c_serialize('sizeof', self)
# _c_type_setup()
def _c_helper_absolute_name(prefix, field=None):
return
elif self.var_followed_by_fixed_fields:
# special case: call _unserialize()
- _c(' %s *_aux = NULL;', self.c_type)
- _c(' return %s(%s, &_aux);', self.c_unserialize_name, reduce(lambda x,y: "%s, %s" % (x, y), param_names))
+ _c(' return %s(%s, NULL);', self.c_unserialize_name, reduce(lambda x,y: "%s, %s" % (x, y), param_names))
_c('}')
return
else:
# allocate memory and copy everything into a continuous memory area
# note: this is not necessary in case of unpack
if context in ('serialize', 'unserialize'):
+ # unserialize: check for sizeof-only invocation
+ if 'unserialize' == context:
+ _c('')
+ _c(' if (NULL == _aux)')
+ _c(' return xcb_buffer_len;')
+
_c('')
_c(' if (NULL == %s) {', aux_ptr)
_c(' /* allocate memory */')
_c(' xcb_generic_iterator_t child;')
_c(' child.data = (%s *)(((char *)R) + %s(R));',
self.c_type, self.c_sizeof_name)
+ _c(' i->index = (char *) child.data - (char *) i->data;')
else:
_c(' xcb_generic_iterator_t child = %s;', _c_iterator_get_end(self.last_varsized_field, 'R'))
+ _c(' i->index = child.index;')
_c(' --i->rem;')
_c(' i->data = (%s *) child.data;', self.c_type)
- _c(' i->index = child.index;')
+
else:
_c(' --i->rem;')
_c(' ++i->data;')
_c(' %s xcb_out;', self.c_type)
if self.var_followed_by_fixed_fields:
_c(' /* in the protocol description, variable size fields are followed by fixed size fields */')
- _c(' char *xcb_aux = 0;')
+ _c(' void *xcb_aux = 0;')
for idx, f in enumerate(serial_fields):