Message ID | 20181208111606.8505-22-marcandre.lureau@redhat.com |
---|---|
State | New |
Headers | show |
Series | Hi, | expand |
Marc-André Lureau <marcandre.lureau@redhat.com> 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 <marcandre.lureau@redhat.com> 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 <armbru@redhat.com>
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}) + 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:
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 <marcandre.lureau@redhat.com> --- 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(-)