diff options
author | John Snow <jsnow@redhat.com> | 2021-05-19 14:39:42 -0400 |
---|---|---|
committer | Markus Armbruster <armbru@redhat.com> | 2021-05-20 11:28:28 +0200 |
commit | 9cd0205d553bc27a66454782dfc5d7e8d2324e34 (patch) | |
tree | f5465aeacfc9aab0130e399bc4645679245daf9e /scripts | |
parent | 7c610ce6a9950a49148fc3d37ed353958ca8d776 (diff) | |
download | qemu-9cd0205d553bc27a66454782dfc5d7e8d2324e34.zip qemu-9cd0205d553bc27a66454782dfc5d7e8d2324e34.tar.gz qemu-9cd0205d553bc27a66454782dfc5d7e8d2324e34.tar.bz2 |
qapi/parser: enforce all top-level expressions must be dict in _parse()
Instead of using get_expr nested=False, allow get_expr to always return
any expression. In exchange, add a new error message to the top-level
parser that explains the semantic error: Top-level expressions must
always be JSON objects.
This helps mypy understand the rest of this function which assumes that
get_expr did indeed return a dict.
The exception type changes from QAPIParseError to QAPISemError as a
result, and the error message in two tests now changes.
Signed-off-by: John Snow <jsnow@redhat.com>
Message-Id: <20210519183951.3946870-7-jsnow@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/qapi/parser.py | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/scripts/qapi/parser.py b/scripts/qapi/parser.py index 0bc852e..ffdd429 100644 --- a/scripts/qapi/parser.py +++ b/scripts/qapi/parser.py @@ -78,7 +78,11 @@ class QAPISchemaParser: self.docs.append(cur_doc) continue - expr = self.get_expr(False) + expr = self.get_expr() + if not isinstance(expr, dict): + raise QAPISemError( + info, "top-level expression must be an object") + if 'include' in expr: self.reject_expr_doc(cur_doc) if len(expr) != 1: @@ -251,7 +255,7 @@ class QAPISchemaParser: self.accept() if key in expr: raise QAPIParseError(self, "duplicate key '%s'" % key) - expr[key] = self.get_expr(True) + expr[key] = self.get_expr() if self.tok == '}': self.accept() return expr @@ -270,7 +274,7 @@ class QAPISchemaParser: raise QAPIParseError( self, "expected '{', '[', ']', string, or boolean") while True: - expr.append(self.get_expr(True)) + expr.append(self.get_expr()) if self.tok == ']': self.accept() return expr @@ -278,9 +282,7 @@ class QAPISchemaParser: raise QAPIParseError(self, "expected ',' or ']'") self.accept() - def get_expr(self, nested): - if self.tok != '{' and not nested: - raise QAPIParseError(self, "expected '{'") + def get_expr(self): if self.tok == '{': self.accept() expr = self.get_members() |