[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 06/11] qapi script: use same function to generate enu
From: |
Luiz Capitulino |
Subject: |
[Qemu-devel] [PULL 06/11] qapi script: use same function to generate enum string |
Date: |
Tue, 11 Mar 2014 09:41:06 -0400 |
From: Wenchao Xia <address@hidden>
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 <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
Reviewed-by: Markus Armbruster <address@hidden>
Signed-off-by: Luiz Capitulino <address@hidden>
---
scripts/qapi-types.py | 6 +++---
scripts/qapi-visit.py | 19 +++++++++++++------
scripts/qapi.py | 13 +++++++++----
3 files changed, 25 insertions(+), 13 deletions(-)
diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py
index 35ad993..5885bac 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 = generate_enum_full_value(name, value)
enum_decl += mcgen('''
- %(abbrev)s_%(value)s = %(i)d,
+ %(enum_full_value)s = %(i)d,
''',
- abbrev=de_camel_case(name).upper(),
- value=generate_enum_name(value),
+ enum_full_value = enum_full_value,
i=i)
i += 1
diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py
index c6de9ae..0baaf60 100644
--- a/scripts/qapi-visit.py
+++ b/scripts/qapi-visit.py
@@ -214,18 +214,22 @@ 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)"
+ disc_type = '%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 = generate_enum_full_value(disc_type, key)
ret += mcgen('''
- case %(abbrev)s_KIND_%(enum)s:
+ case %(enum_full_value)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 = enum_full_value,
c_type = type_name(members[key]),
c_name = c_fun(key))
@@ -255,7 +259,10 @@ def generate_visit_union(expr):
assert not base
return generate_visit_anon_union(name, members)
+ # 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())
+ disc_type = '%sKind' % (name)
if base:
base_fields = find_struct(base)['data']
@@ -313,13 +320,13 @@ void visit_type_%(name)s(Visitor *m, %(name)s ** obj,
const char *name, Error **
visit_end_implicit_struct(m, &err);
}'''
+ enum_full_value = generate_enum_full_value(disc_type, key)
ret += mcgen('''
- case %(abbrev)s_KIND_%(enum)s:
+ case %(enum_full_value)s:
''' + fmt + '''
break;
''',
- abbrev = de_camel_case(name).upper(),
- enum = c_fun(de_camel_case(key),False).upper(),
+ enum_full_value = enum_full_value,
c_type=type_name(members[key]),
c_name=c_fun(key))
diff --git a/scripts/qapi.py b/scripts/qapi.py
index 0de9fe2..eebc8a7 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -468,12 +468,17 @@ def guardend(name):
''',
name=guardname(name))
-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(enum_name, enum_value):
+ abbrev_string = de_camel_case(enum_name).upper()
+ value_string = _generate_enum_value_string(enum_value)
+ return "%s_%s" % (abbrev_string, value_string)
--
1.8.1.4
- [Qemu-devel] [PULL for-2.0 00/11] QMP queue, Luiz Capitulino, 2014/03/11
- [Qemu-devel] [PULL 06/11] qapi script: use same function to generate enum string,
Luiz Capitulino <=
- [Qemu-devel] [PULL 05/11] qapi script: code move for generate_enum_name(), Luiz Capitulino, 2014/03/11
- [Qemu-devel] [PULL 01/11] qapi script: remember explicitly defined enum values, Luiz Capitulino, 2014/03/11
- [Qemu-devel] [PULL 02/11] qapi script: add check for duplicated key, Luiz Capitulino, 2014/03/11
- [Qemu-devel] [PULL 03/11] qapi script: remember line number in schema parsing, Luiz Capitulino, 2014/03/11
- [Qemu-devel] [PULL 08/11] qapi: convert BlockdevOptions to use enum discriminator, Luiz Capitulino, 2014/03/11
- [Qemu-devel] [PULL 10/11] qapi script: do not add "_" for every capitalized char in enum, Luiz Capitulino, 2014/03/11
- [Qemu-devel] [PULL 11/11] tests: test-qmp-commands: Fix double free, Luiz Capitulino, 2014/03/11
- [Qemu-devel] [PULL 07/11] qapi script: support enum type as discriminator in union, Luiz Capitulino, 2014/03/11
- [Qemu-devel] [PULL 04/11] qapi script: check correctness of union, Luiz Capitulino, 2014/03/11
- [Qemu-devel] [PULL 09/11] qapi script: do not allow string discriminator, Luiz Capitulino, 2014/03/11