Message ID | 20210325060356.4040114-10-jsnow@redhat.com |
---|---|
State | New |
Headers | show |
Series | qapi: static typing conversion, pt3 | expand |
Suggest qapi/expr.py: Check type of union and alternate 'data' member John Snow <jsnow@redhat.com> writes: > We don't actually check, so the user can get some unpleasant stacktraces. Let's point to the new tests here. > Formalize it. Huh? > Signed-off-by: John Snow <jsnow@redhat.com> > --- > scripts/qapi/expr.py | 7 +++++++ > tests/qapi-schema/alternate-invalid-data-type.err | 2 ++ > tests/qapi-schema/union-invalid-data-type.err | 2 ++ > 3 files changed, 11 insertions(+) > > diff --git a/scripts/qapi/expr.py b/scripts/qapi/expr.py > index 73e7d8cb0d..ca5ab7bfda 100644 > --- a/scripts/qapi/expr.py > +++ b/scripts/qapi/expr.py > @@ -281,6 +281,9 @@ def check_union(expr, info): > raise QAPISemError(info, "'discriminator' requires 'base'") > check_name_is_str(discriminator, info, "'discriminator'") > > + if not isinstance(members, dict): > + raise QAPISemError(info, "'data' must be an object") > + > for (key, value) in members.items(): > source = "'data' member '%s'" % key > if discriminator is None: > @@ -296,6 +299,10 @@ def check_alternate(expr, info): > > if not members: > raise QAPISemError(info, "'data' must not be empty") > + > + if not isinstance(members, dict): > + raise QAPISemError(info, "'data' must be an object") > + > for (key, value) in members.items(): > source = "'data' member '%s'" % key > check_name_lower(key, info, source) > diff --git a/tests/qapi-schema/alternate-invalid-data-type.err b/tests/qapi-schema/alternate-invalid-data-type.err > index e69de29bb2..c7301ccb00 100644 > --- a/tests/qapi-schema/alternate-invalid-data-type.err > +++ b/tests/qapi-schema/alternate-invalid-data-type.err > @@ -0,0 +1,2 @@ > +alternate-invalid-data-type.json: In alternate 'Alt': > +alternate-invalid-data-type.json:2: 'data' must be an object > diff --git a/tests/qapi-schema/union-invalid-data-type.err b/tests/qapi-schema/union-invalid-data-type.err > index e69de29bb2..b71c3400c5 100644 > --- a/tests/qapi-schema/union-invalid-data-type.err > +++ b/tests/qapi-schema/union-invalid-data-type.err > @@ -0,0 +1,2 @@ > +union-invalid-data-type.json: In union 'TestUnion': > +union-invalid-data-type.json:9: 'data' must be an object
On 3/25/21 10:26 AM, Markus Armbruster wrote: > Suggest > > qapi/expr.py: Check type of union and alternate 'data' member > > John Snow <jsnow@redhat.com> writes: > >> We don't actually check, so the user can get some unpleasant stacktraces. > > Let's point to the new tests here. > Well, it'll get merged with the last one to keep make check working, so I have to update the commit message anyway.
diff --git a/scripts/qapi/expr.py b/scripts/qapi/expr.py index 73e7d8cb0d..ca5ab7bfda 100644 --- a/scripts/qapi/expr.py +++ b/scripts/qapi/expr.py @@ -281,6 +281,9 @@ def check_union(expr, info): raise QAPISemError(info, "'discriminator' requires 'base'") check_name_is_str(discriminator, info, "'discriminator'") + if not isinstance(members, dict): + raise QAPISemError(info, "'data' must be an object") + for (key, value) in members.items(): source = "'data' member '%s'" % key if discriminator is None: @@ -296,6 +299,10 @@ def check_alternate(expr, info): if not members: raise QAPISemError(info, "'data' must not be empty") + + if not isinstance(members, dict): + raise QAPISemError(info, "'data' must be an object") + for (key, value) in members.items(): source = "'data' member '%s'" % key check_name_lower(key, info, source) diff --git a/tests/qapi-schema/alternate-invalid-data-type.err b/tests/qapi-schema/alternate-invalid-data-type.err index e69de29bb2..c7301ccb00 100644 --- a/tests/qapi-schema/alternate-invalid-data-type.err +++ b/tests/qapi-schema/alternate-invalid-data-type.err @@ -0,0 +1,2 @@ +alternate-invalid-data-type.json: In alternate 'Alt': +alternate-invalid-data-type.json:2: 'data' must be an object diff --git a/tests/qapi-schema/union-invalid-data-type.err b/tests/qapi-schema/union-invalid-data-type.err index e69de29bb2..b71c3400c5 100644 --- a/tests/qapi-schema/union-invalid-data-type.err +++ b/tests/qapi-schema/union-invalid-data-type.err @@ -0,0 +1,2 @@ +union-invalid-data-type.json: In union 'TestUnion': +union-invalid-data-type.json:9: 'data' must be an object
We don't actually check, so the user can get some unpleasant stacktraces. Formalize it. Signed-off-by: John Snow <jsnow@redhat.com> --- scripts/qapi/expr.py | 7 +++++++ tests/qapi-schema/alternate-invalid-data-type.err | 2 ++ tests/qapi-schema/union-invalid-data-type.err | 2 ++ 3 files changed, 11 insertions(+)