Suggest qapi/expr.py: Check type of union and alternate 'data' member
John Snow <js...@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 <js...@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