[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 14/49] qapi-types: add #if conditions to types &
From: |
Marc-André Lureau |
Subject: |
[Qemu-devel] [PATCH v3 14/49] qapi-types: add #if conditions to types & visitors |
Date: |
Wed, 21 Mar 2018 12:51:36 +0100 |
Types & visitors are coupled and must be handled together to avoid
temporary build regression.
Wrap generated types/visitor code with #if/#endif using the context
helpers.
Signed-off-by: Marc-André Lureau <address@hidden>
---
scripts/qapi/types.py | 46 ++++++++++++++++++++++++++-----------------
scripts/qapi/visit.py | 33 ++++++++++++++++++-------------
2 files changed, 47 insertions(+), 32 deletions(-)
diff --git a/scripts/qapi/types.py b/scripts/qapi/types.py
index 3d9b0f9a07..ce4c91206c 100644
--- a/scripts/qapi/types.py
+++ b/scripts/qapi/types.py
@@ -61,8 +61,10 @@ def gen_variants_objects(variants):
for v in variants.variants:
if isinstance(v.type, QAPISchemaObjectType):
ret += gen_variants_objects(v.type.variants)
+ ret += gen_if(v.type.ifcond)
ret += gen_object(v.type.name, v.type.base,
v.type.local_members, v.type.variants)
+ ret += gen_endif(v.type.ifcond)
return ret
@@ -206,41 +208,49 @@ class QAPISchemaGenTypeVisitor(QAPISchemaModularCVisitor):
# gen_object() is recursive, ensure it doesn't visit the empty type
objects_seen.add(schema.the_empty_object_type.name)
- def _gen_type_cleanup(self, name):
- self._genh.add(gen_type_cleanup_decl(name))
- self._genc.add(gen_type_cleanup(name))
+ def _gen_type_cleanup(self, name, ifcond):
+ with ifcontext(ifcond, self._genh, self._genc):
+ self._genh.add(gen_type_cleanup_decl(name))
+ self._genc.add(gen_type_cleanup(name))
def visit_enum_type(self, name, info, ifcond, values, prefix):
- self._genh.preamble_add(gen_enum(name, values, prefix))
- self._genc.add(gen_enum_lookup(name, values, prefix))
+ with ifcontext(ifcond, self._genh, self._genc):
+ self._genh.preamble_add(gen_enum(name, values, prefix))
+ self._genc.add(gen_enum_lookup(name, values, prefix))
def visit_array_type(self, name, info, ifcond, element_type):
- self._genh.preamble_add(gen_fwd_object_or_array(name))
- self._genh.add(gen_array(name, element_type))
- self._gen_type_cleanup(name)
+ with ifcontext(ifcond, self._genh):
+ self._genh.preamble_add(gen_fwd_object_or_array(name))
+ self._genh.add(gen_array(name, element_type))
+ self._gen_type_cleanup(name, ifcond)
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))
- # TODO Worth changing the visitor signature, so we could
- # directly use rather than repeat type.is_implicit()?
+ with ifcontext(ifcond, self._genh):
+ self._genh.add(gen_object(name, base, members, variants))
+ if base and not base.is_implicit():
+ self._genh.add(gen_upcast(name, base))
+ # TODO Worth changing the visitor signature, so we could
+ # directly use rather than repeat type.is_implicit()?
if not name.startswith('q_'):
# implicit types won't be directly allocated/freed
- self._gen_type_cleanup(name)
+ self._gen_type_cleanup(name, ifcond)
+
+ def _gen_fwd_object_or_array(self, name, ifcond):
+ with ifcontext(ifcond, self._genh):
+ self._genh.preamble_add(gen_fwd_object_or_array(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._gen_fwd_object_or_array(name, ifcond)
self._genh.add(gen_variants_objects(variants))
- self._gen_object(name, info, None, base, members, variants)
+ self._gen_object(name, info, ifcond, base, members, variants)
def visit_alternate_type(self, name, info, ifcond, variants):
- self._genh.preamble_add(gen_fwd_object_or_array(name))
+ self._gen_fwd_object_or_array(name, ifcond)
self._genh.add(gen_variants_objects(variants))
- self._gen_object(name, info, None, None,
+ self._gen_object(name, info, ifcond, None,
[variants.tag_member], variants)
diff --git a/scripts/qapi/visit.py b/scripts/qapi/visit.py
index 9ea2e04f81..e4a62ce030 100644
--- a/scripts/qapi/visit.py
+++ b/scripts/qapi/visit.py
@@ -302,29 +302,34 @@ class
QAPISchemaGenVisitVisitor(QAPISchemaModularCVisitor):
types=types))
def visit_enum_type(self, name, info, ifcond, values, prefix):
- self._genh.add(gen_visit_decl(name, scalar=True))
- self._genc.add(gen_visit_enum(name))
+ with ifcontext(ifcond, self._genh, self._genc):
+ self._genh.add(gen_visit_decl(name, scalar=True))
+ self._genc.add(gen_visit_enum(name))
def visit_array_type(self, name, info, ifcond, element_type):
- self._genh.add(gen_visit_decl(name))
- self._genc.add(gen_visit_list(name, element_type))
+ with ifcontext(ifcond, self._genh, self._genc):
+ self._genh.add(gen_visit_decl(name))
+ self._genc.add(gen_visit_list(name, element_type))
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.add(gen_visit_members_decl(name))
- self._genc.add(gen_visit_object_members(name, base, members, variants))
- # TODO Worth changing the visitor signature, so we could
- # directly use rather than repeat type.is_implicit()?
- if not name.startswith('q_'):
- # only explicit types need an allocating visit
- self._genh.add(gen_visit_decl(name))
- self._genc.add(gen_visit_object(name, base, members, variants))
+ with ifcontext(ifcond, self._genh, self._genc):
+ self._genh.add(gen_visit_members_decl(name))
+ self._genc.add(gen_visit_object_members(name, base,
+ members, variants))
+ # TODO Worth changing the visitor signature, so we could
+ # directly use rather than repeat type.is_implicit()?
+ if not name.startswith('q_'):
+ # only explicit types need an allocating visit
+ self._genh.add(gen_visit_decl(name))
+ self._genc.add(gen_visit_object(name, base, members, variants))
def visit_alternate_type(self, name, info, ifcond, variants):
- self._genh.add(gen_visit_decl(name))
- self._genc.add(gen_visit_alternate(name, variants))
+ with ifcontext(ifcond, self._genh, self._genc):
+ self._genh.add(gen_visit_decl(name))
+ self._genc.add(gen_visit_alternate(name, variants))
def gen_visit(schema, output_dir, prefix, opt_builtins):
--
2.16.2.521.g9aa15f885a
- [Qemu-devel] [PATCH v3 04/49] qapi: pass 'if' condition into QAPISchemaEntity objects, (continued)
- [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, 2018/03/21
- [Qemu-devel] [PATCH v3 14/49] qapi-types: add #if conditions to types & visitors,
Marc-André Lureau <=
- [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
- [Qemu-devel] [PATCH v3 25/49] qapi: add 'if' to implicit struct members, Marc-André Lureau, 2018/03/21