[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v4 2/9] qapi: make gen_if/gen_endif take a simple string
From: |
marcandre . lureau |
Subject: |
[PATCH v4 2/9] qapi: make gen_if/gen_endif take a simple string |
Date: |
Mon, 17 May 2021 20:30:33 +0400 |
From: Marc-André Lureau <marcandre.lureau@redhat.com>
Instead of building prepocessor conditions from a list of string, use
the result generated from QAPISchemaIfCond.cgen().
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
scripts/qapi/common.py | 22 ++++++++++------------
scripts/qapi/gen.py | 4 ++--
scripts/qapi/introspect.py | 4 ++--
scripts/qapi/schema.py | 3 +++
scripts/qapi/types.py | 20 ++++++++++----------
scripts/qapi/visit.py | 12 ++++++------
6 files changed, 33 insertions(+), 32 deletions(-)
diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py
index cbd3fd81d3..9ab1c9ca55 100644
--- a/scripts/qapi/common.py
+++ b/scripts/qapi/common.py
@@ -194,19 +194,17 @@ def guardend(name: str) -> str:
name=c_fname(name).upper())
-def gen_if(ifcond: Sequence[str]) -> str:
- ret = ''
- for ifc in ifcond:
- ret += mcgen('''
+def gen_if(cond: str) -> str:
+ if not cond:
+ return ''
+ return mcgen('''
#if %(cond)s
-''', cond=ifc)
- return ret
+''', cond=cond)
-def gen_endif(ifcond: Sequence[str]) -> str:
- ret = ''
- for ifc in reversed(ifcond):
- ret += mcgen('''
+def gen_endif(cond: str) -> str:
+ if not cond:
+ return ''
+ return mcgen('''
#endif /* %(cond)s */
-''', cond=ifc)
- return ret
+''', cond=cond)
diff --git a/scripts/qapi/gen.py b/scripts/qapi/gen.py
index 1c5b190276..51a597a025 100644
--- a/scripts/qapi/gen.py
+++ b/scripts/qapi/gen.py
@@ -95,9 +95,9 @@ def _wrap_ifcond(ifcond: QAPISchemaIfCond, before: str,
after: str) -> str:
if added[0] == '\n':
out += '\n'
added = added[1:]
- out += gen_if(ifcond.ifcond)
+ out += gen_if(ifcond.cgen())
out += added
- out += gen_endif(ifcond.ifcond)
+ out += gen_endif(ifcond.cgen())
return out
diff --git a/scripts/qapi/introspect.py b/scripts/qapi/introspect.py
index 77a8c33ad4..474b08fd4d 100644
--- a/scripts/qapi/introspect.py
+++ b/scripts/qapi/introspect.py
@@ -124,10 +124,10 @@ def indent(level: int) -> str:
if obj.comment:
ret += indent(level) + f"/* {obj.comment} */\n"
if obj.ifcond:
- ret += gen_if(obj.ifcond.ifcond)
+ ret += gen_if(obj.ifcond.cgen())
ret += _tree_to_qlit(obj.value, level)
if obj.ifcond:
- ret += '\n' + gen_endif(obj.ifcond.ifcond)
+ ret += '\n' + gen_endif(obj.ifcond.cgen())
return ret
ret = ''
diff --git a/scripts/qapi/schema.py b/scripts/qapi/schema.py
index 6d55add190..0a187ba3f0 100644
--- a/scripts/qapi/schema.py
+++ b/scripts/qapi/schema.py
@@ -29,6 +29,9 @@ class QAPISchemaIfCond:
def __init__(self, ifcond=None):
self.ifcond = ifcond or []
+ def cgen(self):
+ return ' && '.join([i for i in self.ifcond])
+
# Returns true if the condition is not void
def __bool__(self):
return bool(self.ifcond)
diff --git a/scripts/qapi/types.py b/scripts/qapi/types.py
index 3673cf0f49..db9ff95bd1 100644
--- a/scripts/qapi/types.py
+++ b/scripts/qapi/types.py
@@ -51,13 +51,13 @@ def gen_enum_lookup(name: str,
''',
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 @@ def gen_enum(name: str,
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 @@ def gen_array(name: str, element_type: QAPISchemaType) ->
str:
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 @@ def gen_object(name: str, ifcond: QAPISchemaIfCond,
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;
diff --git a/scripts/qapi/visit.py b/scripts/qapi/visit.py
index 67721b2470..56ea516399 100644
--- a/scripts/qapi/visit.py
+++ b/scripts/qapi/visit.py
@@ -79,7 +79,7 @@ def gen_visit_object_members(name: str,
for memb in members:
deprecated = 'deprecated' in [f.name for f in memb.features]
- ret += gen_if(memb.ifcond.ifcond)
+ ret += gen_if(memb.ifcond.cgen())
if memb.optional:
ret += mcgen('''
if (visit_optional(v, "%(name)s", &obj->has_%(c_name)s)) {
@@ -112,7 +112,7 @@ def gen_visit_object_members(name: str,
ret += mcgen('''
}
''')
- ret += gen_endif(memb.ifcond.ifcond)
+ ret += gen_endif(memb.ifcond.cgen())
if variants:
tag_member = variants.tag_member
@@ -126,7 +126,7 @@ def gen_visit_object_members(name: str,
for var in variants.variants:
case_str = c_enum_const(tag_member.type.name, var.name,
tag_member.type.prefix)
- ret += gen_if(var.ifcond.ifcond)
+ ret += gen_if(var.ifcond.cgen())
if var.type.name == 'q_empty':
# valid variant and nothing to do
ret += mcgen('''
@@ -142,7 +142,7 @@ def gen_visit_object_members(name: str,
case=case_str,
c_type=var.type.c_name(), c_name=c_name(var.name))
- ret += gen_endif(var.ifcond.ifcond)
+ ret += gen_endif(var.ifcond.cgen())
ret += mcgen('''
default:
abort();
@@ -228,7 +228,7 @@ def gen_visit_alternate(name: str, variants:
QAPISchemaVariants) -> str:
c_name=c_name(name))
for var in variants.variants:
- ret += gen_if(var.ifcond.ifcond)
+ ret += gen_if(var.ifcond.cgen())
ret += mcgen('''
case %(case)s:
''',
@@ -254,7 +254,7 @@ def gen_visit_alternate(name: str, variants:
QAPISchemaVariants) -> str:
ret += mcgen('''
break;
''')
- ret += gen_endif(var.ifcond.ifcond)
+ ret += gen_endif(var.ifcond.cgen())
ret += mcgen('''
case QTYPE_NONE:
--
2.29.0
- [PATCH v4 0/9] qapi: untie 'if' conditions from C preprocessor, marcandre . lureau, 2021/05/17
- [PATCH v4 1/9] qapi: replace List[str] by QAPISchemaIfCond, marcandre . lureau, 2021/05/17
- [PATCH v4 2/9] qapi: make gen_if/gen_endif take a simple string,
marcandre . lureau <=
- [PATCH v4 3/9] qapi: start building an 'if' predicate tree, marcandre . lureau, 2021/05/17
- [PATCH v4 4/9] qapi: introduce IfPredicateList and IfAny, marcandre . lureau, 2021/05/17
- [PATCH v4 5/9] qapi: add IfNot, marcandre . lureau, 2021/05/17
- [PATCH v4 6/9] qapi: normalize 'if' condition to IfPredicate tree, marcandre . lureau, 2021/05/17
- [PATCH v4 7/9] qapi: convert 'if' C-expressions to the new syntax tree, marcandre . lureau, 2021/05/17
- [PATCH v4 9/9] docs: update the documentation about schema configuration, marcandre . lureau, 2021/05/17
- [PATCH v4 8/9] qapi: make 'if' condition strings simple identifiers, marcandre . lureau, 2021/05/17