From patchwork Wed Nov 6 19:33:35 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wayne Xia X-Patchwork-Id: 289177 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 1CEA12C0077 for ; Thu, 7 Nov 2013 14:55:22 +1100 (EST) Received: from localhost ([::1]:37513 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VeGOA-0004LP-L6 for incoming@patchwork.ozlabs.org; Wed, 06 Nov 2013 22:36:11 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39105) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VeGMB-0003aE-2Z for qemu-devel@nongnu.org; Wed, 06 Nov 2013 22:34:14 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VeGM0-0007aN-FL for qemu-devel@nongnu.org; Wed, 06 Nov 2013 22:34:07 -0500 Received: from e28smtp05.in.ibm.com ([122.248.162.5]:46818) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VeGLz-0007Z7-S6 for qemu-devel@nongnu.org; Wed, 06 Nov 2013 22:33:56 -0500 Received: from /spool/local by e28smtp05.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 7 Nov 2013 09:03:51 +0530 Received: from d28dlp03.in.ibm.com (9.184.220.128) by e28smtp05.in.ibm.com (192.168.1.135) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 7 Nov 2013 09:03:49 +0530 Received: from d28relay05.in.ibm.com (d28relay05.in.ibm.com [9.184.220.62]) by d28dlp03.in.ibm.com (Postfix) with ESMTP id 064B8125803F for ; Thu, 7 Nov 2013 09:04:33 +0530 (IST) Received: from d28av02.in.ibm.com (d28av02.in.ibm.com [9.184.220.64]) by d28relay05.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id rA73XjtV46006326 for ; Thu, 7 Nov 2013 09:03:46 +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 rA73Xm6A028701 for ; Thu, 7 Nov 2013 09:03:48 +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 rA73XgLG028447; Thu, 7 Nov 2013 09:03:46 +0530 From: Wenchao Xia To: qemu-devel@nongnu.org Date: Thu, 7 Nov 2013 03:33:35 +0800 Message-Id: <1383766420-20745-4-git-send-email-xiawenc@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1383766420-20745-1-git-send-email-xiawenc@linux.vnet.ibm.com> References: <1383766420-20745-1-git-send-email-xiawenc@linux.vnet.ibm.com> X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13110703-8256-0000-0000-00000A03F92C X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 122.248.162.5 Cc: kwolf@redhat.com, armbru@redhat.com, mdroth@linux.vnet.ibm.com, lcapitulino@redhat.com, Wenchao Xia Subject: [Qemu-devel] [PATCH 3/8] 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 specified are written 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 does 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 b3d3af8..612dc4d 100644 --- a/scripts/qapi-visit.py +++ b/scripts/qapi-visit.py @@ -251,6 +251,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 = discriminator_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..f93bda1 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 discriminator enum define, if discriminator is specified in +# @expr and it is a pre-defined enum type +def discriminator_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) + + discriminator_type = base_fields.get(discriminator) + + if not discriminator_type: + sys.stderr.write("Discriminator '%s' not found in schema\n" + % discriminator) + sys.exit(1) + + return find_enum(discriminator_type)