[Xcb] [PATCH libxcb 2/3] generator: support lists of structs which contain a switch

Ran Benita ran234 at gmail.com
Tue Sep 9 09:09:09 PDT 2014


On Thu, Aug 21, 2014 at 10:35:55PM +0200, Christian Linhart wrote:
> This essentially requires to have a correct sizeof-function
> for the struct.
> This in turn requires a sizeof-function for the switch, too.
> 
> Making a sizeof-function for the switch is triggered by
> replacing "elif" by "if" in the first change of this patch.
> This way, c_need_sizeof is also set to True for switches if appropriate.
> 
> The _c_serialize_helper_switch_field function has to support
> the context "sizeof":
> This is done in the second change of this patch
> 
> The third change of this patch fixes an alignment error:
> It does not make sense to base the padding on the struct-type
> which is generated for switch because this struct does not
> represent the protocol. Rather it is the output of deserialization.
> ( The implicit padding for var-sized fields has other issues, IMHO,
> but I am not touching these now...)
> 
> The effect on the generated code for the current xml-files
> is as follows:
> * several additional sizeof-functions are generated
> * the fix of the alignment error only changes one place
>   in the XKB-extension for the GetKbdByName-reply.
>   This is no problem because that reply in its current form
>   is broken/unfinished anyways.
> 
> 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.

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


More information about the Xcb mailing list