diff mbox

[v10,17/30] qapi: Simplify QAPISchemaObjectTypeMember.check()

Message ID 1446791754-23823-18-git-send-email-eblake@redhat.com
State New
Headers show

Commit Message

Eric Blake Nov. 6, 2015, 6:35 a.m. UTC
From: Markus Armbruster <armbru@redhat.com>

QAPISchemaObjectTypeMember.check() currently does four things:

1. Compute self.type

2. Accumulate members in all_members

   Only one caller cares: QAPISchemaObjectType.check() uses it to
   compute self.members.  The other callers pass a throw-away
   accumulator.

3. Accumulate a map from names to members in seen

   Only one caller cares: QAPISchemaObjectType.check() uses it to
   compute its local variable seen, for self.variants.check(), which
   uses it to compute self.variants.tag_member from
   self.variants.tag_name.  The other callers pass a throw-away
   accumulator.

4. Check for collisions

   This piggyback on 3: before adding a new entry, we assert it's new.

   Only one caller cares: QAPISchemaObjectType.check() uses it to
   assert non-variant members don't clash.

Simplify QAPISchemaObjectType.check(): move 2.-4. to
QAPISchemaObjectType.check(), and drop parameters all_members and
seen.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <1446559499-26984-2-git-send-email-armbru@redhat.com>
[rebase to earlier changes that moved tag_member.check() of
alternate types]
Signed-off-by: Eric Blake <eblake@redhat.com>

---
v10: redo closer to Markus' original proposal
v9: new patch
---
 scripts/qapi.py | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

Comments

Markus Armbruster Nov. 9, 2015, 12:31 p.m. UTC | #1
Eric Blake <eblake@redhat.com> writes:

> From: Markus Armbruster <armbru@redhat.com>
>
> QAPISchemaObjectTypeMember.check() currently does four things:
>
> 1. Compute self.type
>
> 2. Accumulate members in all_members
>
>    Only one caller cares: QAPISchemaObjectType.check() uses it to
>    compute self.members.  The other callers pass a throw-away
>    accumulator.
>
> 3. Accumulate a map from names to members in seen
>
>    Only one caller cares: QAPISchemaObjectType.check() uses it to
>    compute its local variable seen, for self.variants.check(), which
>    uses it to compute self.variants.tag_member from
>    self.variants.tag_name.  The other callers pass a throw-away
>    accumulator.
>
> 4. Check for collisions
>
>    This piggyback on 3: before adding a new entry, we assert it's new.

piggybacks (typo is mine)

>
>    Only one caller cares: QAPISchemaObjectType.check() uses it to
>    assert non-variant members don't clash.
>
> Simplify QAPISchemaObjectType.check(): move 2.-4. to
> QAPISchemaObjectType.check(), and drop parameters all_members and
> seen.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> Message-Id: <1446559499-26984-2-git-send-email-armbru@redhat.com>
> [rebase to earlier changes that moved tag_member.check() of
> alternate types]
> Signed-off-by: Eric Blake <eblake@redhat.com>

Patch is as good as ever ;)
Eric Blake Nov. 9, 2015, 2:44 p.m. UTC | #2
On 11/09/2015 05:31 AM, Markus Armbruster wrote:
> Eric Blake <eblake@redhat.com> writes:
> 
>> From: Markus Armbruster <armbru@redhat.com>
>>
>> QAPISchemaObjectTypeMember.check() currently does four things:
>>

>> 4. Check for collisions
>>
>>    This piggyback on 3: before adding a new entry, we assert it's new.
> 
> piggybacks (typo is mine)

What's more, I noticed it in v9, but in redoing v10 to go closer to your
original series, I reverted my touchup.  Oh well :)
diff mbox

Patch

diff --git a/scripts/qapi.py b/scripts/qapi.py
index 1ac870d..a4350b2 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -990,7 +990,10 @@  class QAPISchemaObjectType(QAPISchemaType):
             assert c_name(m.name) not in seen
             seen[m.name] = m
         for m in self.local_members:
-            m.check(schema, members, seen)
+            m.check(schema)
+            assert m.name not in seen
+            seen[m.name] = m
+            members.append(m)
         if self.variants:
             self.variants.check(schema, members, seen)
         self.members = members
@@ -1027,12 +1030,9 @@  class QAPISchemaObjectTypeMember(object):
         self.type = None
         self.optional = optional

-    def check(self, schema, all_members, seen):
-        assert self.name not in seen
+    def check(self, schema):
         self.type = schema.lookup_type(self._type_name)
         assert self.type
-        all_members.append(self)
-        seen[self.name] = self


 class QAPISchemaObjectTypeVariants(object):
@@ -1066,7 +1066,7 @@  class QAPISchemaObjectTypeVariant(QAPISchemaObjectTypeMember):
         QAPISchemaObjectTypeMember.__init__(self, name, typ, False)

     def check(self, schema, tag_type, seen):
-        QAPISchemaObjectTypeMember.check(self, schema, [], seen)
+        QAPISchemaObjectTypeMember.check(self, schema)
         assert self.name in tag_type.values

     # This function exists to support ugly simple union special cases
@@ -1088,7 +1088,7 @@  class QAPISchemaAlternateType(QAPISchemaType):
         self.variants = variants

     def check(self, schema):
-        self.variants.tag_member.check(schema, [], {})
+        self.variants.tag_member.check(schema)
         self.variants.check(schema, [], {})

     def json_type(self):