From 50f2bdc75c5ee00617ad874c9ceac2cea660aa1e Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Wed, 3 Jul 2013 15:58:57 +0200 Subject: 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 Reviewed-by: Eric Blake --- scripts/qapi-types.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'scripts/qapi-types.py') diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py index 07bd311657..84d46fb863 100644 --- a/scripts/qapi-types.py +++ b/scripts/qapi-types.py @@ -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(''' }; -- cgit 1.4.1