On 03/03/2016 06:04 AM, Markus Armbruster wrote:
> Eric Blake <ebl...@redhat.com> writes:
> 
>> Rather than requiring all flat unions to explicitly create
>> a separate base struct, we can allow the qapi schema to specify
>> the common members via an inline dictionary. This is similar to
>> how commands can specify an inline anonymous type for its 'data',
> 
> Suggest to end the sentence here, and then...
> 
>> and matches the fact that our code base already has several
>> flat unions that had to create a separate base type that is used
>> nowhere but in the union.
> 
> "We already have several struct types that only exist to serve as a
> single flat union's base.  The next commits will clean them up."
> 
> Replace "them" by "some" if you don't clean them all up.
> 
> It's a nice step towards having a variant record type in the schema
> language similar to what we have in introspection.
> 

>> @@ -63,7 +62,8 @@ void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s 
>> *obj, Error **errp)
>>                  c_name=c_name(name))
>>
>>      if base:
>> -        ret += gen_visit_members_call(base, '(%s *)obj' % base.c_name())
>> +        ret += gen_visit_members_call(base, 'qapi_%s_base(obj)' % 
>> c_name(name),
> 
> I started at this for several minutes until I could guess what's going
> on here.
> 
> The old code works fine when the type isn't implicit.
> 
> When it is, it fails the assertion in base.c_name(), even though
> gen_visit_members_call() is not going to use its value.
> 
> You hack around it by passing 'qapi_NAME_base(obj)' instead.
> 
> If NAME isn't implicit, the function exists, and does the same as the
> expression it replaces.
> 
> If NAME is implicit, the function doesn't exist, but
> gen_visit_members_call() doesn't care, because it doesn't use the
> argument then.
> 
> Ugh!  More evidence that we better not munge the two cases together into
> one function.

Even with my v4 work towards exposing implicit types as a concrete
struct, I'm still not creating qapi_NAME_base(obj) for objects with an
implicit type.  But '(_obj_FOO_base *)FOO' works well for a base with a
concrete implicit base type.


>> @@ -354,7 +355,7 @@ code generator can ensure that branches exist for all 
>> values of the
>>  enum (although the order of the keys need not match the declaration of
>>  the enum).  In the resulting generated C data types, a flat union is
>>  represented as a struct with the base member fields included directly,
>> -and then a union of structures for each branch of the struct.
>> +and then a union of pointers to structures for each branch of the struct.
> 
> Uh, that became wrong in commit 544a373 already, didn't it?
> 
> Is that a bug in PATCH 3 then?

Yes, and fixed up accordingly in my v3 respin.  (I think it was some
rebase conflicts that I resolved incorrectly at some point).


>> +++ b/tests/qapi-schema/qapi-schema-test.json
>> @@ -75,14 +75,10 @@
>>    'base': 'UserDefZero',
>>    'data': { 'string': 'str', 'enum1': 'EnumOne' } }
>>
>> -{ 'struct': 'UserDefUnionBase2',
>> -  'base': 'UserDefZero',
>> -  'data': { 'string': 'str', 'enum1': 'QEnumTwo' } }
>> -
>>  # this variant of UserDefFlatUnion defaults to a union that uses fields with
>>  # allocated types to test corner cases in the cleanup/dealloc visitor
>>  { 'union': 'UserDefFlatUnion2',
>> -  'base': 'UserDefUnionBase2',
>> +  'base': { 'string': 'str', 'enum1': 'QEnumTwo' },
> 
> You lost member 'integer' from the base's base.  Harmless (I think), but
> visible when you compare generated output.

Easy enough to keep.

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to