mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-27 04:13:53 -06:00
qapi: Flat unions with arbitrary discriminator
Instead of the rather verbose syntax that distinguishes base and subclass fields... { "type": "file", "read-only": true, "data": { "filename": "test" } } ...we can now have both in the same namespace, allowing a more direct mapping of the command line, and moving fields between the common base and subclasses without breaking the API: { "driver": "file", "read-only": true, "filename": "test" } Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
761d524dbc
commit
50f2bdc75c
3 changed files with 98 additions and 25 deletions
|
@ -154,7 +154,9 @@ def generate_union(expr):
|
|||
|
||||
name = expr['union']
|
||||
typeinfo = expr['data']
|
||||
|
||||
base = expr.get('base')
|
||||
discriminator = expr.get('discriminator')
|
||||
|
||||
ret = mcgen('''
|
||||
struct %(name)s
|
||||
|
@ -177,8 +179,13 @@ struct %(name)s
|
|||
''')
|
||||
|
||||
if base:
|
||||
struct = find_struct(base)
|
||||
ret += generate_struct_fields(struct['data'])
|
||||
base_fields = find_struct(base)['data']
|
||||
if discriminator:
|
||||
base_fields = base_fields.copy()
|
||||
del base_fields[discriminator]
|
||||
ret += generate_struct_fields(base_fields)
|
||||
else:
|
||||
assert not discriminator
|
||||
|
||||
ret += mcgen('''
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue