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 v10 05/13] qapi-visit: Simplify how we visit common union members
Date: Tue, 16 Feb 2016 10:17:01 -0700 [thread overview]
Message-ID: <56C3598D.5000203@redhat.com> (raw)
In-Reply-To: <87bn7gpqf9.fsf@blackfin.pond.sub.org>
[-- Attachment #1: Type: text/plain, Size: 3893 bytes --]
On 02/16/2016 09:31 AM, Markus Armbruster wrote:
> Eric Blake <eblake@redhat.com> writes:
>
>> From: Markus Armbruster <armbru@redhat.com>
>>
>> For a simple union SU, gen_visit_union() generates a visit of its
>> single tag member, like this:
>>
>> visit_type_SUKind(v, "type", &(*obj)->type, &err);
>>
>> For a flat union FU with base B, it generates a visit of its base
>> fields:
>>
>> visit_type_B_fields(v, (B **)obj, &err);
>>
>> Instead, we can simply visit the common members using the same fields
>> visit function we use for structs, generated with
>> gen_visit_struct_fields(). This function visits the base if any, then
>> the local members.
>>
>> For a simple union SU, visit_type_SU_fields() contains exactly the old
>> tag member visit, because there is no base, and the tag member is the
>> only member. For instance, the code generated for qapi-schema.json's
>> KeyValue changes like this:
>>
>> +static void visit_type_KeyValue_fields(Visitor *v, KeyValue **obj, Error **errp)
>> +{
>> + Error *err = NULL;
>> +
>> + visit_type_KeyValueKind(v, "type", &(*obj)->type, &err);
>> + error_propagate(errp, err);
>> +}
>> +
This is one of the places that is several lines longer if we always emit
the goto and label. If we drop 3 and 4, then the commit message needs a
rebase.
>> void visit_type_KeyValue(Visitor *v, const char *name, KeyValue **obj, Error **errp)
>> {
>> Error *err = NULL;
>> @@ -4863,7 +4911,7 @@ void visit_type_KeyValue(Visitor *v, con
>> if (!*obj) {
>> goto out_obj;
>> }
>> - visit_type_KeyValueKind(v, "type", &(*obj)->type, &err);
>> + visit_type_KeyValue_fields(v, obj, &err);
>> if (err) {
>> goto out_obj;
>> }
>>
>> For a flat union FU, visit_type_FU_fields() contains exactly the old
>> base fields visit, because there is a base, but no members. For
>> instance, the code generated for qapi-schema.json's CpuInfo changes
>> like this:
>>
>> static void visit_type_CpuInfoBase_fields(Visitor *v, CpuInfoBase **obj, Error **errp);
>>
>> +static void visit_type_CpuInfo_fields(Visitor *v, CpuInfo **obj, Error **errp)
>> +{
>> + Error *err = NULL;
>> +
>> + visit_type_CpuInfoBase_fields(v, (CpuInfoBase **)obj, &err);
>> + error_propagate(errp, err);
>> +}
And another beneficiary of the omitted goto that gets longer.
>> +
>> static void visit_type_CpuInfoX86_fields(Visitor *v, CpuInfoX86 **obj, Error **errp)
>> ...
>> @@ -3485,7 +3509,7 @@ void visit_type_CpuInfo(Visitor *v, cons
>> if (!*obj) {
>> goto out_obj;
>> }
>> - visit_type_CpuInfoBase_fields(v, (CpuInfoBase **)obj, &err);
>> + visit_type_CpuInfo_fields(v, obj, &err);
>> if (err) {
>> goto out_obj;
>> }
>>
>> As you see, the generated code grows a bit, but in practice, it's lost
>> in the noise: qapi-schema.json's qapi-visit.c gains roughly 1%.
>>
>> This simplification became possible with commit 441cbac "qapi-visit:
>> Convert to QAPISchemaVisitor, fixing bugs". It's a step towards
>> unifying gen_struct() and gen_union().
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> Message-Id: <1453902888-20457-2-git-send-email-armbru@redhat.com>
>> [rebase to avoid pointless gotos in new code]
>
> Also: examples in commit message replaced by better ones :)
I picked the shortest names possible, to minimize the length of the
commit message, and favoring qapi-schema.json over the testsuite. You
noticed :)
>
>> Signed-off-by: Eric Blake <eblake@redhat.com>
>
--
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-02-16 17:17 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-02-16 0:20 [Qemu-devel] [PATCH v10 00/13] prune some QAPI visitor cruft (was qapi cleanups subset E) Eric Blake
2016-02-16 0:20 ` [Qemu-devel] [PATCH v10 01/13] qapi: Simplify excess input reporting in input visitors Eric Blake
2016-02-16 0:20 ` [Qemu-devel] [PATCH v10 02/13] qapi: Forbid empty unions and useless alternates Eric Blake
2016-02-16 16:08 ` Markus Armbruster
2016-02-16 23:18 ` Eric Blake
2016-02-16 0:20 ` [Qemu-devel] [PATCH v10 03/13] qapi: Reposition error checks in gen_visit_fields() Eric Blake
2016-02-16 0:20 ` [Qemu-devel] [PATCH v10 04/13] qapi: Drop pointless gotos in generated code Eric Blake
2016-02-16 16:27 ` Markus Armbruster
2016-02-16 17:14 ` Eric Blake
2016-02-16 0:20 ` [Qemu-devel] [PATCH v10 05/13] qapi-visit: Simplify how we visit common union members Eric Blake
2016-02-16 16:31 ` Markus Armbruster
2016-02-16 17:17 ` Eric Blake [this message]
2016-02-16 0:20 ` [Qemu-devel] [PATCH v10 06/13] qapi-visit: Unify struct and union visit Eric Blake
2016-02-16 0:20 ` [Qemu-devel] [PATCH v10 07/13] qapi-visit: Less indirection in visit_type_Foo_fields() Eric Blake
2016-02-16 0:20 ` [Qemu-devel] [PATCH v10 08/13] qapi: Adjust layout of FooList types Eric Blake
2016-02-16 16:55 ` Markus Armbruster
2016-02-16 0:20 ` [Qemu-devel] [PATCH v10 09/13] qapi: Emit structs used as variants in topological order Eric Blake
2016-02-16 17:03 ` Markus Armbruster
2016-02-16 17:32 ` Eric Blake
2016-02-16 21:00 ` Markus Armbruster
2016-02-16 0:20 ` [Qemu-devel] [PATCH v10 10/13] qapi: Don't box struct branch of alternate Eric Blake
2016-02-16 19:07 ` Markus Armbruster
2016-02-16 19:53 ` Eric Blake
2016-02-17 14:40 ` Markus Armbruster
2016-02-17 20:34 ` Eric Blake
2016-02-18 8:21 ` Markus Armbruster
2016-02-16 0:20 ` [Qemu-devel] [PATCH v10 11/13] qapi: Don't box branches of flat unions Eric Blake
2016-02-17 17:44 ` Markus Armbruster
2016-02-17 20:53 ` Eric Blake
2016-02-18 8:51 ` Markus Armbruster
2016-02-18 16:51 ` Eric Blake
2016-02-18 17:11 ` Markus Armbruster
2016-02-16 0:20 ` [Qemu-devel] [PATCH v10 12/13] qapi: Delete unused visit_start_union() Eric Blake
2016-02-17 18:08 ` Markus Armbruster
2016-02-17 21:19 ` Eric Blake
2016-02-18 8:24 ` Markus Armbruster
2016-02-18 16:47 ` Eric Blake
2016-02-16 0:20 ` [Qemu-devel] [PATCH v10 13/13] qapi: Change visit_start_implicit_struct to visit_start_alternate Eric Blake
2016-02-17 18:13 ` 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=56C3598D.5000203@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.