qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
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 24/30] qapi: Factor out QAPISchemaObjectType.check_clash()
Date: Tue, 10 Nov 2015 06:19:38 -0700	[thread overview]
Message-ID: <5641EEEA.2010903@redhat.com> (raw)
In-Reply-To: <87k2pq2p1d.fsf@blackfin.pond.sub.org>

[-- Attachment #1: Type: text/plain, Size: 4234 bytes --]

On 11/10/2015 02:15 AM, Markus Armbruster wrote:

>> On the other hand, we've been arguing that check() should populate
>> everything after construction prior to anything else being run; and not
>> running Variant.type.check() during Variants.check() of flat unions
>> feels like we may have a hole (a flat union will have to inline its
>> types to the overall JSON object, and inlining types requires access to
>> type.members - but as written, we aren't populating them until
>> Variants.check_clash()).  I can play with hoisting the type.check() out
>> of type.check_clash() and instead keep base.check() in type.check(), and
>> add variant.type.check() in Variants.check() (but only for unions, not
>> for alternates), if you are interested.
> 
> My "qapi: Factor out QAPISchemaObjectTypeMember.check_clash()" adds
> QAPISchemaObjectTypeMember.check_clash() without changing the common
> protocol.  The new QAPISchemaObjectTypeMember.check_clash() is merely a
> helper for QAPISchemaObjectType.check().
> 
> The two .check_clash() you add (one in this patch, one in the previous
> one) are different: both contain calls of QAPISchemaObjectType.check().
> 
> I feel the .check() calls are too important to be buried deep like that.
> I'd stick to prior practice and put the .check() calls right into
> .check().  Obviously, the .check_clash() methods may only called after
> .check() then, but that's nothing new.
> 
> Fixup for your previous patch:
> 
> diff --git a/scripts/qapi.py b/scripts/qapi.py
> index 4c56935..357127d 100644
> --- a/scripts/qapi.py
> +++ b/scripts/qapi.py
> @@ -1065,7 +1065,6 @@ class QAPISchemaObjectTypeVariants(object):
>              vseen = dict(seen)
>              assert isinstance(v.type, QAPISchemaObjectType)
>              assert not v.type.variants       # not implemented
> -            v.type.check(schema)
>              for m in v.type.members:
>                  m.check_clash(vseen)
>  
> @@ -1077,6 +1076,7 @@ class QAPISchemaObjectTypeVariant(QAPISchemaObjectTypeMember):
>      def check(self, schema, tag_type):
>          QAPISchemaObjectTypeMember.check(self, schema)
>          assert self.name in tag_type.values
> +        self.type.check(schema)
>  

Won't quite work.  You are right that we must call
self.type.check(schema) for variants used by a union; but calling it for
ALL variants used by an alternate is wrong, because self.type for at
least one branch of an alternate will not be an instance of
QAPISchemaObjectType.  However, I'm currently testing whether it is safe
to check to just blindly check an object branch of an alternate, if
present (and that should not lead to cycles, since alternates have no
base class and since we don't allow one alternate type as a variant of
another alternate), in which case the fixup for 23/30 is more like:

diff --git i/scripts/qapi.py w/scripts/qapi.py
index a005c87..25fa642 100644
--- i/scripts/qapi.py
+++ w/scripts/qapi.py
@@ -1065,7 +1065,6 @@ class QAPISchemaObjectTypeVariants(object):
             vseen = dict(seen)
             assert isinstance(v.type, QAPISchemaObjectType)
             assert not v.type.variants       # not implemented
-            v.type.check(schema)
             for m in v.type.members:
                 m.check_clash(vseen)

@@ -1077,6 +1076,8 @@ class
QAPISchemaObjectTypeVariant(QAPISchemaObjectTypeMember):
     def check(self, schema, tag_type):
         QAPISchemaObjectTypeMember.check(self, schema)
         assert self.name in tag_type.values
+        if isinstance(self.type, QAPISchemaObjectType):
+            self.type.check(schema)

     # This function exists to support ugly simple union special cases
     # TODO get rid of them, and drop the function
@@ -1098,6 +1099,8 @@ class QAPISchemaAlternateType(QAPISchemaType):

     def check(self, schema):
         self.variants.tag_member.check(schema)
+        # Not calling self.variants.check_clash(), because there's
+        # nothing to clash with
         self.variants.check(schema, {})

     def json_type(self):




-- 
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 --]

  reply	other threads:[~2015-11-10 13:19 UTC|newest]

