qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2 36/38] qapi/visit.py: assert tag_member contains a QAPISch


From: John Snow
Subject: Re: [PATCH v2 36/38] qapi/visit.py: assert tag_member contains a QAPISchemaEnumType
Date: Thu, 24 Sep 2020 15:36:23 -0400
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.11.0

On 9/24/20 3:10 PM, Cleber Rosa wrote:
On Tue, Sep 22, 2020 at 05:00:59PM -0400, John Snow wrote:
Signed-off-by: John Snow <jsnow@redhat.com>
---
  scripts/qapi/visit.py | 15 ++++++++++-----
  1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/scripts/qapi/visit.py b/scripts/qapi/visit.py
index 4edaee33e3..180c140180 100644
--- a/scripts/qapi/visit.py
+++ b/scripts/qapi/visit.py
@@ -22,7 +22,10 @@
      indent,
  )
  from .gen import QAPISchemaModularCVisitor, ifcontext
-from .schema import QAPISchemaObjectType
+from .schema import (
+    QAPISchemaEnumType,
+    QAPISchemaObjectType,
+)
def gen_visit_decl(name, scalar=False):
@@ -84,15 +87,17 @@ def gen_visit_object_members(name, base, members, variants):
          ret += gen_endif(memb.ifcond)
if variants:
+        tag_member = variants.tag_member
+        assert isinstance(tag_member.type, QAPISchemaEnumType)
+

I'd be interested in knowing why this wasn't left to be handled by the
type checking only.  Anyway,


QAPISchemaVariants is a container type that is used to house a number of QAPISchemaVariant types; but it (can) also take a tag_member to identify one of the fields in the variants that can be used to differentiate them.

Now, we assert that tag_member must be a QAPISchemaObjectTypeMember. QAPISchemaVariant is also a QAPISchemaObjectTypeMember.

a QAPISchemaObjectTypeMember is a QAPISchemaMember. a QAPISchemaMember describes one 'member' of either an enum, a features list, or an object member.

Now, the QAPISchemaObjectTypeMember (and not the QAPISchemaMember!) serves as a container for a QAPISchemaType -- this is a wrapper type, effectively. That contained type can be *anything*, because object members can be *anything*.

Oops, but if we zoom back out, we are only able to constrain tag_member to being a QAPISchemaObjectTypeMember, we have no expressive power over its contained type.

That's why you need the assertion here; because of a loss of specificity when we declare tag_member.


"Wow, John, it sounds like you should use a Generic type to be able to describe the inner type of a QAPISchemaObjectTypeMember?"

Uh, yup, you're right! I should. But it's complicated, because QAPISchemaMember does not have a contained type. Further, the contained type of a Member may or may not be known at construction time right now.

It's fixable, and probably involves adding something like a "string constant" dummy type to allow QAPISchemaMember to have a contained type.

"Hey, all of that sounds very messy. What if we just added in a few assertions for right now while we get the preliminary types in, and then we can make adjustments based on what makes the code prettier?"

Sounds like a plan, hypothetical quote person.

Reviewed-by: Cleber Rosa <crosa@redhat.com>





reply via email to

[Prev in Thread] Current Thread [Next in Thread]