qapi: Support downstream flat unions
Enhance the testsuite to cover downstream flat unions, including the base type, discriminator name and type, and branch name and type. Update the generator to mangle the union names in the appropriate places. Signed-off-by: Eric Blake <eblake@redhat.com> Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
parent
bb33729043
commit
857af5f06c
@ -213,7 +213,7 @@ struct %(name)s
|
||||
void *data;
|
||||
''',
|
||||
name=name,
|
||||
discriminator_type_name=discriminator_type_name)
|
||||
discriminator_type_name=c_name(discriminator_type_name))
|
||||
|
||||
for key in typeinfo:
|
||||
ret += mcgen('''
|
||||
|
@ -252,7 +252,7 @@ def generate_visit_union(expr):
|
||||
if enum_define:
|
||||
# Use the enum type as discriminator
|
||||
ret = ""
|
||||
disc_type = enum_define['enum_name']
|
||||
disc_type = c_name(enum_define['enum_name'])
|
||||
else:
|
||||
# There will always be a discriminator in the C switch code, by default
|
||||
# it is an enum type generated silently
|
||||
@ -290,7 +290,7 @@ void visit_type_%(name)s(Visitor *m, %(name)s **obj, const char *name, Error **e
|
||||
goto out_obj;
|
||||
}
|
||||
''',
|
||||
name=name)
|
||||
name=c_name(name))
|
||||
|
||||
if not discriminator:
|
||||
disc_key = "type"
|
||||
|
@ -115,3 +115,8 @@
|
||||
{ 'struct': '__org.qemu_x-Struct', 'base': '__org.qemu_x-Base',
|
||||
'data': { '__org.qemu_x-member2': 'str' } }
|
||||
{ 'union': '__org.qemu_x-Union1', 'data': { '__org.qemu_x-branch': 'str' } }
|
||||
{ 'struct': '__org.qemu_x-Struct2',
|
||||
'data': { 'array': ['__org.qemu_x-Union1'] } }
|
||||
{ 'union': '__org.qemu_x-Union2', 'base': '__org.qemu_x-Base',
|
||||
'discriminator': '__org.qemu_x-member1',
|
||||
'data': { '__org.qemu_x-value': '__org.qemu_x-Struct2' } }
|
||||
|
@ -26,7 +26,9 @@
|
||||
OrderedDict([('enum', '__org.qemu_x-Enum'), ('data', ['__org.qemu_x-value'])]),
|
||||
OrderedDict([('struct', '__org.qemu_x-Base'), ('data', OrderedDict([('__org.qemu_x-member1', '__org.qemu_x-Enum')]))]),
|
||||
OrderedDict([('struct', '__org.qemu_x-Struct'), ('base', '__org.qemu_x-Base'), ('data', OrderedDict([('__org.qemu_x-member2', 'str')]))]),
|
||||
OrderedDict([('union', '__org.qemu_x-Union1'), ('data', OrderedDict([('__org.qemu_x-branch', 'str')]))])]
|
||||
OrderedDict([('union', '__org.qemu_x-Union1'), ('data', OrderedDict([('__org.qemu_x-branch', 'str')]))]),
|
||||
OrderedDict([('struct', '__org.qemu_x-Struct2'), ('data', OrderedDict([('array', ['__org.qemu_x-Union1'])]))]),
|
||||
OrderedDict([('union', '__org.qemu_x-Union2'), ('base', '__org.qemu_x-Base'), ('discriminator', '__org.qemu_x-member1'), ('data', OrderedDict([('__org.qemu_x-value', '__org.qemu_x-Struct2')]))])]
|
||||
[{'enum_name': 'EnumOne', 'enum_values': ['value1', 'value2', 'value3']},
|
||||
{'enum_name': '__org.qemu_x-Enum', 'enum_values': ['__org.qemu_x-value']},
|
||||
{'enum_name': 'UserDefAlternateKind', 'enum_values': None},
|
||||
@ -45,4 +47,5 @@
|
||||
OrderedDict([('struct', 'UserDefOptions'), ('data', OrderedDict([('*i64', ['int']), ('*u64', ['uint64']), ('*u16', ['uint16']), ('*i64x', 'int'), ('*u64x', 'uint64')]))]),
|
||||
OrderedDict([('struct', 'EventStructOne'), ('data', OrderedDict([('struct1', 'UserDefOne'), ('string', 'str'), ('*enum2', 'EnumOne')]))]),
|
||||
OrderedDict([('struct', '__org.qemu_x-Base'), ('data', OrderedDict([('__org.qemu_x-member1', '__org.qemu_x-Enum')]))]),
|
||||
OrderedDict([('struct', '__org.qemu_x-Struct'), ('base', '__org.qemu_x-Base'), ('data', OrderedDict([('__org.qemu_x-member2', 'str')]))])]
|
||||
OrderedDict([('struct', '__org.qemu_x-Struct'), ('base', '__org.qemu_x-Base'), ('data', OrderedDict([('__org.qemu_x-member2', 'str')]))]),
|
||||
OrderedDict([('struct', '__org.qemu_x-Struct2'), ('data', OrderedDict([('array', ['__org.qemu_x-Union1'])]))])]
|
||||
|
Loading…
x
Reference in New Issue
Block a user