@@ -55,23 +55,27 @@ def gen_struct_members(members):
return ret
-def gen_object(name, base, members, variants):
- if name in objects_seen:
- return ''
- objects_seen.add(name)
-
+def gen_variants_objects(variants):
ret = ''
if variants:
for v in variants.variants:
if isinstance(v.type, QAPISchemaObjectType):
+ ret += gen_variants_objects(v.type.variants)
ret += gen_object(v.type.name, v.type.base,
v.type.local_members, v.type.variants)
+ return ret
- ret += mcgen('''
+
+def gen_object(name, base, members, variants):
+ if name in objects_seen:
+ return ''
+ objects_seen.add(name)
+
+ ret = mcgen('''
struct %(c_name)s {
''',
- c_name=c_name(name))
+ c_name=c_name(name))
if base:
if not base.is_implicit():
@@ -215,11 +219,7 @@ class QAPISchemaGenTypeVisitor(QAPISchemaModularCVisitor):
self._genh.add(gen_array(name, element_type))
self._gen_type_cleanup(name)
- def visit_object_type(self, name, info, ifcond, base, members, variants):
- # Nothing to do for the special empty builtin
- if name == 'q_empty':
- return
- self._genh.preamble_add(gen_fwd_object_or_array(name))
+ def _gen_object(self, name, info, ifcond, base, members, variants):
self._genh.add(gen_object(name, base, members, variants))
if base and not base.is_implicit():
self._genh.add(gen_upcast(name, base))
@@ -229,11 +229,19 @@ class QAPISchemaGenTypeVisitor(QAPISchemaModularCVisitor):
# implicit types won't be directly allocated/freed
self._gen_type_cleanup(name)
+ def visit_object_type(self, name, info, ifcond, base, members, variants):
+ # Nothing to do for the special empty builtin
+ if name == 'q_empty':
+ return
+ self._genh.preamble_add(gen_fwd_object_or_array(name))
+ self._genh.add(gen_variants_objects(variants))
+ self._gen_object(name, info, None, base, members, variants)
+
def visit_alternate_type(self, name, info, ifcond, variants):
self._genh.preamble_add(gen_fwd_object_or_array(name))
- self._genh.add(gen_object(name, None,
- [variants.tag_member], variants))
- self._gen_type_cleanup(name)
+ self._genh.add(gen_variants_objects(variants))
+ self._gen_object(name, info, None, None,
+ [variants.tag_member], variants)
def gen_types(schema, output_dir, prefix, opt_builtins):
Generate variants objects outside gen_object(). This will allow to easily wrap gen_object() with ifcond_decorator in the following patch. gen_variants_objects() calls gen_object() for each variants, so it remains guarded for each generated variant object. self._gen_type_cleanup(name) is factored out in _gen_object(), helping generated code to be wrapped by the same condition in the following patch. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> --- scripts/qapi/types.py | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-)