Skip to content

Commit

Permalink
qapi/schema: add _check_complete flag
Browse files Browse the repository at this point in the history
Instead of using the None value for the members field, use a dedicated
flag to detect recursive misconfigurations.

This is intended to assist with subsequent patches that seek to remove
the "None" value from the members field (which can never hold that value
after the final call to check()) in order to simplify the static typing
of that field; avoiding the need of assertions littered at many
callsites to eliminate the possibility of the None value.

Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-ID: <20240315152301.3621858-16-armbru@redhat.com>
  • Loading branch information
jnsnow authored and Markus Armbruster committed Apr 24, 2024
1 parent 8b9e7fd commit 875f624
Showing 1 changed file with 5 additions and 3 deletions.
8 changes: 5 additions & 3 deletions scripts/qapi/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -450,12 +450,13 @@ def __init__(self, name, info, doc, ifcond, features,
self.local_members = local_members
self.variants = variants
self.members = None
self._check_complete = False

def check(self, schema):
# This calls another type T's .check() exactly when the C
# struct emitted by gen_object() contains that T's C struct
# (pointers don't count).
if self.members is not None:
if self._check_complete:
# A previous .check() completed: nothing to do
return
if self._checked:
Expand All @@ -464,7 +465,7 @@ def check(self, schema):
"object %s contains itself" % self.name)

super().check(schema)
assert self._checked and self.members is None
assert self._checked and not self._check_complete

seen = OrderedDict()
if self._base_name:
Expand All @@ -487,7 +488,8 @@ def check(self, schema):
self.variants.check(schema, seen)
self.variants.check_clash(self.info, seen)

self.members = members # mark completed
self.members = members
self._check_complete = True # mark completed

# Check that the members of this type do not cause duplicate JSON members,
# and update seen to track the members seen so far. Report any errors
Expand Down

0 comments on commit 875f624

Please sign in to comment.