On 10/30/2015 07:01 AM, Markus Armbruster wrote: > Eric Blake <[email protected]> writes: > >> These two methods are now close enough that we can finally merge >> them, relying on the fact that simple unions now provide a >> reasonable local_members. Change gen_struct() to gen_object() >> that handles all forms of QAPISchemaObjectType, and rename and >> shrink gen_union() to gen_variants() to handle the portion of >> gen_object() needed when variants are present. >> >> gen_struct_fields() now has a single caller, so it no longer >> needs an optional parameter; however, I did not choose to inline >> it into the caller. >> >> No difference to generated code. >> >> Signed-off-by: Eric Blake <[email protected]> >>
>> def visit_object_type(self, name, info, base, members, variants):
>> self._fwdecl += gen_fwd_object_or_array(name)
>> - if variants:
>> - if members:
>> - assert len(members) == 1
>> - assert members[0] == variants.tag_member
>> - self.decl += gen_union(name, base, variants)
>> - else:
>> - self.decl += gen_struct(name, base, members)
>> + self.decl += gen_object(name, base, members, variants)
>> if base:
>> self.decl += gen_upcast(name, base)
>> self._gen_type_cleanup(name)
>> @@ -282,7 +268,7 @@ class QAPISchemaGenTypeVisitor(QAPISchemaVisitor):
>> def visit_alternate_type(self, name, info, variants):
>> self._fwdecl += gen_fwd_object_or_array(name)
>> self._fwdefn += gen_alternate_qtypes(name, variants)
>> - self.decl += gen_union(name, None, variants)
>> + self.decl += gen_object(name, None, [variants.tag_member], variants)
>> self.decl += gen_alternate_qtypes_decl(name)
>> self._gen_type_cleanup(name)
>
> Turned out nicely.
Yes, I was pretty pleased with it. It gives more credence to our choice
of introspection representation.
>
> We could morph gen_struct_field() back into its original shape in a
> separate patch:
>
> def gen_struct_fields(members):
> ret = ''
>
> for memb in members:
> ret += gen_struct_field(memb.name, memb.type, memb.optional)
> return ret
>
> with calling code
>
> ret += mcgen('''
> /* Members inherited from %(c_name)s: */
> ''',
> c_name=base.c_name())
> ret += gen_struct_fields(base.members)
> ret += mcgen('''
> /* Own members: */
> ''')
> ret += gen_struct_fields(local_members)
>
> Matter of taste.
Reasonable idea; I'll add it in for the v9 spin.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature
