qapi: Segregate anonymous unions into alternates in generator

Special-casing 'discriminator == {}' for handling anonymous unions
is getting awkward; since this particular type is not always a
dictionary on the wire, it is easier to treat it as a completely
different class of type, "alternate", so that if a type is listed
in the union_types array, we know it is not an anonymous union.

This patch just further segregates union handling, to make sure that
anonymous unions are not stored in union_types, and splitting up
check_union() into separate functions.  A future patch will change
the qapi grammar, and having the segregation already in place will
make it easier to deal with the distinct meta-type.

Signed-off-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
Eric Blake 2015-05-04 09:05:10 -06:00 committed by Markus Armbruster
parent 268a1c5eb1
commit 811d04fd0c
5 changed files with 62 additions and 40 deletions

View file

@ -170,7 +170,7 @@ typedef enum %(name)s
return lookup_decl + enum_decl
def generate_anon_union_qtypes(expr):
def generate_alternate_qtypes(expr):
name = expr['union']
members = expr['data']
@ -181,7 +181,7 @@ const int %(name)s_qtypes[QTYPE_MAX] = {
name=name)
for key in members:
qtype = find_anonymous_member_qtype(members[key])
qtype = find_alternate_member_qtype(members[key])
assert qtype, "Invalid anonymous union member"
ret += mcgen('''
@ -408,7 +408,7 @@ for expr in exprs:
fdef.write(generate_enum_lookup('%sKind' % expr['union'],
expr['data'].keys()))
if expr.get('discriminator') == {}:
fdef.write(generate_anon_union_qtypes(expr))
fdef.write(generate_alternate_qtypes(expr))
else:
continue
fdecl.write(ret)