[Xcb] [PATCH libxcb 2/3] generator: support lists of structs which contain a switch
Christian Linhart
chris at DemoRecorder.com
Fri Sep 19 04:55:01 PDT 2014
On 09/09/14 18:09, Ran Benita wrote:
> On Thu, Aug 21, 2014 at 10:35:55PM +0200, Christian Linhart wrote:
[...]
>> Note:
>> This patch also fixes a problem in the generator when
>> a fixed-size list is the last field of a case or bitcase.
>
> I'm not really qualified or have enough time to R-b this one, but from
> what I can see all of these changes make sense and look good.
Will it help when I explain this change in detail,
or shall I wait until somebody else reviews it?
Chris
>
> Ran
>
>> ---
>> src/c_client.py | 14 ++++++++++++--
>> 1 file changed, 12 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/c_client.py b/src/c_client.py
>> index fa59fff..1ed486c 100644
>> --- a/src/c_client.py
>> +++ b/src/c_client.py
>> @@ -354,15 +354,16 @@ def _c_type_setup(self, name, postfix):
>> if field.type.is_list and not field.type.member.fixed_size():
>> field.c_pointer = '*'
>>
>> if field.type.is_switch:
>> field.c_pointer = '*'
>> field.c_field_const_type = 'const ' + field.c_field_type
>> self.c_need_aux = True
>> - elif 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:
>> self.c_need_sizeof = True
>>
>> field.c_iterator_type = _t(field.field_type + ('iterator',)) # xcb_fieldtype_iterator_t
>> field.c_iterator_name = _n(name + (field.field_name, 'iterator')) # xcb_container_field_iterator
>> field.c_accessor_name = _n(name + (field.field_name,)) # xcb_container_field
>> field.c_length_name = _n(name + (field.field_name, 'length')) # xcb_container_field_length
>> field.c_end_name = _n(name + (field.field_name, 'end')) # xcb_container_field_end
>> @@ -766,14 +767,18 @@ def _c_serialize_helper_switch_field(context, self, field, c_switch_variable, pr
>> # call _serialize()/_unpack() to determine the actual size
>> if 'serialize' == context:
>> length = "%s(&%s, %s&%s%s)" % (field.type.c_serialize_name, c_switch_variable,
>> c_field_names, prefix_str, field.c_field_name)
>> elif context in ('unserialize', 'unpack'):
>> length = "%s(xcb_tmp, %s&%s%s)" % (field.type.c_unpack_name,
>> c_field_names, prefix_str, field.c_field_name)
>> + elif 'sizeof' == context:
>> + #remove trailing ", " from c_field_names because it will be used at end of arglist
>> + my_c_field_names = c_field_names[:-2]
>> + length = "%s( xcb_tmp, %s )" % ( field.type.c_sizeof_name, my_c_field_names )
>>
>> return length
>> # _c_serialize_helper_switch_field()
>>
>> def _c_serialize_helper_list_field(context, self, field,
>> code_lines, temp_vars,
>> space, prefix):
>> @@ -1042,15 +1047,20 @@ def _c_serialize_helper_fields(context, self,
>>
>> if 'serialize' == context:
>> if '' != length:
>> code_lines.append('%s xcb_parts[xcb_parts_idx].iov_len = %s;' % (space, length))
>> code_lines.append('%s xcb_parts_idx++;' % space)
>> count += 1
>>
>> - code_lines.append('%s xcb_align_to = ALIGNOF(%s);' % (space, 'char' if field.c_field_type == 'void' else field.c_field_type))
>> + code_lines.append(
>> + '%s xcb_align_to = ALIGNOF(%s);'
>> + % (space,
>> + 'char'
>> + if field.c_field_type == 'void' or field.type.is_switch
>> + else field.c_field_type))
>>
>> need_padding = True
>> if self.c_var_followed_by_fixed_fields:
>> need_padding = False
>>
>> return count
>> # _c_serialize_helper_fields()
>> --
>> 2.0.1
>>
>> _______________________________________________
>> Xcb mailing list
>> Xcb at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/xcb
> _______________________________________________
> Xcb mailing list
> Xcb at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/xcb
>
More information about the Xcb
mailing list