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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).