From patchwork Tue Nov 5 00:37:33 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wayne Xia X-Patchwork-Id: 288437 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 3B7FC2C0199 for ; Tue, 5 Nov 2013 19:41:19 +1100 (EST) Received: from localhost ([::1]:53908 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VdcCL-00059r-43 for incoming@patchwork.ozlabs.org; Tue, 05 Nov 2013 03:41:17 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33615) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VdcBJ-0004za-5y for qemu-devel@nongnu.org; Tue, 05 Nov 2013 03:40:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VdcB5-0002Pz-S3 for qemu-devel@nongnu.org; Tue, 05 Nov 2013 03:40:13 -0500 Received: from e28smtp03.in.ibm.com ([122.248.162.3]:50920) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VdcB5-0002P0-5w for qemu-devel@nongnu.org; Tue, 05 Nov 2013 03:39:59 -0500 Received: from /spool/local by e28smtp03.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 5 Nov 2013 14:09:57 +0530 Received: from d28dlp01.in.ibm.com (9.184.220.126) by e28smtp03.in.ibm.com (192.168.1.133) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Tue, 5 Nov 2013 14:09:55 +0530 Received: from d28relay04.in.ibm.com (d28relay04.in.ibm.com [9.184.220.61]) by d28dlp01.in.ibm.com (Postfix) with ESMTP id 5D65CE0058 for ; Tue, 5 Nov 2013 14:11:39 +0530 (IST) Received: from d28av02.in.ibm.com (d28av02.in.ibm.com [9.184.220.64]) by d28relay04.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id rA58do4v37748960 for ; Tue, 5 Nov 2013 14:09:50 +0530 Received: from d28av02.in.ibm.com (localhost [127.0.0.1]) by d28av02.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id rA58drgL015803 for ; Tue, 5 Nov 2013 14:09:53 +0530 Received: from RH64wenchao ([9.181.129.59]) by d28av02.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id rA58dlo8015444; Tue, 5 Nov 2013 14:09:52 +0530 From: Wenchao Xia To: qemu-devel@nongnu.org Date: Tue, 5 Nov 2013 08:37:33 +0800 Message-Id: <1383611860-9053-4-git-send-email-xiawenc@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1383611860-9053-1-git-send-email-xiawenc@linux.vnet.ibm.com> References: <1383611860-9053-1-git-send-email-xiawenc@linux.vnet.ibm.com> X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13110508-3864-0000-0000-00000AE7316B X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 122.248.162.3 Cc: kwolf@redhat.com, armbru@redhat.com, lcapitulino@redhat.com, pbonzini@redhat.com, Wenchao Xia Subject: [Qemu-devel] [PATCH RFC 03/10] qapi script: check correctness of discriminator values in union X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org It will check whether the values specfied are wrotten correctly when discriminator is a pre-defined enum type, which help check whether the schema is in good form. It is allowed that, not every value in enum is used, so do not check that case. Signed-off-by: Wenchao Xia --- scripts/qapi-visit.py | 11 +++++++++++ scripts/qapi.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 0 deletions(-) diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py index c39e628..803d3eb 100644 --- a/scripts/qapi-visit.py +++ b/scripts/qapi-visit.py @@ -249,6 +249,17 @@ def generate_visit_union(expr): assert not base return generate_visit_anon_union(name, members) + # If discriminator is specified and it is a pre-defined enum in schema, + # check its correctness + enum_define = descriminator_find_enum_define(expr) + if enum_define: + for key in members: + if not key in enum_define["enum_values"]: + sys.stderr.write("Discriminator value '%s' not found in " + "enum '%s'\n" % + (key, enum_define["enum_name"])) + sys.exit(1) + ret = generate_visit_enum('%sKind' % name, members.keys()) if base: diff --git a/scripts/qapi.py b/scripts/qapi.py index 82f586e..235df4f 100644 --- a/scripts/qapi.py +++ b/scripts/qapi.py @@ -383,3 +383,36 @@ def guardend(name): ''', name=guardname(name)) + +# This function can be used to check whether "base" is valid +def find_base_fields(base): + base_struct_define = find_struct(base) + if not base_struct_define: + return None + return base_struct_define.get('data') + +# Return the descriminator enum define, if discriminator is specified in +# @expr and it is a pre-defined enum type +def descriminator_find_enum_define(expr): + discriminator = expr.get('discriminator') + base = expr.get('base') + + # Only support discriminator when base present + if not (discriminator and base): + return None + + base_fields = find_base_fields(base) + + if not base_fields: + sys.stderr.write("Base '%s' is not a valid type\n" + % base) + sys.exit(1) + + descriminator_type = base_fields.get(discriminator) + + if not descriminator_type: + sys.stderr.write("Discriminator '%s' not found in schema\n" + % discriminator) + sys.exit(1) + + return find_enum(descriminator_type)