From patchwork Fri Nov 29 08:41:09 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wayne Xia X-Patchwork-Id: 295182 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 34AA52C00B3 for ; Fri, 29 Nov 2013 19:44:43 +1100 (EST) Received: from localhost ([::1]:46114 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VmJgm-00070O-BG for incoming@patchwork.ozlabs.org; Fri, 29 Nov 2013 03:44:40 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33658) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VmJcE-0007tD-AB for qemu-devel@nongnu.org; Fri, 29 Nov 2013 03:40:05 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VmJc1-0004gE-My for qemu-devel@nongnu.org; Fri, 29 Nov 2013 03:39:58 -0500 Received: from e28smtp08.in.ibm.com ([122.248.162.8]:33895) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VmJc1-0004fP-3t for qemu-devel@nongnu.org; Fri, 29 Nov 2013 03:39:45 -0500 Received: from /spool/local by e28smtp08.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 29 Nov 2013 14:09:40 +0530 Received: from d28dlp03.in.ibm.com (9.184.220.128) by e28smtp08.in.ibm.com (192.168.1.138) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 29 Nov 2013 14:09:39 +0530 Received: from d28relay04.in.ibm.com (d28relay04.in.ibm.com [9.184.220.61]) by d28dlp03.in.ibm.com (Postfix) with ESMTP id CC73A1258055 for ; Fri, 29 Nov 2013 14:10:38 +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 rAT8dYHc34144448 for ; Fri, 29 Nov 2013 14:09:34 +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 rAT8db7F017836 for ; Fri, 29 Nov 2013 14:09:38 +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 rAT8dXZa017535; Fri, 29 Nov 2013 14:09:37 +0530 From: Wenchao Xia To: qemu-devel@nongnu.org Date: Fri, 29 Nov 2013 16:41:09 +0800 Message-Id: <1385714473-7322-6-git-send-email-xiawenc@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1385714473-7322-1-git-send-email-xiawenc@linux.vnet.ibm.com> References: <1385714473-7322-1-git-send-email-xiawenc@linux.vnet.ibm.com> X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13112908-2000-0000-0000-00000EBA5396 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 122.248.162.8 Cc: Wenchao Xia Subject: [Qemu-devel] [PATCH V3 5/9] qapi script: use same function to generate enum string 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 One function one rule, so the enum string generating have same behavior for different caller. If multiple caller exist for one enum define in schema, it is for sure the generated string is identical. Note before the patch qapi-visit.py used custom function to generate the string in union visit, although the patch changes it, the final string generated is not changed. The custom function used before will met problem when capitalized discriminator value is introduced. Signed-off-by: Wenchao Xia --- scripts/qapi-types.py | 6 +++--- scripts/qapi-visit.py | 21 +++++++++++++++------ scripts/qapi.py | 15 +++++++++++---- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py index 88bf76a..914f055 100644 --- a/scripts/qapi-types.py +++ b/scripts/qapi-types.py @@ -144,11 +144,11 @@ typedef enum %(name)s i = 0 for value in enum_values: + enum_full_value_string = generate_enum_full_value_string(name, value) enum_decl += mcgen(''' - %(abbrev)s_%(value)s = %(i)d, + %(enum_full_value_string)s = %(i)d, ''', - abbrev=de_camel_case(name).upper(), - value=generate_enum_name(value), + enum_full_value_string=enum_full_value_string, i=i) i += 1 diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py index c0efb5f..1b55924 100644 --- a/scripts/qapi-visit.py +++ b/scripts/qapi-visit.py @@ -214,18 +214,23 @@ void visit_type_%(name)s(Visitor *m, %(name)s ** obj, const char *name, Error ** ''', name=name) + # For anon union, always use the default enum type automatically generated + # as "'%sKind' % (name)" + discriminator_type_name = '%sKind' % (name) + for key in members: assert (members[key] in builtin_types or find_struct(members[key]) or find_union(members[key])), "Invalid anonymous union member" + enum_full_value_string = \ + generate_enum_full_value_string(discriminator_type_name, key) ret += mcgen(''' - case %(abbrev)s_KIND_%(enum)s: + case %(enum_full_value_string)s: visit_type_%(c_type)s(m, &(*obj)->%(c_name)s, name, &err); break; ''', - abbrev = de_camel_case(name).upper(), - enum = c_fun(de_camel_case(key),False).upper(), + enum_full_value_string = enum_full_value_string, c_type = type_name(members[key]), c_name = c_fun(key)) @@ -272,7 +277,10 @@ def generate_visit_union(expr): (key, name)) sys.exit(1) + # There will always be a discriminator in the C switch code, by default it + # is an enum type generated silently as "'%sKind' % (name)" ret = generate_visit_enum('%sKind' % name, members.keys()) + discriminator_type_name = '%sKind' % (name) if base: base_fields = find_struct(base)['data'] @@ -330,13 +338,14 @@ void visit_type_%(name)s(Visitor *m, %(name)s ** obj, const char *name, Error ** visit_end_implicit_struct(m, &err); }''' + enum_full_value_string = \ + generate_enum_full_value_string(discriminator_type_name, key) ret += mcgen(''' - case %(abbrev)s_KIND_%(enum)s: + case %(enum_full_value_string)s: ''' + fmt + ''' break; ''', - abbrev = de_camel_case(name).upper(), - enum = c_fun(de_camel_case(key),False).upper(), + enum_full_value_string = enum_full_value_string, c_type=type_name(members[key]), c_name=c_fun(key)) diff --git a/scripts/qapi.py b/scripts/qapi.py index 0e4e9d7..28ede6f 100644 --- a/scripts/qapi.py +++ b/scripts/qapi.py @@ -417,12 +417,19 @@ def discriminator_find_enum_define(expr): return find_enum(discriminator_type) -def generate_enum_name(name): - if name.isupper(): - return c_fun(name, False) +def _generate_enum_value_string(value): + if value.isupper(): + return c_fun(value, False) new_name = '' - for c in c_fun(name, False): + for c in c_fun(value, False): if c.isupper(): new_name += '_' new_name += c return new_name.lstrip('_').upper() + +def generate_enum_full_value_string(enum_name, enum_value): + # generate abbrev string + abbrev_string = de_camel_case(enum_name).upper() + # generate value string + value_string = _generate_enum_value_string(enum_value) + return "%s_%s" % (abbrev_string, value_string)