From: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com, mdroth@linux.vnet.ibm.com, armbru@redhat.com,
lcapitulino@redhat.com, Wenchao Xia <xiawenc@linux.vnet.ibm.com>
Subject: [Qemu-devel] [PATCH V4 5/9] qapi script: use same function to generate enum string
Date: Wed, 11 Dec 2013 13:48:28 +0800 [thread overview]
Message-ID: <1386740912-1655-6-git-send-email-xiawenc@linux.vnet.ibm.com> (raw)
In-Reply-To: <1386740912-1655-1-git-send-email-xiawenc@linux.vnet.ibm.com>
Prior to this patch, qapi-visit.py used custom code to generate enum
names used for handling a qapi union. Fix it to instead reuse common
code, with identical generated results, and allowing future updates to
generation to only need to touch one place.
Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
---
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)
--
1.7.1
next prev parent reply other threads:[~2013-12-11 5:47 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-11 5:48 [Qemu-devel] [PATCH V4 0/9] qapi script: support enum as discriminator and better enum name Wenchao Xia
2013-12-11 5:48 ` [Qemu-devel] [PATCH V4 1/9] qapi script: remember enum values Wenchao Xia
2013-12-11 5:48 ` [Qemu-devel] [PATCH V4 2/9] qapi script: add check for duplicated key Wenchao Xia
2013-12-11 5:48 ` [Qemu-devel] [PATCH V4 3/9] qapi script: check correctness of discriminator values in union Wenchao Xia
2013-12-11 5:48 ` [Qemu-devel] [PATCH V4 4/9] qapi script: code move for generate_enum_name() Wenchao Xia
2013-12-11 5:48 ` Wenchao Xia [this message]
2013-12-12 4:26 ` [Qemu-devel] [PATCH V4 5/9] qapi script: use same function to generate enum string Eric Blake
2013-12-11 5:48 ` [Qemu-devel] [PATCH V4 6/9] qapi script: support pre-defined enum type as discriminator in union Wenchao Xia
2013-12-13 14:10 ` Eric Blake
2013-12-11 5:48 ` [Qemu-devel] [PATCH V4 7/9] tests: add cases for inherited struct and union with discriminator Wenchao Xia
2013-12-13 23:47 ` Eric Blake
2013-12-11 5:48 ` [Qemu-devel] [PATCH V4 8/9] qapi: convert BlockdevOptions to use enum discriminator Wenchao Xia
2013-12-13 23:50 ` Eric Blake
2013-12-16 2:41 ` Wenchao Xia
2013-12-16 21:26 ` Luiz Capitulino
2013-12-11 5:48 ` [Qemu-devel] [PATCH V4 9/9] qapi script: do not add "_" for every capitalized char in enum Wenchao Xia
2013-12-13 23:50 ` Eric Blake
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1386740912-1655-6-git-send-email-xiawenc@linux.vnet.ibm.com \
--to=xiawenc@linux.vnet.ibm.com \
--cc=armbru@redhat.com \
--cc=kwolf@redhat.com \
--cc=lcapitulino@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).