[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH for-4.0 v7 21/27] qapi: add #if conditions to ge
From: |
Markus Armbruster |
Subject: |
Re: [Qemu-devel] [PATCH for-4.0 v7 21/27] qapi: add #if conditions to generated code members |
Date: |
Tue, 11 Dec 2018 14:17:28 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) |
Marc-André Lureau <address@hidden> writes:
> Wrap generated enum/struct members and code with #if/#endif, using the
> .ifcond members added in the previous patches.
>
> Some types generate both enum and struct members for example, so a
> step-by-step is unnecessarily complicated to deal with (it would
> easily generate invalid intermediary code).
>
> Signed-off-by: Marc-André Lureau <address@hidden>
We've since agreed to tweak the commit message:
qapi: Add #if conditions to generated code members
Wrap generated enum and struct members and their supporting code with
#if/#endif, using the .ifcond members added in the previous patches.
We do enum and struct in a single patch because union tag enum and the
associated variants tie them together, and dealing with that to split
the patch doesn't seem worthwhile.
> ---
> scripts/qapi/common.py | 4 ++++
> scripts/qapi/introspect.py | 13 +++++++++----
> scripts/qapi/types.py | 4 ++++
> scripts/qapi/visit.py | 6 ++++++
> 4 files changed, 23 insertions(+), 4 deletions(-)
>
> diff --git a/scripts/qapi/common.py b/scripts/qapi/common.py
> index a70d6dec3b..3a29812ef2 100644
> --- a/scripts/qapi/common.py
> +++ b/scripts/qapi/common.py
> @@ -2108,11 +2108,13 @@ const QEnumLookup %(c_name)s_lookup = {
> ''',
> c_name=c_name(name))
> for m in members:
> + ret += gen_if(m.ifcond)
> index = c_enum_const(name, m.name, prefix)
> ret += mcgen('''
> [%(index)s] = "%(name)s",
> ''',
> index=index, name=m.name)
> + ret += gen_endif(m.ifcond)
>
> ret += mcgen('''
> },
> @@ -2134,10 +2136,12 @@ typedef enum %(c_name)s {
> c_name=c_name(name))
>
> for m in enum_members:
> + ret += gen_if(m.ifcond)
> ret += mcgen('''
> %(c_enum)s,
> ''',
> c_enum=c_enum_const(name, m.name, prefix))
> + ret += gen_endif(m.ifcond)
>
> ret += mcgen('''
> } %(c_name)s;
> diff --git a/scripts/qapi/introspect.py b/scripts/qapi/introspect.py
> index 417625d54b..77087f629b 100644
> --- a/scripts/qapi/introspect.py
> +++ b/scripts/qapi/introspect.py
> @@ -162,6 +162,8 @@ const QLitObject %(c_name)s = %(c_string)s;
> ret = {'name': member.name, 'type': self._use_type(member.type)}
> if member.optional:
> ret['default'] = None
> + if member.ifcond:
> + ret = (ret, {'if': member.ifcond})
> return ret
>
> def _gen_variants(self, tag_name, variants):
> @@ -169,14 +171,16 @@ const QLitObject %(c_name)s = %(c_string)s;
> 'variants': [self._gen_variant(v) for v in variants]}
>
> def _gen_variant(self, variant):
> - return {'case': variant.name, 'type': self._use_type(variant.type)}
> + return ({'case': variant.name, 'type': self._use_type(variant.type)},
> + {'if': variant.ifcond})
>
> def visit_builtin_type(self, name, info, json_type):
> self._gen_qlit(name, 'builtin', {'json-type': json_type}, [])
>
> def visit_enum_type(self, name, info, ifcond, members, prefix):
> self._gen_qlit(name, 'enum',
> - {'values': [m.name for m in members]}, ifcond)
> + {'values': [(m.name, {'if': m.ifcond}) for m in
> members]},
> + ifcond)
>
> def visit_array_type(self, name, info, ifcond, element_type):
> element = self._use_type(element_type)
> @@ -192,8 +196,9 @@ const QLitObject %(c_name)s = %(c_string)s;
>
> def visit_alternate_type(self, name, info, ifcond, variants):
> self._gen_qlit(name, 'alternate',
> - {'members': [{'type': self._use_type(m.type)}
> - for m in variants.variants]}, ifcond)
> + {'members': [
> + ({'type': self._use_type(m.type)}, {'if':
> m.ifcond})
Long line. I'll feed the series to pycodestyle and pylint.
> + for m in variants.variants]}, ifcond)
>
> def visit_command(self, name, info, ifcond, arg_type, ret_type, gen,
> success_response, boxed, allow_oob, allow_preconfig):
> diff --git a/scripts/qapi/types.py b/scripts/qapi/types.py
> index 0404710bbd..e2ee9f3b72 100644
> --- a/scripts/qapi/types.py
> +++ b/scripts/qapi/types.py
> @@ -43,6 +43,7 @@ struct %(c_name)s {
> def gen_struct_members(members):
> ret = ''
> for memb in members:
> + ret += gen_if(memb.ifcond)
> if memb.optional:
> ret += mcgen('''
> bool has_%(c_name)s;
> @@ -52,6 +53,7 @@ def gen_struct_members(members):
> %(c_type)s %(c_name)s;
> ''',
> c_type=memb.type.c_type(), c_name=c_name(memb.name))
> + ret += gen_endif(memb.ifcond)
> return ret
>
>
> @@ -131,11 +133,13 @@ def gen_variants(variants):
> for var in variants.variants:
> if var.type.name == 'q_empty':
> continue
> + ret += gen_if(var.ifcond)
> 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)
>
> ret += mcgen('''
> } u;
> diff --git a/scripts/qapi/visit.py b/scripts/qapi/visit.py
> index 24f85a2e85..82eab72b21 100644
> --- a/scripts/qapi/visit.py
> +++ b/scripts/qapi/visit.py
> @@ -54,6 +54,7 @@ void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s
> *obj, Error **errp)
> c_type=base.c_name())
>
> for memb in members:
> + ret += gen_if(memb.ifcond)
> if memb.optional:
> ret += mcgen('''
> if (visit_optional(v, "%(name)s", &obj->has_%(c_name)s)) {
> @@ -73,6 +74,7 @@ void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s
> *obj, Error **errp)
> ret += mcgen('''
> }
> ''')
> + ret += gen_endif(memb.ifcond)
>
> if variants:
> ret += mcgen('''
> @@ -84,6 +86,7 @@ void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s
> *obj, Error **errp)
> case_str = c_enum_const(variants.tag_member.type.name,
> var.name,
> variants.tag_member.type.prefix)
> + ret += gen_if(var.ifcond)
> if var.type.name == 'q_empty':
> # valid variant and nothing to do
> ret += mcgen('''
> @@ -100,6 +103,7 @@ void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s
> *obj, Error **errp)
> case=case_str,
> c_type=var.type.c_name(),
> c_name=c_name(var.name))
>
> + ret += gen_endif(var.ifcond)
> ret += mcgen('''
> default:
> abort();
> @@ -190,6 +194,7 @@ void visit_type_%(c_name)s(Visitor *v, const char *name,
> %(c_name)s **obj, Error
> c_name=c_name(name))
>
> for var in variants.variants:
> + ret += gen_if(var.ifcond)
> ret += mcgen('''
> case %(case)s:
> ''',
> @@ -217,6 +222,7 @@ void visit_type_%(c_name)s(Visitor *v, const char *name,
> %(c_name)s **obj, Error
> ret += mcgen('''
> break;
> ''')
> + ret += gen_endif(var.ifcond)
>
> ret += mcgen('''
> case QTYPE_NONE:
With the tweaked commit message:
Reviewed-by: Markus Armbruster <address@hidden>
- Re: [Qemu-devel] [PATCH for-4.0 v7 17/27] qapi: simplify make_enum_members(), (continued)
- [Qemu-devel] [PATCH for-4.0 v7 18/27] tests/qapi: add command with condition on union argument, Marc-André Lureau, 2018/12/08
- [Qemu-devel] [PATCH for-4.0 v7 19/27] qapi: add 'if' to alternate members, Marc-André Lureau, 2018/12/08
- [Qemu-devel] [PATCH for-4.0 v7 20/27] tests/qapi: add command with condition on alternate argument, Marc-André Lureau, 2018/12/08
- [Qemu-devel] [PATCH for-4.0 v7 21/27] qapi: add #if conditions to generated code members, Marc-André Lureau, 2018/12/08
- Re: [Qemu-devel] [PATCH for-4.0 v7 21/27] qapi: add #if conditions to generated code members,
Markus Armbruster <=
- [Qemu-devel] [PATCH for-4.0 v7 22/27] qapi: add 'If:' condition to enum values documentation, Marc-André Lureau, 2018/12/08
- [Qemu-devel] [PATCH for-4.0 v7 23/27] qapi: add 'If:' condition to struct members documentation, Marc-André Lureau, 2018/12/08
- [Qemu-devel] [PATCH for-4.0 v7 24/27] qapi: add condition to variants documentation, Marc-André Lureau, 2018/12/08
- [Qemu-devel] [PATCH for-4.0 v7 25/27] qapi: break long lines at 'data' member, Marc-André Lureau, 2018/12/08
- [Qemu-devel] [PATCH for-4.0 v7 26/27] qapi: add more conditions to SPICE, Marc-André Lureau, 2018/12/08