[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH RFC 06/10] qapi script: not generate hidden enum typ
From: |
Wenchao Xia |
Subject: |
[Qemu-devel] [PATCH RFC 06/10] qapi script: not generate hidden enum type for pre-defined enum discriminator |
Date: |
Tue, 5 Nov 2013 08:37:36 +0800 |
By default, any union will automatically generate a enum type as
"[UnionName]Kind" in C code, and it is duplicated when the discriminator
is specified as a pre-defined enum type in schema. After this patch,
the pre-defined enum type will be really used as the switch case
condition in generated C code.
In short, enum type as discriminator is fully supported now.
Signed-off-by: Wenchao Xia <address@hidden>
---
scripts/qapi-types.py | 18 ++++++++++++++----
scripts/qapi-visit.py | 19 ++++++++++++++-----
scripts/qapi.py | 4 +++-
3 files changed, 31 insertions(+), 10 deletions(-)
diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py
index 914f055..a096c36 100644
--- a/scripts/qapi-types.py
+++ b/scripts/qapi-types.py
@@ -201,14 +201,21 @@ def generate_union(expr):
base = expr.get('base')
discriminator = expr.get('discriminator')
+ enum_define = descriminator_find_enum_define(expr)
+ if enum_define:
+ discriminator_type_name = enum_define['enum_name']
+ else:
+ discriminator_type_name = '%sKind' % (name)
+
ret = mcgen('''
struct %(name)s
{
- %(name)sKind kind;
+ %(discriminator_type_name)s kind;
union {
void *data;
''',
- name=name)
+ name=name,
+ discriminator_type_name=discriminator_type_name)
for key in typeinfo:
ret += mcgen('''
@@ -389,8 +396,11 @@ for expr in exprs:
fdef.write(generate_enum_lookup(expr['enum'], expr['data']))
elif expr.has_key('union'):
ret += generate_fwd_struct(expr['union'], expr['data']) + "\n"
- ret += generate_enum('%sKind' % expr['union'], expr['data'].keys())
- fdef.write(generate_enum_lookup('%sKind' % expr['union'],
expr['data'].keys()))
+ enum_define = descriminator_find_enum_define(expr)
+ if not enum_define:
+ ret += generate_enum('%sKind' % expr['union'], expr['data'].keys())
+ fdef.write(generate_enum_lookup('%sKind' % expr['union'],
+ expr['data'].keys()))
if expr.get('discriminator') == {}:
fdef.write(generate_anon_union_qtypes(expr))
else:
diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py
index 9fc7c4c..2b13ad0 100644
--- a/scripts/qapi-visit.py
+++ b/scripts/qapi-visit.py
@@ -260,8 +260,12 @@ def generate_visit_union(expr):
(key, enum_define["enum_name"]))
sys.exit(1)
- ret = generate_visit_enum('%sKind' % name, members.keys())
- discriminator_type_name = '%sKind' % (name)
+ ret = ""
+ discriminator_type_name = enum_define['enum_name']
+ else:
+ ret = generate_visit_enum('%sKind' % name, members.keys())
+ discriminator_type_name = '%sKind' % (name)
+
if base:
base_fields = find_struct(base)['data']
@@ -296,11 +300,12 @@ void visit_type_%(name)s(Visitor *m, %(name)s ** obj,
const char *name, Error **
pop_indent()
ret += mcgen('''
- visit_type_%(name)sKind(m, &(*obj)->kind, "%(type)s", &err);
+ visit_type_%(discriminator_type_name)s(m, &(*obj)->kind, "%(type)s",
&err);
if (!err) {
switch ((*obj)->kind) {
''',
- name=name, type="type" if not discriminator else
discriminator)
+ discriminator_type_name=discriminator_type_name,
+ type="type" if not discriminator else discriminator)
for key in members:
if not discriminator:
@@ -514,7 +519,11 @@ for expr in exprs:
ret += generate_visit_list(expr['union'], expr['data'])
fdef.write(ret)
- ret = generate_decl_enum('%sKind' % expr['union'], expr['data'].keys())
+ enum_define = descriminator_find_enum_define(expr)
+ ret = ""
+ if not enum_define:
+ ret = generate_decl_enum('%sKind' % expr['union'],
+ expr['data'].keys())
ret += generate_declaration(expr['union'], expr['data'])
fdecl.write(ret)
elif expr.has_key('enum'):
diff --git a/scripts/qapi.py b/scripts/qapi.py
index 43a3720..8e50015 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -172,7 +172,9 @@ def parse_schema(fp):
add_enum(expr['enum'], expr['data'])
elif expr.has_key('union'):
add_union(expr)
- add_enum('%sKind' % expr['union'])
+ enum_define = descriminator_find_enum_define(expr)
+ if not enum_define:
+ add_enum('%sKind' % expr['union'])
elif expr.has_key('type'):
add_struct(expr)
exprs.append(expr)
--
1.7.1
- [Qemu-devel] [PATCH RFC 00/10] qapi script: support enum as discriminator and other improves, Wenchao Xia, 2013/11/05
- [Qemu-devel] [PATCH RFC 02/10] qapi script: remember enum values, Wenchao Xia, 2013/11/05
- [Qemu-devel] [PATCH RFC 05/10] qapi script: use same function to generate enum string, Wenchao Xia, 2013/11/05
- [Qemu-devel] [PATCH RFC 04/10] qapi script: code move for generate_enum_name(), Wenchao Xia, 2013/11/05
- [Qemu-devel] [PATCH RFC 01/10] qapi: fix memleak by add implict struct functions in dealloc visitor, Wenchao Xia, 2013/11/05
- [Qemu-devel] [PATCH RFC 03/10] qapi script: check correctness of discriminator values in union, Wenchao Xia, 2013/11/05
- [Qemu-devel] [PATCH RFC 06/10] qapi script: not generate hidden enum type for pre-defined enum discriminator,
Wenchao Xia <=
- [Qemu-devel] [PATCH RFC 07/10] qapi script: support direct inheritance for struct, Wenchao Xia, 2013/11/05
[Qemu-devel] [PATCH RFC 08/10] qapi script: do not add "_" for every capitalized char in enum, Wenchao Xia, 2013/11/05
[Qemu-devel] [PATCH RFC 09/10] tests: fix memleak in error path test for input visitor, Wenchao Xia, 2013/11/05
[Qemu-devel] [PATCH RFC 10/10] tests: add cases for inherited struct and union with discriminator, Wenchao Xia, 2013/11/05