qapi: introduce QAPISchemaIfCond.cgen()

Instead of building prepocessor conditions from a list of string, use
the result generated from QAPISchemaIfCond.cgen() and hide the
implementation details.

Note: this patch introduces a minor regression, generating a redundant
pair of parenthesis. This is mostly fixed in a later patch in this
series ("qapi: replace if condition list with dict [..]")

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20210804083105.97531-5-marcandre.lureau@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
[Commit message tweaked]
Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
Marc-André Lureau
2021-08-04 12:30:59 +04:00
committed by Markus Armbruster
parent 33aa3267ba
commit 6cc2e4817f
6 changed files with 46 additions and 34 deletions

View File

@ -51,13 +51,13 @@ const QEnumLookup %(c_name)s_lookup = {
''',
c_name=c_name(name))
for memb in members:
ret += gen_if(memb.ifcond.ifcond)
ret += gen_if(memb.ifcond.cgen())
index = c_enum_const(name, memb.name, prefix)
ret += mcgen('''
[%(index)s] = "%(name)s",
''',
index=index, name=memb.name)
ret += gen_endif(memb.ifcond.ifcond)
ret += gen_endif(memb.ifcond.cgen())
ret += mcgen('''
},
@ -81,12 +81,12 @@ typedef enum %(c_name)s {
c_name=c_name(name))
for memb in enum_members:
ret += gen_if(memb.ifcond.ifcond)
ret += gen_if(memb.ifcond.cgen())
ret += mcgen('''
%(c_enum)s,
''',
c_enum=c_enum_const(name, memb.name, prefix))
ret += gen_endif(memb.ifcond.ifcond)
ret += gen_endif(memb.ifcond.cgen())
ret += mcgen('''
} %(c_name)s;
@ -126,7 +126,7 @@ struct %(c_name)s {
def gen_struct_members(members: List[QAPISchemaObjectTypeMember]) -> str:
ret = ''
for memb in members:
ret += gen_if(memb.ifcond.ifcond)
ret += gen_if(memb.ifcond.cgen())
if memb.optional:
ret += mcgen('''
bool has_%(c_name)s;
@ -136,7 +136,7 @@ def gen_struct_members(members: List[QAPISchemaObjectTypeMember]) -> str:
%(c_type)s %(c_name)s;
''',
c_type=memb.type.c_type(), c_name=c_name(memb.name))
ret += gen_endif(memb.ifcond.ifcond)
ret += gen_endif(memb.ifcond.cgen())
return ret
@ -159,7 +159,7 @@ def gen_object(name: str, ifcond: QAPISchemaIfCond,
ret += mcgen('''
''')
ret += gen_if(ifcond.ifcond)
ret += gen_if(ifcond.cgen())
ret += mcgen('''
struct %(c_name)s {
''',
@ -193,7 +193,7 @@ struct %(c_name)s {
ret += mcgen('''
};
''')
ret += gen_endif(ifcond.ifcond)
ret += gen_endif(ifcond.cgen())
return ret
@ -220,13 +220,13 @@ def gen_variants(variants: QAPISchemaVariants) -> str:
for var in variants.variants:
if var.type.name == 'q_empty':
continue
ret += gen_if(var.ifcond.ifcond)
ret += gen_if(var.ifcond.cgen())
ret += mcgen('''
%(c_type)s %(c_name)s;
''',
c_type=var.type.c_unboxed_type(),
c_name=c_name(var.name))
ret += gen_endif(var.ifcond.ifcond)
ret += gen_endif(var.ifcond.cgen())
ret += mcgen('''
} u;