mirror of https://github.com/xqemu/xqemu.git
qapi: Support downstream simple unions
Enhance the testsuite to cover downstream simple unions, including when a union branch is a downstream name. 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
83a02706bb
commit
bb33729043
|
@ -193,7 +193,7 @@ const int %(name)s_qtypes[QTYPE_MAX] = {
|
||||||
|
|
||||||
def generate_union(expr, meta):
|
def generate_union(expr, meta):
|
||||||
|
|
||||||
name = expr[meta]
|
name = c_name(expr[meta])
|
||||||
typeinfo = expr['data']
|
typeinfo = expr['data']
|
||||||
|
|
||||||
base = expr.get('base')
|
base = expr.get('base')
|
||||||
|
|
|
@ -255,9 +255,9 @@ def generate_visit_union(expr):
|
||||||
disc_type = enum_define['enum_name']
|
disc_type = enum_define['enum_name']
|
||||||
else:
|
else:
|
||||||
# There will always be a discriminator in the C switch code, by default
|
# There will always be a discriminator in the C switch code, by default
|
||||||
# it is an enum type generated silently as "'%sKind' % (name)"
|
# it is an enum type generated silently
|
||||||
ret = generate_visit_enum('%sKind' % name, members.keys())
|
ret = generate_visit_enum(name + 'Kind', members.keys())
|
||||||
disc_type = '%sKind' % (name)
|
disc_type = c_name(name) + 'Kind'
|
||||||
|
|
||||||
if base:
|
if base:
|
||||||
assert discriminator
|
assert discriminator
|
||||||
|
@ -281,7 +281,7 @@ void visit_type_%(name)s(Visitor *m, %(name)s **obj, const char *name, Error **e
|
||||||
}
|
}
|
||||||
if (*obj) {
|
if (*obj) {
|
||||||
''',
|
''',
|
||||||
name=name)
|
name=c_name(name))
|
||||||
|
|
||||||
if base:
|
if base:
|
||||||
ret += mcgen('''
|
ret += mcgen('''
|
||||||
|
|
|
@ -114,3 +114,4 @@
|
||||||
'data': { '__org.qemu_x-member1': '__org.qemu_x-Enum' } }
|
'data': { '__org.qemu_x-member1': '__org.qemu_x-Enum' } }
|
||||||
{ 'struct': '__org.qemu_x-Struct', 'base': '__org.qemu_x-Base',
|
{ 'struct': '__org.qemu_x-Struct', 'base': '__org.qemu_x-Base',
|
||||||
'data': { '__org.qemu_x-member2': 'str' } }
|
'data': { '__org.qemu_x-member2': 'str' } }
|
||||||
|
{ 'union': '__org.qemu_x-Union1', 'data': { '__org.qemu_x-branch': 'str' } }
|
||||||
|
|
|
@ -25,11 +25,13 @@
|
||||||
OrderedDict([('event', 'EVENT_D'), ('data', OrderedDict([('a', 'EventStructOne'), ('b', 'str'), ('*c', 'str'), ('*enum3', 'EnumOne')]))]),
|
OrderedDict([('event', 'EVENT_D'), ('data', OrderedDict([('a', 'EventStructOne'), ('b', 'str'), ('*c', 'str'), ('*enum3', 'EnumOne')]))]),
|
||||||
OrderedDict([('enum', '__org.qemu_x-Enum'), ('data', ['__org.qemu_x-value'])]),
|
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-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([('union', '__org.qemu_x-Union1'), ('data', OrderedDict([('__org.qemu_x-branch', 'str')]))])]
|
||||||
[{'enum_name': 'EnumOne', 'enum_values': ['value1', 'value2', 'value3']},
|
[{'enum_name': 'EnumOne', 'enum_values': ['value1', 'value2', 'value3']},
|
||||||
{'enum_name': '__org.qemu_x-Enum', 'enum_values': ['__org.qemu_x-value']},
|
{'enum_name': '__org.qemu_x-Enum', 'enum_values': ['__org.qemu_x-value']},
|
||||||
{'enum_name': 'UserDefAlternateKind', 'enum_values': None},
|
{'enum_name': 'UserDefAlternateKind', 'enum_values': None},
|
||||||
{'enum_name': 'UserDefNativeListUnionKind', 'enum_values': None}]
|
{'enum_name': 'UserDefNativeListUnionKind', 'enum_values': None},
|
||||||
|
{'enum_name': '__org.qemu_x-Union1Kind', 'enum_values': None}]
|
||||||
[OrderedDict([('struct', 'NestedEnumsOne'), ('data', OrderedDict([('enum1', 'EnumOne'), ('*enum2', 'EnumOne'), ('enum3', 'EnumOne'), ('*enum4', 'EnumOne')]))]),
|
[OrderedDict([('struct', 'NestedEnumsOne'), ('data', OrderedDict([('enum1', 'EnumOne'), ('*enum2', 'EnumOne'), ('enum3', 'EnumOne'), ('*enum4', 'EnumOne')]))]),
|
||||||
OrderedDict([('struct', 'UserDefZero'), ('data', OrderedDict([('integer', 'int')]))]),
|
OrderedDict([('struct', 'UserDefZero'), ('data', OrderedDict([('integer', 'int')]))]),
|
||||||
OrderedDict([('struct', 'UserDefOne'), ('base', 'UserDefZero'), ('data', OrderedDict([('string', 'str'), ('*enum1', 'EnumOne')]))]),
|
OrderedDict([('struct', 'UserDefOne'), ('base', 'UserDefZero'), ('data', OrderedDict([('string', 'str'), ('*enum1', 'EnumOne')]))]),
|
||||||
|
|
Loading…
Reference in New Issue