qapi-types: add #if conditions to types & visitors

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. Derived from a patch by Marc-André.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20180703155648.11933-12-marcandre.lureau@redhat.com>
This commit is contained in:
Markus Armbruster 2018-07-03 17:56:45 +02:00
parent c3cd6aa020
commit 9f88c66211
2 changed files with 48 additions and 33 deletions

View File

@ -55,7 +55,7 @@ def gen_struct_members(members):
return ret return ret
def gen_object(name, base, members, variants): def gen_object(name, ifcond, base, members, variants):
if name in objects_seen: if name in objects_seen:
return '' return ''
objects_seen.add(name) objects_seen.add(name)
@ -64,11 +64,14 @@ def gen_object(name, base, members, variants):
if variants: if variants:
for v in variants.variants: for v in variants.variants:
if isinstance(v.type, QAPISchemaObjectType): if isinstance(v.type, QAPISchemaObjectType):
ret += gen_object(v.type.name, v.type.base, ret += gen_object(v.type.name, v.type.ifcond, v.type.base,
v.type.local_members, v.type.variants) v.type.local_members, v.type.variants)
ret += mcgen(''' ret += mcgen('''
''')
ret += gen_if(ifcond)
ret += mcgen('''
struct %(c_name)s { struct %(c_name)s {
''', ''',
c_name=c_name(name)) c_name=c_name(name))
@ -101,6 +104,7 @@ struct %(c_name)s {
ret += mcgen(''' ret += mcgen('''
}; };
''') ''')
ret += gen_endif(ifcond)
return ret return ret
@ -209,10 +213,12 @@ class QAPISchemaGenTypeVisitor(QAPISchemaModularCVisitor):
self._genc.add(gen_type_cleanup(name)) self._genc.add(gen_type_cleanup(name))
def visit_enum_type(self, name, info, ifcond, values, prefix): def visit_enum_type(self, name, info, ifcond, values, prefix):
with ifcontext(ifcond, self._genh, self._genc):
self._genh.preamble_add(gen_enum(name, values, prefix)) self._genh.preamble_add(gen_enum(name, values, prefix))
self._genc.add(gen_enum_lookup(name, values, prefix)) self._genc.add(gen_enum_lookup(name, values, prefix))
def visit_array_type(self, name, info, ifcond, element_type): def visit_array_type(self, name, info, ifcond, element_type):
with ifcontext(ifcond, self._genh, self._genc):
self._genh.preamble_add(gen_fwd_object_or_array(name)) self._genh.preamble_add(gen_fwd_object_or_array(name))
self._genh.add(gen_array(name, element_type)) self._genh.add(gen_array(name, element_type))
self._gen_type_cleanup(name) self._gen_type_cleanup(name)
@ -221,8 +227,10 @@ class QAPISchemaGenTypeVisitor(QAPISchemaModularCVisitor):
# Nothing to do for the special empty builtin # Nothing to do for the special empty builtin
if name == 'q_empty': if name == 'q_empty':
return return
with ifcontext(ifcond, self._genh):
self._genh.preamble_add(gen_fwd_object_or_array(name)) self._genh.preamble_add(gen_fwd_object_or_array(name))
self._genh.add(gen_object(name, base, members, variants)) self._genh.add(gen_object(name, ifcond, base, members, variants))
with ifcontext(ifcond, self._genh, self._genc):
if base and not base.is_implicit(): if base and not base.is_implicit():
self._genh.add(gen_upcast(name, base)) self._genh.add(gen_upcast(name, base))
# TODO Worth changing the visitor signature, so we could # TODO Worth changing the visitor signature, so we could
@ -232,9 +240,11 @@ class QAPISchemaGenTypeVisitor(QAPISchemaModularCVisitor):
self._gen_type_cleanup(name) self._gen_type_cleanup(name)
def visit_alternate_type(self, name, info, ifcond, variants): def visit_alternate_type(self, name, info, ifcond, variants):
with ifcontext(ifcond, self._genh):
self._genh.preamble_add(gen_fwd_object_or_array(name)) self._genh.preamble_add(gen_fwd_object_or_array(name))
self._genh.add(gen_object(name, None, self._genh.add(gen_object(name, ifcond, None,
[variants.tag_member], variants)) [variants.tag_member], variants))
with ifcontext(ifcond, self._genh, self._genc):
self._gen_type_cleanup(name) self._gen_type_cleanup(name)

View File

@ -311,10 +311,12 @@ class QAPISchemaGenVisitVisitor(QAPISchemaModularCVisitor):
types=types)) types=types))
def visit_enum_type(self, name, info, ifcond, values, prefix): def visit_enum_type(self, name, info, ifcond, values, prefix):
with ifcontext(ifcond, self._genh, self._genc):
self._genh.add(gen_visit_decl(name, scalar=True)) self._genh.add(gen_visit_decl(name, scalar=True))
self._genc.add(gen_visit_enum(name)) self._genc.add(gen_visit_enum(name))
def visit_array_type(self, name, info, ifcond, element_type): def visit_array_type(self, name, info, ifcond, element_type):
with ifcontext(ifcond, self._genh, self._genc):
self._genh.add(gen_visit_decl(name)) self._genh.add(gen_visit_decl(name))
self._genc.add(gen_visit_list(name, element_type)) self._genc.add(gen_visit_list(name, element_type))
@ -322,8 +324,10 @@ class QAPISchemaGenVisitVisitor(QAPISchemaModularCVisitor):
# Nothing to do for the special empty builtin # Nothing to do for the special empty builtin
if name == 'q_empty': if name == 'q_empty':
return return
with ifcontext(ifcond, self._genh, self._genc):
self._genh.add(gen_visit_members_decl(name)) self._genh.add(gen_visit_members_decl(name))
self._genc.add(gen_visit_object_members(name, base, members, variants)) self._genc.add(gen_visit_object_members(name, base,
members, variants))
# TODO Worth changing the visitor signature, so we could # TODO Worth changing the visitor signature, so we could
# directly use rather than repeat type.is_implicit()? # directly use rather than repeat type.is_implicit()?
if not name.startswith('q_'): if not name.startswith('q_'):
@ -332,6 +336,7 @@ class QAPISchemaGenVisitVisitor(QAPISchemaModularCVisitor):
self._genc.add(gen_visit_object(name, base, members, variants)) self._genc.add(gen_visit_object(name, base, members, variants))
def visit_alternate_type(self, name, info, ifcond, variants): def visit_alternate_type(self, name, info, ifcond, variants):
with ifcontext(ifcond, self._genh, self._genc):
self._genh.add(gen_visit_decl(name)) self._genh.add(gen_visit_decl(name))
self._genc.add(gen_visit_alternate(name, variants)) self._genc.add(gen_visit_alternate(name, variants))