[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 13/49] qapi-types: refactor variants handling
From: |
Marc-André Lureau |
Subject: |
[Qemu-devel] [PATCH v3 13/49] qapi-types: refactor variants handling |
Date: |
Wed, 21 Mar 2018 12:51:35 +0100 |
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 <address@hidden>
---
scripts/qapi/types.py | 38 +++++++++++++++++++++++---------------
1 file changed, 23 insertions(+), 15 deletions(-)
diff --git a/scripts/qapi/types.py b/scripts/qapi/types.py
index 298a80db62..3d9b0f9a07 100644
--- a/scripts/qapi/types.py
+++ b/scripts/qapi/types.py
@@ -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):
--
2.16.2.521.g9aa15f885a
- [Qemu-devel] [PATCH v3 03/49] qapi: add 'if' to top-level expressions, (continued)
- [Qemu-devel] [PATCH v3 03/49] qapi: add 'if' to top-level expressions, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 04/49] qapi: pass 'if' condition into QAPISchemaEntity objects, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 05/49] qapi: leave the ifcond attribute undefined until check(), Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 06/49] qapi: add 'ifcond' to visitor methods, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 07/49] qapi: mcgen() shouldn't indent # lines, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 08/49] qapi: add #if/#endif helpers, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 10/49] qapi-introspect: add preprocessor conditions to generated QLit, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 09/49] qapi-introspect: modify to_qlit() to append ', ' on level > 0, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 11/49] qapi/commands: add #if conditions to commands, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 12/49] qapi/events: add #if conditions to events, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 13/49] qapi-types: refactor variants handling,
Marc-André Lureau <=
- [Qemu-devel] [PATCH v3 14/49] qapi-types: add #if conditions to types & visitors, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 15/49] qapi: do not define enumeration value explicitely, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 16/49] qapi: rename QAPISchemaEnumType.values to .members, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 17/49] qapi: change enum visitor to take QAPISchemaMember, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 18/49] tests: modify visit_enum_type() in test-qapi to print members, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 19/49] qapi: factor out check_known_keys(), Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 20/49] qapi: add a dictionnary form with 'name' key for enum members, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 21/49] qapi: add 'if' to enum members, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 22/49] qapi-event: add 'if' condition to implicit event enum, Marc-André Lureau, 2018/03/21
- [Qemu-devel] [PATCH v3 23/49] qapi: rename allow_dict to allow_implicit, Marc-André Lureau, 2018/03/21