[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 15/50] qapi-types: refactor variants handling
From: |
Marc-André Lureau |
Subject: |
[Qemu-devel] [PATCH v3 15/50] qapi-types: refactor variants handling |
Date: |
Mon, 11 Sep 2017 13:05:48 +0200 |
Generate variants objects outside gen_object(). This will allow to
easily wrap gen_object() with ifcond_decorator in the following patch.
Signed-off-by: Marc-André Lureau <address@hidden>
---
scripts/qapi-types.py | 37 +++++++++++++++++++++++--------------
1 file changed, 23 insertions(+), 14 deletions(-)
diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py
index 915786c463..2b3588267b 100644
--- a/scripts/qapi-types.py
+++ b/scripts/qapi-types.py
@@ -53,23 +53,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():
@@ -218,11 +222,7 @@ class QAPISchemaGenTypeVisitor(QAPISchemaVisitor):
self.decl += 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._fwdecl += gen_fwd_object_or_array(name)
+ def _gen_object(self, name, info, ifcond, base, members, variants):
self.decl += gen_object(name, base, members, variants)
if base and not base.is_implicit():
self.decl += gen_upcast(name, base)
@@ -232,10 +232,19 @@ class QAPISchemaGenTypeVisitor(QAPISchemaVisitor):
# 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._fwdecl += gen_fwd_object_or_array(name)
+ self.decl += gen_variants_objects(variants)
+ self._gen_object(name, info, None, base, members, variants)
+
def visit_alternate_type(self, name, info, ifcond, variants):
self._fwdecl += gen_fwd_object_or_array(name)
- self.decl += gen_object(name, None, [variants.tag_member], variants)
- self._gen_type_cleanup(name)
+ self.decl += gen_variants_objects(variants)
+ self._gen_object(name, info, None, None,
+ [variants.tag_member], variants)
# If you link code generated from multiple schemata, you want only one
# instance of the code for built-in types. Generate it only when
--
2.14.1.146.gd35faa819
- [Qemu-devel] [PATCH v3 06/50] qapi: pass 'if' condition into QAPISchemaEntity objects, (continued)
- [Qemu-devel] [PATCH v3 06/50] qapi: pass 'if' condition into QAPISchemaEntity objects, Marc-André Lureau, 2017/09/11
- [Qemu-devel] [PATCH v3 08/50] qapi: mcgen() shouldn't indent # lines, Marc-André Lureau, 2017/09/11
- [Qemu-devel] [PATCH v3 10/50] qapi-introspect: modify to_qlit() to append ', ' on level > 0, Marc-André Lureau, 2017/09/11
- [Qemu-devel] [PATCH v3 11/50] qapi-introspect: modify to_qlit() to generate #if code, Marc-André Lureau, 2017/09/11
- [Qemu-devel] [PATCH v3 09/50] qapi: add #if/#endif helpers, Marc-André Lureau, 2017/09/11
- [Qemu-devel] [PATCH v3 12/50] qapi-introspect: add preprocessor conditions to generated QLit, Marc-André Lureau, 2017/09/11
- [Qemu-devel] [PATCH v3 13/50] qapi-commands: add #if conditions to commands, Marc-André Lureau, 2017/09/11
- [Qemu-devel] [PATCH v3 14/50] qapi-event: add #if conditions to events, Marc-André Lureau, 2017/09/11
- [Qemu-devel] [PATCH v3 17/50] qapi: do not define enumeration value explicitely, Marc-André Lureau, 2017/09/11
- [Qemu-devel] [PATCH v3 16/50] qapi-types: add #if conditions to types & visitors, Marc-André Lureau, 2017/09/11
- [Qemu-devel] [PATCH v3 15/50] qapi-types: refactor variants handling,
Marc-André Lureau <=
- [Qemu-devel] [PATCH v3 19/50] qapi: add 'if' to enum members, Marc-André Lureau, 2017/09/11
- [Qemu-devel] [PATCH v3 18/50] qapi: change enum visitor to take QAPISchemaMember, Marc-André Lureau, 2017/09/11
- [Qemu-devel] [PATCH v3 21/50] qapi: add #if conditions on generated enum members, Marc-André Lureau, 2017/09/11
- [Qemu-devel] [PATCH v3 20/50] qapi-event: add 'if' condition to generated enum, Marc-André Lureau, 2017/09/11
- [Qemu-devel] [PATCH v3 23/50] qapi: add 'if' to struct members and implicit objects members, Marc-André Lureau, 2017/09/11
- [Qemu-devel] [PATCH v3 22/50] tests: add some enum members tests, Marc-André Lureau, 2017/09/11
- [Qemu-devel] [PATCH v3 24/50] qapi: add some struct member tests, Marc-André Lureau, 2017/09/11
- [Qemu-devel] [PATCH v3 25/50] qapi: add #if conditions to generated struct members, Marc-André Lureau, 2017/09/11
- [Qemu-devel] [PATCH v3 27/50] qapi: add #if conditions to generated variants, Marc-André Lureau, 2017/09/11
- [Qemu-devel] [PATCH v3 26/50] qapi: add 'if' on union variants, Marc-André Lureau, 2017/09/11