From: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
To: qemu-devel@nongnu.org
Cc: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
Subject: [Qemu-devel] [PATCH V3 5/9] qapi script: use same function to generate enum string
Date: Fri, 29 Nov 2013 16:41:09 +0800 [thread overview]
Message-ID: <1385714473-7322-6-git-send-email-xiawenc@linux.vnet.ibm.com> (raw)
In-Reply-To: <1385714473-7322-1-git-send-email-xiawenc@linux.vnet.ibm.com>
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 <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-11-29 8:40 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-29 8:41 [Qemu-devel] [PATCH Resend V3 0/9] qapi script: support enum as discriminator and better enum name Wenchao Xia
2013-11-29 8:41 ` [Qemu-devel] [PATCH V3 1/9] qapi script: remember enum values Wenchao Xia
2013-11-29 8:41 ` [Qemu-devel] [PATCH V3 2/9] qapi script: add check for duplicated key Wenchao Xia
2013-11-29 8:41 ` [Qemu-devel] [PATCH V3 3/9] qapi script: check correctness of discriminator values in union Wenchao Xia
2013-11-29 8:41 ` [Qemu-devel] [PATCH V3 4/9] qapi script: code move for generate_enum_name() Wenchao Xia
2013-11-29 8:41 ` Wenchao Xia [this message]
2013-11-29 8:41 ` [Qemu-devel] [PATCH V3 6/9] qapi script: support pre-defined enum type as discriminator in union Wenchao Xia
2013-12-03 3:13 ` Eric Blake
2013-11-29 8:41 ` [Qemu-devel] [PATCH V3 7/9] tests: add cases for inherited struct and union with discriminator Wenchao Xia
2013-11-29 8:41 ` [Qemu-devel] [PATCH V3 8/9] qapi: convert BlockdevOptions to use enum discriminator Wenchao Xia
2013-12-03 3:15 ` Eric Blake
2013-11-29 8:41 ` [Qemu-devel] [PATCH V3 9/9] qapi script: do not add "_" for every capitalized char in enum Wenchao Xia
2013-12-04 22:58 ` 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=1385714473-7322-6-git-send-email-xiawenc@linux.vnet.ibm.com \
--to=xiawenc@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).