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 v8 05/17] qapi: Track simple union tag in object.local_members
Date: Fri, 30 Oct 2015 10:32:49 -0600 [thread overview]
Message-ID: <56339BB1.1090800@redhat.com> (raw)
In-Reply-To: <87lhakjz3d.fsf@blackfin.pond.sub.org>
[-- Attachment #1: Type: text/plain, Size: 4179 bytes --]
On 10/30/2015 06:54 AM, Markus Armbruster wrote:
> Eric Blake <eblake@redhat.com> writes:
>
>> We were previously creating all unions with an empty list for
>> local_members. However, it will make it easier to unify struct
>> and union generation if we include the generated tag member in
>> local_members. That way, we can have a common code pattern:
>> visit the base (if any), visit the local members (if any), visit
>> the variants (if any). The local_members of a flat union
>> remains empty (because the discriminator is already visited as
>> part of the base).
>
> Keeping the implicit tag implicit by not including it in local_members
> was a conscious design decision, but if including it makes unifying
> struct and union into objects easier, go right ahead.
>
>> The various front end entities then map as follows:
>> struct: optional base, optional local_members, no variants
>> simple union: no base, one-element local_members, variants with tag_member
>> from local_members
>> flat union: base, no local_members, variants with tag_member from base
>> alternate: no base, no local_members, variants
>>
>> With the new local members, we require a bit of finesse to
>> avoid assertions in the clients. No change to generated code.
>>
>> Signed-off-by: Eric Blake <eblake@redhat.com>
>>
>> +++ b/scripts/qapi-types.py
>> @@ -269,7 +269,9 @@ class QAPISchemaGenTypeVisitor(QAPISchemaVisitor):
>> def visit_object_type(self, name, info, base, members, variants):
>> self._fwdecl += gen_fwd_object_or_array(name)
>> if variants:
>> - assert not members # not implemented
>> + 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)
>
> The assertion checks that not passing members to gen_union() won't lose
> any. Before the patch, we assert there are none. After the patch, we
> assert there's either none or variants.tag_member. Before ans after,
> gen_union() takes care of variants.tag_member. Okay.
>
> Let's keep the comment, though. Perhaps like this:
>
> # Members other than variants.tag_member not implemented
> assert len(members) == 1
> assert members[0] == variants.tag_member
Indeed, that sounds nicer.
>
> I hope this the whole conditional will eventually be replaced by
>
> self.decl += gen_object(name, base, members, variants)
Yes. It goes away in 6/17 for qapi-types (as you already saw), and I
have a later patch queued that likewise makes it go away for qapi-visit
(but not in subset C or D, since there's still a bit more to clean up
there first).
>> def check(self, schema, members, seen):
>> - if self.tag_name:
>> + if self.tag_name: # flat union
>> self.tag_member = seen[self.tag_name]
>> - else:
>> + elif seen: # simple union
>> + assert self.tag_member in seen.itervalues()
>> + else: # alternate
>> self.tag_member.check(schema, members, seen)
>> assert isinstance(self.tag_member.type, QAPISchemaEnumType)
>> for v in self.variants:
>
> The test for simple union is hackish.
>
> I guess you want to bypass self.tag_member.check() when for simple
> unions, because it's now checked when QAPISchemaObjectType.check() calls
> QAPISchemaObjectTypeMember.check() for each of self.local_members.
>
> Could we instead make QAPISchemaAlternateType.check() call
> QAPISchemaObjectTypeMember.check() for its implicit tag, and drop the
> else here?
I debated about that when writing my patch. Yes, I can make that change
(it seems a little bit unclean to be calling
self.variants.tag_member.check() in QAPISchemaAlternateType, but not too
much worse; and adding a comment might help).
--
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:[~2015-10-30 16:33 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-10-28 17:14 [Qemu-devel] [PATCH v8 00/17] alternate layout (post-introspection cleanups, subset C) Eric Blake
2015-10-28 17:14 ` [Qemu-devel] [PATCH v8 01/17] qapi: Use generated TestStruct machinery in tests Eric Blake
2015-10-28 17:14 ` [Qemu-devel] [PATCH v8 02/17] qapi: Strengthen test of TestStructList Eric Blake
2015-10-28 17:14 ` [Qemu-devel] [PATCH v8 03/17] qapi: Provide nicer array names in introspection Eric Blake
2015-10-28 17:14 ` [Qemu-devel] [PATCH v8 04/17] qapi-introspect: Guarantee particular sorting Eric Blake
2015-10-30 11:20 ` Markus Armbruster
2015-10-30 15:41 ` Eric Blake
2015-10-28 17:14 ` [Qemu-devel] [PATCH v8 05/17] qapi: Track simple union tag in object.local_members Eric Blake
2015-10-30 12:54 ` Markus Armbruster
2015-10-30 16:32 ` Eric Blake [this message]
2015-10-28 17:14 ` [Qemu-devel] [PATCH v8 06/17] qapi-types: Consolidate gen_struct() and gen_union() Eric Blake
2015-10-30 13:01 ` Markus Armbruster
2015-10-30 16:36 ` Eric Blake
2015-10-28 17:14 ` [Qemu-devel] [PATCH v8 07/17] qapi: Rework collision assertions Eric Blake
2015-11-02 15:37 ` Markus Armbruster
2015-11-02 17:20 ` Eric Blake
2015-11-02 21:24 ` Eric Blake
2015-11-03 7:56 ` Markus Armbruster
2015-11-03 13:30 ` Eric Blake
2015-11-02 22:41 ` [Qemu-devel] [PATCH v8.5 0/4] rework of 7/17 Eric Blake
2015-11-02 22:41 ` [Qemu-devel] [PATCH v8.5 1/4] qapi: Drop all_members parameter from check() Eric Blake
2015-11-03 11:06 ` Markus Armbruster
2015-11-03 13:26 ` Eric Blake
2015-11-03 14:02 ` Markus Armbruster
2015-11-03 14:12 ` Eric Blake
2015-11-03 16:19 ` Markus Armbruster
2015-11-03 17:34 ` Eric Blake
2015-11-03 14:04 ` [Qemu-devel] [PATCH 1/7] qapi: Drop obsolete tag value collision assertions Markus Armbruster
2015-11-03 14:04 ` [Qemu-devel] [PATCH 2/7] qapi: Simplify QAPISchemaObjectTypeMember.check() Markus Armbruster
2015-11-03 14:04 ` [Qemu-devel] [PATCH 3/7] qapi: Clean up after previous commit Markus Armbruster
2015-11-03 14:04 ` [Qemu-devel] [PATCH 4/7] qapi: Fix up commit 7618b91's clash sanity checking change Markus Armbruster
2015-11-03 14:04 ` [Qemu-devel] [PATCH 5/7] qapi: Eliminate QAPISchemaObjectType.check() variable members Markus Armbruster
2015-11-03 14:04 ` [Qemu-devel] [PATCH 6/7] qapi: Factor out QAPISchemaObjectTypeMember.check_clash() Markus Armbruster
2015-11-03 14:04 ` [Qemu-devel] [PATCH 7/7] qapi: QAPISchemaObjectTypeVariants.check() Markus Armbruster
2015-11-02 22:41 ` [Qemu-devel] [PATCH v8.5 2/4] qapi: Check for QMP collisions of flat union branches Eric Blake
2015-11-02 22:41 ` [Qemu-devel] [PATCH v8.5 3/4] qapi: Fix check for variant tag values collision Eric Blake
2015-11-02 22:41 ` [Qemu-devel] [PATCH v8.5 4/4] qapi: Consolidate collision detection code Eric Blake
2015-10-28 17:14 ` [Qemu-devel] [PATCH v8 08/17] qapi: Remove outdated tests related to QMP/branch collisions Eric Blake
2015-11-03 16:32 ` Markus Armbruster
2015-10-28 17:14 ` [Qemu-devel] [PATCH v8 09/17] qapi: Add positive tests to qapi-schema-test Eric Blake
2015-11-03 16:43 ` Markus Armbruster
2015-11-03 16:56 ` Eric Blake
2015-10-28 17:14 ` [Qemu-devel] [PATCH v8 10/17] qapi: Simplify visiting of alternate types Eric Blake
2015-11-03 18:30 ` Markus Armbruster
2015-11-03 18:59 ` Eric Blake
2015-11-04 7:30 ` Markus Armbruster
2015-11-04 16:03 ` Markus Armbruster
2015-11-04 20:52 ` Eric Blake
2015-11-05 7:17 ` Markus Armbruster
2015-10-28 17:14 ` [Qemu-devel] [PATCH v8 11/17] qapi: Fix alternates that accept 'number' but not 'int' Eric Blake
2015-10-28 17:14 ` [Qemu-devel] [PATCH v8 12/17] qapi: Remove dead visitor code Eric Blake
2015-10-28 17:14 ` [Qemu-devel] [PATCH v8 13/17] qapi: Plug leaks in test-qmp-* Eric Blake
2015-10-28 17:14 ` [Qemu-devel] [PATCH v8 14/17] qapi: Simplify error testing " Eric Blake
2015-10-28 17:14 ` [Qemu-devel] [PATCH v8 15/17] qapi: Test failure in middle of array parse Eric Blake
2015-10-28 17:14 ` [Qemu-devel] [PATCH v8 16/17] qapi: More tests of input arrays Eric Blake
2015-10-28 17:14 ` [Qemu-devel] [PATCH v8 17/17] qapi: Simplify visits of optional fields Eric Blake
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=56339BB1.1090800@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.