From: Eric Blake <eblake@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: qemu-devel@nongnu.org, Michael Roth <mdroth@linux.vnet.ibm.com>
Subject: Re: [Qemu-devel] [PATCH v2 16/19] qapi: Allow anonymous base for flat union
Date: Fri, 4 Mar 2016 07:32:54 -0700 [thread overview]
Message-ID: <56D99C96.3010007@redhat.com> (raw)
In-Reply-To: <87egbr4sqw.fsf@blackfin.pond.sub.org>
[-- Attachment #1: Type: text/plain, Size: 3753 bytes --]
On 03/03/2016 06:04 AM, Markus Armbruster wrote:
> Eric Blake <eblake@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 #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]
next prev parent reply other threads:[~2016-03-04 14:33 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-02-25 23:38 [Qemu-devel] [PATCH v2 00/19] easier unboxed visits/qapi implicit types Eric Blake
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 01/19] qapi: Rename 'fields' to 'members' in internal interface Eric Blake
2016-03-02 17:15 ` Markus Armbruster
2016-03-02 20:05 ` Eric Blake
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 02/19] qapi-visit: Expose visit_type_FOO_members() Eric Blake
2016-03-02 17:24 ` Markus Armbruster
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 03/19] qapi: Update docs to match recent generator changes Eric Blake
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 04/19] chardev: Shorten references into ChardevBackend Eric Blake
2016-03-02 17:55 ` Markus Armbruster
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 05/19] util: Shorten references into SocketAddress Eric Blake
2016-03-02 18:03 ` Markus Armbruster
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 06/19] ui: Shorten references into InputEvent Eric Blake
2016-03-01 15:32 ` [Qemu-devel] [PATCH v2.5 " Eric Blake
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 07/19] qapi: Avoid use of 'data' member of qapi unions Eric Blake
2016-03-02 18:18 ` Markus Armbruster
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 08/19] chardev: Drop useless ChardevDummy type Eric Blake
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 09/19] qapi: Drop useless 'data' member of unions Eric Blake
2016-03-02 18:30 ` Markus Armbruster
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 10/19] qapi-visit: Factor out gen_visit_members_call() Eric Blake
2016-03-02 18:53 ` Markus Armbruster
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 11/19] qapi: Add type.is_empty() helper Eric Blake
2016-03-02 19:04 ` Markus Armbruster
2016-03-02 20:16 ` Eric Blake
2016-03-03 7:08 ` Markus Armbruster
2016-03-02 23:04 ` Eric Blake
2016-03-03 7:18 ` Markus Armbruster
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 12/19] qapi: Fix command with named empty argument type Eric Blake
2016-03-03 8:54 ` Markus Armbruster
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 13/19] qapi-visit: Simplify visit of empty branch in union Eric Blake
2016-03-03 9:14 ` Markus Armbruster
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 14/19] qapi: Don't special-case simple union wrappers Eric Blake
2016-03-03 10:59 ` Markus Armbruster
2016-03-03 16:12 ` Eric Blake
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 15/19] qapi-visit: Move error check into gen_visit_members_call() Eric Blake
2016-03-03 11:56 ` Markus Armbruster
2016-03-04 14:27 ` Eric Blake
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 16/19] qapi: Allow anonymous base for flat union Eric Blake
2016-03-03 13:04 ` Markus Armbruster
2016-03-04 14:32 ` Eric Blake [this message]
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 17/19] qapi: Use anonymous base in SchemaInfo Eric Blake
2016-03-03 13:06 ` Markus Armbruster
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 18/19] qapi: Use anonymous base in CpuInfo Eric Blake
2016-03-03 13:08 ` Markus Armbruster
2016-03-04 14:35 ` Eric Blake
2016-02-25 23:38 ` [Qemu-devel] [PATCH v2 19/19] qapi: Make c_type() more OO-like Eric Blake
2016-03-03 13:29 ` Markus Armbruster
2016-03-04 14:37 ` Eric Blake
2016-03-01 15:02 ` [Qemu-devel] [PATCH v2 00/19] easier unboxed visits/qapi implicit types Markus Armbruster
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=56D99C96.3010007@redhat.com \
--to=eblake@redhat.com \
--cc=armbru@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.