Thread overview: 85+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-06  6:35 [Qemu-devel] [PATCH v10 00/30] qapi member collision (post-introspection cleanups, subset C') Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 01/30] qapi: Use generated TestStruct machinery in tests Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 02/30] qapi: Strengthen test of TestStructList Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 03/30] qobject: Protect against use-after-free in qobject_decref() Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 04/30] qapi: Share test_init code in test-qmp-input* Eric Blake
2015-11-06 15:17   ` Markus Armbruster
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 05/30] qapi: Plug leaks in test-qmp-* Eric Blake
2015-11-06 15:21   ` Markus Armbruster
2015-11-06 15:49     ` Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 06/30] qapi: Simplify non-error testing " Eric Blake
2015-11-06 15:36   ` Markus Armbruster
2015-11-06 15:54     ` Eric Blake
2015-11-06 16:24       ` Markus Armbruster
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 07/30] qapi: Simplify error cleanup " Eric Blake
2015-11-06 15:40   ` Markus Armbruster
2015-11-06 15:59     ` Eric Blake
2015-11-06 16:23       ` Markus Armbruster
2015-11-06 16:32         ` Eric Blake
2015-11-06 17:04   ` [Qemu-devel] [PATCH] fixup! " Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 08/30] qapi: More tests of alternate output Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 09/30] qapi: Test failure in middle of array parse Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 10/30] qapi: More tests of input arrays Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 11/30] qapi: Provide nicer array names in introspection Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 12/30] qapi-introspect: Document lack of sorting Eric Blake
2015-11-06 15:52   ` Markus Armbruster
2015-11-09 20:56     ` Eric Blake
2015-11-10  7:36       ` Markus Armbruster
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 13/30] qapi: Track simple union tag in object.local_members Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 14/30] qapi-types: Consolidate gen_struct() and gen_union() Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 15/30] qapi-types: Simplify gen_struct_field[s] Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 16/30] qapi: Drop obsolete tag value collision assertions Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 17/30] qapi: Simplify QAPISchemaObjectTypeMember.check() Eric Blake
2015-11-09 12:31   ` Markus Armbruster
2015-11-09 14:44     ` Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 18/30] qapi: Clean up after previous commit Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 19/30] qapi: Fix up commit 7618b91's clash sanity checking change Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 20/30] qapi: Eliminate QAPISchemaObjectType.check() variable members Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 21/30] qapi: Factor out QAPISchemaObjectTypeMember.check_clash() Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 22/30] qapi: Simplify QAPISchemaObjectTypeVariants.check() Eric Blake
2015-11-09 12:38   ` Markus Armbruster
2015-11-10  5:04     ` Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 23/30] qapi: Check for qapi collisions of flat union branches Eric Blake
2015-11-09 12:56   ` Markus Armbruster
2015-11-09 15:13     ` Markus Armbruster
2015-11-10  5:18       ` Eric Blake
2015-11-10  5:16     ` Eric Blake
2015-11-10  8:30       ` Markus Armbruster
2015-11-10 13:24         ` Eric Blake
2015-11-10 23:37       ` Eric Blake
2015-11-11  9:50         ` Markus Armbruster
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 24/30] qapi: Factor out QAPISchemaObjectType.check_clash() Eric Blake
2015-11-09 13:00   ` Markus Armbruster
2015-11-09 17:36     ` Eric Blake
2015-11-09 19:11       ` Markus Armbruster
2015-11-10  5:22         ` Eric Blake
2015-11-09 14:49   ` Markus Armbruster
2015-11-10  5:32     ` Eric Blake
2015-11-10  9:15       ` Markus Armbruster
2015-11-10 13:19         ` Eric Blake [this message]
2015-11-10 14:43           ` Markus Armbruster
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 25/30] qapi: Hoist tag collision check to Variants.check() Eric Blake
2015-11-09 13:07   ` Markus Armbruster
2015-11-10  5:33     ` Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 26/30] qapi: Remove outdated tests related to QMP/branch collisions Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 27/30] qapi: Track owner of each object member Eric Blake
2015-11-09 14:26   ` Markus Armbruster
2015-11-11  0:17     ` Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 28/30] qapi: Detect collisions in C member names Eric Blake
2015-11-09 15:17   ` Markus Armbruster
2015-11-11  0:34     ` Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 29/30] cpu: Convert CpuInfo into flat union Eric Blake
2015-11-09 15:22   ` Markus Armbruster
2015-11-11  2:50     ` Eric Blake
2015-11-11 10:19       ` Markus Armbruster
2015-11-11 15:40         ` Eric Blake
2015-11-11 17:00           ` Markus Armbruster
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 30/30] qapi: Forbid case-insensitive clashes Eric Blake
2015-11-09 15:42   ` Markus Armbruster
2015-11-06 16:03 ` [Qemu-devel] [PATCH v10 00/30] qapi member collision (post-introspection cleanups, subset C') Markus Armbruster
2015-11-06 16:08   ` Eric Blake
2015-11-09  9:59     ` Markus Armbruster
2015-11-09 14:43       ` Eric Blake
2015-11-09 18:42         ` Markus Armbruster
2015-11-10 11:57           ` Markus Armbruster
2015-11-11 22:48             ` 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=5641EEEA.2010903@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).