qapi: Simplify QAPISchemaIfCond's interface for generating C

QAPISchemaIfCond.cgen() is only ever used like

    gen_if(ifcond.cgen())

and

    gen_endif(ifcond.cgen())

Simplify to

    ifcond.gen_if()

and

    ifcond.gen_endif()

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20210831123809.1107782-2-armbru@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
[Import statements tidied up with isort]
This commit is contained in:
Markus Armbruster 2021-08-31 14:37:58 +02:00
parent 3e038d7d7a
commit 1889e57a71
5 changed files with 31 additions and 38 deletions

View file

@ -24,8 +24,6 @@ from typing import (
from .common import ( from .common import (
c_fname, c_fname,
c_name, c_name,
gen_endif,
gen_if,
guardend, guardend,
guardstart, guardstart,
mcgen, mcgen,
@ -95,9 +93,9 @@ def _wrap_ifcond(ifcond: QAPISchemaIfCond, before: str, after: str) -> str:
if added[0] == '\n': if added[0] == '\n':
out += '\n' out += '\n'
added = added[1:] added = added[1:]
out += gen_if(ifcond.cgen()) out += ifcond.gen_if()
out += added out += added
out += gen_endif(ifcond.cgen()) out += ifcond.gen_endif()
return out return out

View file

@ -22,12 +22,7 @@ from typing import (
Union, Union,
) )
from .common import ( from .common import c_name, mcgen
c_name,
gen_endif,
gen_if,
mcgen,
)
from .gen import QAPISchemaMonolithicCVisitor from .gen import QAPISchemaMonolithicCVisitor
from .schema import ( from .schema import (
QAPISchema, QAPISchema,
@ -124,10 +119,10 @@ def _tree_to_qlit(obj: JSONValue,
if obj.comment: if obj.comment:
ret += indent(level) + f"/* {obj.comment} */\n" ret += indent(level) + f"/* {obj.comment} */\n"
if obj.ifcond.is_present(): if obj.ifcond.is_present():
ret += gen_if(obj.ifcond.cgen()) ret += obj.ifcond.gen_if()
ret += _tree_to_qlit(obj.value, level) ret += _tree_to_qlit(obj.value, level)
if obj.ifcond.is_present(): if obj.ifcond.is_present():
ret += '\n' + gen_endif(obj.ifcond.cgen()) ret += '\n' + obj.ifcond.gen_endif()
return ret return ret
ret = '' ret = ''

View file

@ -24,6 +24,8 @@ from .common import (
c_name, c_name,
cgen_ifcond, cgen_ifcond,
docgen_ifcond, docgen_ifcond,
gen_endif,
gen_if,
) )
from .error import QAPIError, QAPISemError, QAPISourceError from .error import QAPIError, QAPISemError, QAPISourceError
from .expr import check_exprs from .expr import check_exprs
@ -34,9 +36,15 @@ class QAPISchemaIfCond:
def __init__(self, ifcond=None): def __init__(self, ifcond=None):
self.ifcond = ifcond or {} self.ifcond = ifcond or {}
def cgen(self): def _cgen(self):
return cgen_ifcond(self.ifcond) return cgen_ifcond(self.ifcond)
def gen_if(self):
return gen_if(self._cgen())
def gen_endif(self):
return gen_endif(self._cgen())
def docgen(self): def docgen(self):
return docgen_ifcond(self.ifcond) return docgen_ifcond(self.ifcond)

View file

@ -15,13 +15,7 @@ This work is licensed under the terms of the GNU GPL, version 2.
from typing import List, Optional from typing import List, Optional
from .common import ( from .common import c_enum_const, c_name, mcgen
c_enum_const,
c_name,
gen_endif,
gen_if,
mcgen,
)
from .gen import QAPISchemaModularCVisitor, ifcontext from .gen import QAPISchemaModularCVisitor, ifcontext
from .schema import ( from .schema import (
QAPISchema, QAPISchema,
@ -51,13 +45,13 @@ const QEnumLookup %(c_name)s_lookup = {
''', ''',
c_name=c_name(name)) c_name=c_name(name))
for memb in members: for memb in members:
ret += gen_if(memb.ifcond.cgen()) ret += memb.ifcond.gen_if()
index = c_enum_const(name, memb.name, prefix) index = c_enum_const(name, memb.name, prefix)
ret += mcgen(''' ret += mcgen('''
[%(index)s] = "%(name)s", [%(index)s] = "%(name)s",
''', ''',
index=index, name=memb.name) index=index, name=memb.name)
ret += gen_endif(memb.ifcond.cgen()) ret += memb.ifcond.gen_endif()
ret += mcgen(''' ret += mcgen('''
}, },
@ -81,12 +75,12 @@ typedef enum %(c_name)s {
c_name=c_name(name)) c_name=c_name(name))
for memb in enum_members: for memb in enum_members:
ret += gen_if(memb.ifcond.cgen()) ret += memb.ifcond.gen_if()
ret += mcgen(''' ret += mcgen('''
%(c_enum)s, %(c_enum)s,
''', ''',
c_enum=c_enum_const(name, memb.name, prefix)) c_enum=c_enum_const(name, memb.name, prefix))
ret += gen_endif(memb.ifcond.cgen()) ret += memb.ifcond.gen_endif()
ret += mcgen(''' ret += mcgen('''
} %(c_name)s; } %(c_name)s;
@ -126,7 +120,7 @@ struct %(c_name)s {
def gen_struct_members(members: List[QAPISchemaObjectTypeMember]) -> str: def gen_struct_members(members: List[QAPISchemaObjectTypeMember]) -> str:
ret = '' ret = ''
for memb in members: for memb in members:
ret += gen_if(memb.ifcond.cgen()) ret += memb.ifcond.gen_if()
if memb.optional: if memb.optional:
ret += mcgen(''' ret += mcgen('''
bool has_%(c_name)s; bool has_%(c_name)s;
@ -136,7 +130,7 @@ def gen_struct_members(members: List[QAPISchemaObjectTypeMember]) -> str:
%(c_type)s %(c_name)s; %(c_type)s %(c_name)s;
''', ''',
c_type=memb.type.c_type(), c_name=c_name(memb.name)) c_type=memb.type.c_type(), c_name=c_name(memb.name))
ret += gen_endif(memb.ifcond.cgen()) ret += memb.ifcond.gen_endif()
return ret return ret
@ -159,7 +153,7 @@ def gen_object(name: str, ifcond: QAPISchemaIfCond,
ret += mcgen(''' ret += mcgen('''
''') ''')
ret += gen_if(ifcond.cgen()) ret += ifcond.gen_if()
ret += mcgen(''' ret += mcgen('''
struct %(c_name)s { struct %(c_name)s {
''', ''',
@ -193,7 +187,7 @@ struct %(c_name)s {
ret += mcgen(''' ret += mcgen('''
}; };
''') ''')
ret += gen_endif(ifcond.cgen()) ret += ifcond.gen_endif()
return ret return ret
@ -220,13 +214,13 @@ def gen_variants(variants: QAPISchemaVariants) -> str:
for var in variants.variants: for var in variants.variants:
if var.type.name == 'q_empty': if var.type.name == 'q_empty':
continue continue
ret += gen_if(var.ifcond.cgen()) ret += var.ifcond.gen_if()
ret += mcgen(''' ret += mcgen('''
%(c_type)s %(c_name)s; %(c_type)s %(c_name)s;
''', ''',
c_type=var.type.c_unboxed_type(), c_type=var.type.c_unboxed_type(),
c_name=c_name(var.name)) c_name=c_name(var.name))
ret += gen_endif(var.ifcond.cgen()) ret += var.ifcond.gen_endif()
ret += mcgen(''' ret += mcgen('''
} u; } u;

View file

@ -18,8 +18,6 @@ from typing import List, Optional
from .common import ( from .common import (
c_enum_const, c_enum_const,
c_name, c_name,
gen_endif,
gen_if,
indent, indent,
mcgen, mcgen,
) )
@ -79,7 +77,7 @@ bool visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
for memb in members: for memb in members:
deprecated = 'deprecated' in [f.name for f in memb.features] deprecated = 'deprecated' in [f.name for f in memb.features]
ret += gen_if(memb.ifcond.cgen()) ret += memb.ifcond.gen_if()
if memb.optional: if memb.optional:
ret += mcgen(''' ret += mcgen('''
if (visit_optional(v, "%(name)s", &obj->has_%(c_name)s)) { if (visit_optional(v, "%(name)s", &obj->has_%(c_name)s)) {
@ -112,7 +110,7 @@ bool visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
ret += mcgen(''' ret += mcgen('''
} }
''') ''')
ret += gen_endif(memb.ifcond.cgen()) ret += memb.ifcond.gen_endif()
if variants: if variants:
tag_member = variants.tag_member tag_member = variants.tag_member
@ -126,7 +124,7 @@ bool visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
for var in variants.variants: for var in variants.variants:
case_str = c_enum_const(tag_member.type.name, var.name, case_str = c_enum_const(tag_member.type.name, var.name,
tag_member.type.prefix) tag_member.type.prefix)
ret += gen_if(var.ifcond.cgen()) ret += var.ifcond.gen_if()
if var.type.name == 'q_empty': if var.type.name == 'q_empty':
# valid variant and nothing to do # valid variant and nothing to do
ret += mcgen(''' ret += mcgen('''
@ -142,7 +140,7 @@ bool visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
case=case_str, case=case_str,
c_type=var.type.c_name(), c_name=c_name(var.name)) c_type=var.type.c_name(), c_name=c_name(var.name))
ret += gen_endif(var.ifcond.cgen()) ret += var.ifcond.gen_endif()
ret += mcgen(''' ret += mcgen('''
default: default:
abort(); abort();
@ -228,7 +226,7 @@ bool visit_type_%(c_name)s(Visitor *v, const char *name,
c_name=c_name(name)) c_name=c_name(name))
for var in variants.variants: for var in variants.variants:
ret += gen_if(var.ifcond.cgen()) ret += var.ifcond.gen_if()
ret += mcgen(''' ret += mcgen('''
case %(case)s: case %(case)s:
''', ''',
@ -254,7 +252,7 @@ bool visit_type_%(c_name)s(Visitor *v, const char *name,
ret += mcgen(''' ret += mcgen('''
break; break;
''') ''')
ret += gen_endif(var.ifcond.cgen()) ret += var.ifcond.gen_endif()
ret += mcgen(''' ret += mcgen('''
case QTYPE_NONE: case QTYPE_NONE: