From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44928) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XEnO9-0001lN-Ai for qemu-devel@nongnu.org; Tue, 05 Aug 2014 18:39:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XEnO0-0004qn-DK for qemu-devel@nongnu.org; Tue, 05 Aug 2014 18:39:25 -0400 Received: from qmta13.emeryville.ca.mail.comcast.net ([76.96.27.243]:56733) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XEnO0-0004qT-57 for qemu-devel@nongnu.org; Tue, 05 Aug 2014 18:39:16 -0400 From: Eric Blake Date: Tue, 5 Aug 2014 16:38:56 -0600 Message-Id: <1407278346-17427-5-git-send-email-eblake@redhat.com> In-Reply-To: <1407278346-17427-1-git-send-email-eblake@redhat.com> References: <1407278346-17427-1-git-send-email-eblake@redhat.com> Subject: [Qemu-devel] [PATCH v2 04/14] qapi: better error message for bad enum List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Fam Zheng , Markus Armbruster , wenchaoqemu@gmail.com, Luiz Capitulino The previous commit demonstrated that the generator choked if an enum forgot 'data', and silently ignored an enum where 'data' was the wrong type. Fix both cases to give a sane error message. * scripts/qapi.py (parse_schema): Avoid bad deref. (check_exprs): Check for array on enums. * tests/qapi-schema/enum-missing-data.err: Update expected results. * tests/qapi-schema/enum-wrong-data.*: Likewise. Signed-off-by: Eric Blake --- scripts/qapi.py | 16 ++++++++++++---- tests/qapi-schema/enum-missing-data.err | 7 +------ tests/qapi-schema/enum-wrong-data.err | 1 + tests/qapi-schema/enum-wrong-data.exit | 2 +- tests/qapi-schema/enum-wrong-data.out | 3 --- 5 files changed, 15 insertions(+), 14 deletions(-) diff --git a/scripts/qapi.py b/scripts/qapi.py index f2c6d1f..1082416 100644 --- a/scripts/qapi.py +++ b/scripts/qapi.py @@ -2,7 +2,7 @@ # QAPI helper library # # Copyright IBM, Corp. 2011 -# Copyright (c) 2013 Red Hat Inc. +# Copyright (c) 2013-2014 Red Hat Inc. # # Authors: # Anthony Liguori @@ -319,10 +319,18 @@ def check_union(expr, expr_info): def check_exprs(schema): for expr_elem in schema.exprs: expr = expr_elem['expr'] + info = expr_elem['info'] + members = expr.get('data') + if expr.has_key('union'): - check_union(expr, expr_elem['info']) + check_union(expr, info) if expr.has_key('event'): - check_event(expr, expr_elem['info']) + check_event(expr, info) + if expr.has_key('enum'): + if not isinstance(members, list): + raise QAPIExprError(info, + "enum '%s' requires an array for 'data'" + % expr.get('enum')) def parse_schema(input_file): try: @@ -336,7 +344,7 @@ def parse_schema(input_file): for expr_elem in schema.exprs: expr = expr_elem['expr'] if expr.has_key('enum'): - add_enum(expr['enum'], expr['data']) + add_enum(expr['enum'], expr.get('data')) elif expr.has_key('union'): add_union(expr) elif expr.has_key('type'): diff --git a/tests/qapi-schema/enum-missing-data.err b/tests/qapi-schema/enum-missing-data.err index 1fec213..4912aab 100644 --- a/tests/qapi-schema/enum-missing-data.err +++ b/tests/qapi-schema/enum-missing-data.err @@ -1,6 +1 @@ -Traceback (most recent call last): - File "tests/qapi-schema/test-qapi.py", line 19, in - exprs = parse_schema(sys.argv[1]) - File "scripts/qapi.py", line 339, in parse_schema - add_enum(expr['enum'], expr['data']) -KeyError: 'data' +tests/qapi-schema/enum-missing-data.json:1: enum 'MyEnum' requires an array for 'data' diff --git a/tests/qapi-schema/enum-wrong-data.err b/tests/qapi-schema/enum-wrong-data.err index e69de29..857f0bd 100644 --- a/tests/qapi-schema/enum-wrong-data.err +++ b/tests/qapi-schema/enum-wrong-data.err @@ -0,0 +1 @@ +tests/qapi-schema/enum-wrong-data.json:1: enum 'MyEnum' requires an array for 'data' diff --git a/tests/qapi-schema/enum-wrong-data.exit b/tests/qapi-schema/enum-wrong-data.exit index 573541a..d00491f 100644 --- a/tests/qapi-schema/enum-wrong-data.exit +++ b/tests/qapi-schema/enum-wrong-data.exit @@ -1 +1 @@ -0 +1 diff --git a/tests/qapi-schema/enum-wrong-data.out b/tests/qapi-schema/enum-wrong-data.out index 28d2211..e69de29 100644 --- a/tests/qapi-schema/enum-wrong-data.out +++ b/tests/qapi-schema/enum-wrong-data.out @@ -1,3 +0,0 @@ -[OrderedDict([('enum', 'MyEnum'), ('data', OrderedDict([('value', 'str')]))])] -[{'enum_name': 'MyEnum', 'enum_values': OrderedDict([('value', 'str')])}] -[] -- 1.9.3