c_client: Don't serialise non-wire fields

For when we have a variable-sized field followed by a fixed field, make
sure we do not serialise non-wire fields.

Signed-off-by: Daniel Stone <daniels@collabora.com>
This commit is contained in:
Daniel Stone 2017-04-26 17:54:01 +02:00
parent d10194a321
commit c7aa4e682f

View File

@ -458,7 +458,7 @@ def _c_type_setup(self, name, postfix):
field.c_field_const_type = 'const ' + field.c_field_type field.c_field_const_type = 'const ' + field.c_field_type
self.c_need_aux = True self.c_need_aux = True
if not field.type.fixed_size() and not field.type.is_case_or_bitcase: if not field.type.fixed_size() and not field.type.is_case_or_bitcase and field.wire:
self.c_need_sizeof = True self.c_need_sizeof = True
field.c_iterator_type = _t(field.field_type + ('iterator',)) # xcb_fieldtype_iterator_t field.c_iterator_type = _t(field.field_type + ('iterator',)) # xcb_fieldtype_iterator_t
@ -497,7 +497,7 @@ def _c_type_setup(self, name, postfix):
_c_type_setup(field.type, field.field_type, ()) _c_type_setup(field.type, field.field_type, ())
if field.type.is_list: if field.type.is_list:
_c_type_setup(field.type.member, field.field_type, ()) _c_type_setup(field.type.member, field.field_type, ())
if (field.type.nmemb is None): if (field.type.nmemb is None and field.wire):
self.c_need_sizeof = True self.c_need_sizeof = True
if self.c_need_serialize: if self.c_need_serialize:
@ -1170,6 +1170,8 @@ def _c_serialize_helper_fields(context, self,
_c_pre.push_indent(space + ' ') _c_pre.push_indent(space + ' ')
for field in self.fields: for field in self.fields:
if not field.wire:
continue
if not field.visible: if not field.visible:
if not ((field.wire and not field.auto) or 'unserialize' == context): if not ((field.wire and not field.auto) or 'unserialize' == context):
continue continue
@ -1194,7 +1196,9 @@ def _c_serialize_helper_fields(context, self,
# fields with variable size # fields with variable size
else: else:
if field.type.is_pad: if not field.wire:
continue
elif field.type.is_pad:
# Variable length pad is <pad align= /> # Variable length pad is <pad align= />
code_lines.append('%s xcb_align_to = %d;' % (space, field.type.align)) code_lines.append('%s xcb_align_to = %d;' % (space, field.type.align))
count += _c_serialize_helper_insert_padding(context, self, code_lines, space, count += _c_serialize_helper_insert_padding(context, self, code_lines, space,
@ -2308,7 +2312,7 @@ def _c_request_helper(self, name, void, regular, aux=False, reply_fds=False):
count = 2 count = 2
if not self.c_var_followed_by_fixed_fields: if not self.c_var_followed_by_fixed_fields:
for field in param_fields: for field in param_fields:
if not field.type.fixed_size(): if not field.type.fixed_size() and field.wire:
count = count + 2 count = count + 2
if field.type.c_need_serialize: if field.type.c_need_serialize:
# _serialize() keeps track of padding automatically # _serialize() keeps track of padding automatically
@ -2379,7 +2383,7 @@ def _c_request_helper(self, name, void, regular, aux=False, reply_fds=False):
count = 4 count = 4
for field in param_fields: for field in param_fields:
if not field.type.fixed_size(): if field.wire and not field.type.fixed_size():
_c(' /* %s %s */', field.type.c_type, field.c_field_name) _c(' /* %s %s */', field.type.c_type, field.c_field_name)
# default: simple cast to char * # default: simple cast to char *
if not field.type.c_need_serialize and not field.type.c_need_sizeof: if not field.type.c_need_serialize and not field.type.c_need_sizeof: