[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 08/26] qapi: Generate a nicer struct for flat uni
From: |
Markus Armbruster |
Subject: |
[Qemu-devel] [PATCH v2 08/26] qapi: Generate a nicer struct for flat unions |
Date: |
Fri, 28 Aug 2015 18:45:48 +0200 |
The struct generated for a flat union is weird: the members of its
base are at the end, except for the union tag, which is at the
beginning.
Example: qapi-schema-test.json has
{ 'struct': 'UserDefUnionBase',
'data': { 'string': 'str', 'enum1': 'EnumOne' } }
{ 'union': 'UserDefFlatUnion',
'base': 'UserDefUnionBase',
'discriminator': 'enum1',
'data': { 'value1' : 'UserDefA',
'value2' : 'UserDefB',
'value3' : 'UserDefB' } }
We generate:
struct UserDefFlatUnion
{
EnumOne enum1;
union {
void *data;
UserDefA *value1;
UserDefB *value2;
UserDefB *value3;
};
char *string;
};
Change to put all base members at the beginning, unadulterated. Not
only is this easier to understand, it also permits casting the flat
union to its base, if that should become useful.
We now generate:
struct UserDefFlatUnion
{
/* Members inherited from UserDefUnionBase: */
char *string;
EnumOne enum1;
/* Own members: */
union { /* union tag is @enum1 */
void *data;
UserDefA *value1;
UserDefB *value2;
UserDefB *value3;
};
};
Signed-off-by: Markus Armbruster <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
---
scripts/qapi-types.py | 38 ++++++++++++++++++++++----------------
1 file changed, 22 insertions(+), 16 deletions(-)
diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py
index ac8dad3..82141cd 100644
--- a/scripts/qapi-types.py
+++ b/scripts/qapi-types.py
@@ -200,13 +200,30 @@ def generate_union(expr, meta):
ret = mcgen('''
struct %(name)s
{
- %(discriminator_type_name)s %(discriminator)s;
- union {
+''',
+ name=name)
+ if base:
+ ret += mcgen('''
+ /* Members inherited from %(c_name)s: */
+''',
+ c_name=c_name(base))
+ base_fields = find_struct(base)['data']
+ ret += generate_struct_fields(base_fields)
+ ret += mcgen('''
+ /* Own members: */
+''')
+ else:
+ assert not discriminator
+ ret += mcgen('''
+ %(discriminator_type_name)s kind;
+''',
+ discriminator_type_name=c_name(discriminator_type_name))
+
+ ret += mcgen('''
+ union { /* union tag is @%(c_name)s */
void *data;
''',
- name=name,
- discriminator=c_name(discriminator or 'kind'),
- discriminator_type_name=c_name(discriminator_type_name))
+ c_name=c_name(discriminator or 'kind'))
for key in typeinfo:
ret += mcgen('''
@@ -217,17 +234,6 @@ struct %(name)s
ret += mcgen('''
};
-''')
-
- if base:
- assert discriminator
- base_fields = find_struct(base)['data'].copy()
- del base_fields[discriminator]
- ret += generate_struct_fields(base_fields)
- else:
- assert not discriminator
-
- ret += mcgen('''
};
''')
if meta == 'alternate':
--
2.4.3
- [Qemu-devel] [PATCH v2 00/26] qapi: Another round of fixes and cleanups, Markus Armbruster, 2015/08/28
- [Qemu-devel] [PATCH v2 05/26] qapi: Reject -p arguments that break qapi-event.py, Markus Armbruster, 2015/08/28
- [Qemu-devel] [PATCH v2 12/26] tests/qapi-schema: Document alternate's enum lacks visit function, Markus Armbruster, 2015/08/28
- [Qemu-devel] [PATCH v2 04/26] qapi-event: Clean up how name of enum QAPIEvent is made, Markus Armbruster, 2015/08/28
- [Qemu-devel] [PATCH v2 10/26] qapi-visit: Replace list implicit_structs by set, Markus Armbruster, 2015/08/28
- [Qemu-devel] [PATCH v2 01/26] qapi: Clarify docs on including the same file multiple times, Markus Armbruster, 2015/08/28
- [Qemu-devel] [PATCH v2 03/26] qapi: Simplify guardname(), Markus Armbruster, 2015/08/28
- [Qemu-devel] [PATCH v2 02/26] qapi: Clean up cgen() and mcgen(), Markus Armbruster, 2015/08/28
- [Qemu-devel] [PATCH v2 11/26] qapi-visit: Fix two name arguments passed to visitors, Markus Armbruster, 2015/08/28
- [Qemu-devel] [PATCH v2 08/26] qapi: Generate a nicer struct for flat unions,
Markus Armbruster <=
- [Qemu-devel] [PATCH v2 13/26] tests/qapi-schema: Document events with base don't work, Markus Armbruster, 2015/08/28
- [Qemu-devel] [PATCH v2 07/26] qapi: Fix generated code when flat union has member 'kind', Markus Armbruster, 2015/08/28
- [Qemu-devel] [PATCH v2 16/26] qapi: Document flaws in checking of names, Markus Armbruster, 2015/08/28
- [Qemu-devel] [PATCH v2 09/26] qapi-visit: Fix generated code when schema has forward refs, Markus Armbruster, 2015/08/28
- [Qemu-devel] [PATCH v2 06/26] qapi: Drop unused and useless parameters and variables, Markus Armbruster, 2015/08/28
- [Qemu-devel] [PATCH v2 23/26] qapi-commands: Inline gen_marshal_output_call(), Markus Armbruster, 2015/08/28
- [Qemu-devel] [PATCH v2 17/26] tests/qapi-schema: Restore test case for flat union base bug, Markus Armbruster, 2015/08/28
- [Qemu-devel] [PATCH v2 14/26] qapi: Document that input visitor semantics are prone to leaks, Markus Armbruster, 2015/08/28
- [Qemu-devel] [PATCH v2 19/26] qapi-tests: New tests for union, alternate command arguments, Markus Armbruster, 2015/08/28
- [Qemu-devel] [PATCH v2 25/26] qapi-commands: Drop useless initialization, Markus Armbruster, 2015/08/28