From: marcandre.lureau@redhat.com
To: qemu-devel@nongnu.org
Cc: "Eric Blake" <eblake@redhat.com>,
jsnow@redhat.com, "Markus Armbruster" <armbru@redhat.com>,
"Marc-André Lureau" <marcandre.lureau@redhat.com>
Subject: [PATCH v5 3/9] qapi: make gen_if/gen_endif take a simple string
Date: Tue, 8 Jun 2021 16:07:17 +0400 [thread overview]
Message-ID: <20210608120723.2268181-4-marcandre.lureau@redhat.com> (raw)
In-Reply-To: <20210608120723.2268181-1-marcandre.lureau@redhat.com>
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 | 24 +++++++++++-------------
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, 34 insertions(+), 33 deletions(-)
diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py
index 6ad1eeb61d..c305aaf2f1 100644
--- a/scripts/qapi/common.py
+++ b/scripts/qapi/common.py
@@ -12,7 +12,7 @@
# See the COPYING file in the top-level directory.
import re
-from typing import Match, Optional, Sequence
+from typing import Match, Optional
#: Magic string that gets removed along with all space to its right.
@@ -194,22 +194,20 @@ 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)
def must_match(pattern: str, string: str) -> Match[str]:
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 bc357ebbfa..aa4715c519 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(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
next prev parent reply other threads:[~2021-06-08 12:09 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-08 12:07 [PATCH v5 0/9] qapi: untie 'if' conditions from C preprocessor marcandre.lureau
2021-06-08 12:07 ` [PATCH v5 1/9] docs: update the documentation about schema configuration marcandre.lureau
2021-06-15 11:48 ` Markus Armbruster
2021-06-18 10:32 ` Marc-André Lureau
2021-06-08 12:07 ` [PATCH v5 2/9] qapi: replace List[str] by QAPISchemaIfCond marcandre.lureau
2021-06-14 12:20 ` Markus Armbruster
2021-06-16 10:28 ` Marc-André Lureau
2021-06-18 9:35 ` Markus Armbruster
2021-06-08 12:07 ` marcandre.lureau [this message]
2021-06-14 12:45 ` [PATCH v5 3/9] qapi: make gen_if/gen_endif take a simple string Markus Armbruster
2021-06-14 14:14 ` Markus Armbruster
2021-06-16 10:44 ` Marc-André Lureau
2021-06-18 9:41 ` Markus Armbruster
2021-06-08 12:07 ` [PATCH v5 4/9] qapi: start building an 'if' predicate tree marcandre.lureau
2021-06-14 14:38 ` Markus Armbruster
2021-06-18 10:31 ` Marc-André Lureau
2021-06-08 12:07 ` [PATCH v5 5/9] qapi: introduce IfPredicateList and IfAny marcandre.lureau
2021-06-08 12:07 ` [PATCH v5 6/9] qapi: add IfNot marcandre.lureau
2021-06-08 12:07 ` [PATCH v5 7/9] qapi: normalize 'if' condition to IfPredicate tree marcandre.lureau
2021-06-15 11:34 ` Markus Armbruster
2021-06-18 10:36 ` Marc-André Lureau
2021-06-08 12:07 ` [PATCH v5 8/9] qapi: convert 'if' C-expressions to the new syntax tree marcandre.lureau
2021-06-08 12:07 ` [PATCH v5 9/9] qapi: make 'if' condition strings simple identifiers marcandre.lureau
2021-06-18 9:36 ` Markus Armbruster
2021-06-15 11:56 ` [PATCH v5 0/9] qapi: untie 'if' conditions from C preprocessor Markus Armbruster
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210608120723.2268181-4-marcandre.lureau@redhat.com \
--to=marcandre.lureau@redhat.com \
--cc=armbru@redhat.com \
--cc=eblake@redhat.com \
--cc=jsnow@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.