[Qemu-devel] [PATCH v2 27/54] qapi-types: add #if conditions to types

Marc-André Lureau posted 54 patches 8 years, 5 months ago
There is a newer version of this series
[Qemu-devel] [PATCH v2 27/54] qapi-types: add #if conditions to types
Posted by Marc-André Lureau 8 years, 5 months ago
Wrap generated code with #if/#endif using the ifcond_decorator.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 scripts/qapi-types.py | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py
index 05b0eee482..c1316312ac 100644
--- a/scripts/qapi-types.py
+++ b/scripts/qapi-types.py
@@ -175,6 +175,7 @@ class QAPISchemaGenTypeVisitor(QAPISchemaVisitor):
         self.defn = None
         self._fwdecl = None
         self._btin = None
+        self.if_members = ['decl', 'defn', '_fwdecl', '_btin']
 
     def visit_begin(self, schema):
         # gen_object() is recursive, ensure it doesn't visit the empty type
@@ -201,10 +202,12 @@ typedef struct QEnumLookup {
         self.decl = self._btin + self.decl
         self._btin = None
 
-    def _gen_type_cleanup(self, name):
+    @ifcond_decorator
+    def _gen_type_cleanup(self, name, ifcond):
         self.decl += gen_type_cleanup_decl(name)
         self.defn += gen_type_cleanup(name)
 
+    @ifcond_decorator
     def visit_enum_type(self, name, info, values, prefix, ifcond):
         # Special case for our lone builtin enum type
         # TODO use something cleaner than existence of info
@@ -216,6 +219,7 @@ typedef struct QEnumLookup {
             self._fwdecl += gen_enum(name, values, prefix)
             self.defn += gen_enum_lookup(name, values, prefix)
 
+    @ifcond_decorator
     def visit_array_type(self, name, info, element_type, ifcond):
         if isinstance(element_type, QAPISchemaBuiltinType):
             self._btin += gen_fwd_object_or_array(name)
@@ -226,9 +230,10 @@ typedef struct QEnumLookup {
         else:
             self._fwdecl += gen_fwd_object_or_array(name)
             self.decl += gen_array(name, element_type)
-            self._gen_type_cleanup(name)
+            self._gen_type_cleanup(name, ifcond)
 
-    def _gen_object(self, name, info, base, members, variants):
+    @ifcond_decorator
+    def _gen_object(self, name, info, base, members, variants, ifcond):
         self.decl += gen_object(name, base, members, variants)
         if base and not base.is_implicit():
             self.decl += gen_upcast(name, base)
@@ -236,7 +241,7 @@ typedef struct QEnumLookup {
         # directly use rather than repeat type.is_implicit()?
         if not name.startswith('q_'):
             # implicit types won't be directly allocated/freed
-            self._gen_type_cleanup(name)
+            self._gen_type_cleanup(name, ifcond)
 
     def visit_object_type(self, name, info, base, members, variants, ifcond):
         # Nothing to do for the special empty builtin
@@ -244,12 +249,13 @@ typedef struct QEnumLookup {
             return
         self._fwdecl += gen_fwd_object_or_array(name)
         self.decl += gen_variants_objects(variants)
-        self._gen_object(name, info, base, members, variants)
+        self._gen_object(name, info, base, members, variants, ifcond)
 
     def visit_alternate_type(self, name, info, variants, ifcond):
         self._fwdecl += gen_fwd_object_or_array(name)
         self.decl += gen_variants_objects(variants)
-        self._gen_object(name, info, None, [variants.tag_member], variants)
+        self._gen_object(name, info, None, [variants.tag_member],
+                         variants, ifcond)
 
 # If you link code generated from multiple schemata, you want only one
 # instance of the code for built-in types.  Generate it only when
-- 
2.14.1.146.gd35faa819


Re: [Qemu-devel] [PATCH v2 27/54] qapi-types: add #if conditions to types
Posted by Markus Armbruster 8 years, 5 months ago
Marc-André Lureau <marcandre.lureau@redhat.com> writes:

> Wrap generated code with #if/#endif using the ifcond_decorator.
>
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

In my testing, this generates repeated conditionals, e.g.

    diff -rup qapi-gen-24-dc1833e3fb/test-qapi-types.c qapi-gen-27-9600b4638d/test-qapi-types.c
    --- qapi-gen-24-dc1833e3fb/test-qapi-types.c	2017-09-06 12:02:33.440375590 +0200
    +++ qapi-gen-27-9600b4638d/test-qapi-types.c	2017-09-06 12:55:08.709973386 +0200
    @@ -178,6 +178,12 @@ const QEnumLookup QEnumTwo_lookup = {
         .size = QENUM_TWO__MAX
     };

    +#if defined(TEST_IF_ALT) && defined(TEST_IF_STRUCT)
    +
    +
    +#if defined(TEST_IF_ALT) && defined(TEST_IF_STRUCT)
    +
    +
     void qapi_free_TestIfAlternate(TestIfAlternate *obj)
     {
         Visitor *v;
    @@ -191,6 +197,15 @@ void qapi_free_TestIfAlternate(TestIfAlt
         visit_free(v);
     }

    +#endif /* defined(TEST_IF_ALT) && defined(TEST_IF_STRUCT) */
    +
    +
    +#endif /* defined(TEST_IF_ALT) && defined(TEST_IF_STRUCT) */
    +
    +

and

    diff -rup qapi-gen-24-dc1833e3fb/test-qapi-types.h qapi-gen-27-9600b4638d/test-qapi-types.h
    --- qapi-gen-24-dc1833e3fb/test-qapi-types.h	2017-09-06 12:02:27.386461287 +0200
    +++ qapi-gen-27-9600b4638d/test-qapi-types.h	2017-09-06 12:55:02.365062236 +0200
    [...]
    @@ -486,6 +498,9 @@ struct NestedEnumsOne {

     void qapi_free_NestedEnumsOne(NestedEnumsOne *obj);

    +#if defined(TEST_IF_ALT) && defined(TEST_IF_STRUCT)
    +
    +
     struct TestIfAlternate {
         QType type;
         union { /* union tag is @type */
    @@ -494,18 +509,42 @@ struct TestIfAlternate {
         } u;
     };

    +#if defined(TEST_IF_ALT) && defined(TEST_IF_STRUCT)
    +
    +
     void qapi_free_TestIfAlternate(TestIfAlternate *obj);

    +#endif /* defined(TEST_IF_ALT) && defined(TEST_IF_STRUCT) */
    +
    +
    +#endif /* defined(TEST_IF_ALT) && defined(TEST_IF_STRUCT) */
    +
    +

Let's ignore this until we've made up our mind *how* to best generate
conditionals.

Re: [Qemu-devel] [PATCH v2 27/54] qapi-types: add #if conditions to types
Posted by Marc-André Lureau 8 years, 5 months ago
Hi

On Wed, Sep 6, 2017 at 1:43 PM, Markus Armbruster <armbru@redhat.com> wrote:
> Marc-André Lureau <marcandre.lureau@redhat.com> writes:
>
>> Wrap generated code with #if/#endif using the ifcond_decorator.
>>
>> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
>
> In my testing, this generates repeated conditionals, e.g.
>
>     diff -rup qapi-gen-24-dc1833e3fb/test-qapi-types.c qapi-gen-27-9600b4638d/test-qapi-types.c
>     --- qapi-gen-24-dc1833e3fb/test-qapi-types.c        2017-09-06 12:02:33.440375590 +0200
>     +++ qapi-gen-27-9600b4638d/test-qapi-types.c        2017-09-06 12:55:08.709973386 +0200
>     @@ -178,6 +178,12 @@ const QEnumLookup QEnumTwo_lookup = {
>          .size = QENUM_TWO__MAX
>      };
>
>     +#if defined(TEST_IF_ALT) && defined(TEST_IF_STRUCT)
>     +
>     +
>     +#if defined(TEST_IF_ALT) && defined(TEST_IF_STRUCT)
>     +
>     +
>      void qapi_free_TestIfAlternate(TestIfAlternate *obj)
>      {
>          Visitor *v;
>     @@ -191,6 +197,15 @@ void qapi_free_TestIfAlternate(TestIfAlt
>          visit_free(v);
>      }
>
>     +#endif /* defined(TEST_IF_ALT) && defined(TEST_IF_STRUCT) */
>     +
>     +
>     +#endif /* defined(TEST_IF_ALT) && defined(TEST_IF_STRUCT) */
>     +
>     +
>
> and
>
>     diff -rup qapi-gen-24-dc1833e3fb/test-qapi-types.h qapi-gen-27-9600b4638d/test-qapi-types.h
>     --- qapi-gen-24-dc1833e3fb/test-qapi-types.h        2017-09-06 12:02:27.386461287 +0200
>     +++ qapi-gen-27-9600b4638d/test-qapi-types.h        2017-09-06 12:55:02.365062236 +0200
>     [...]
>     @@ -486,6 +498,9 @@ struct NestedEnumsOne {
>
>      void qapi_free_NestedEnumsOne(NestedEnumsOne *obj);
>
>     +#if defined(TEST_IF_ALT) && defined(TEST_IF_STRUCT)
>     +
>     +
>      struct TestIfAlternate {
>          QType type;
>          union { /* union tag is @type */
>     @@ -494,18 +509,42 @@ struct TestIfAlternate {
>          } u;
>      };
>
>     +#if defined(TEST_IF_ALT) && defined(TEST_IF_STRUCT)
>     +
>     +
>      void qapi_free_TestIfAlternate(TestIfAlternate *obj);
>
>     +#endif /* defined(TEST_IF_ALT) && defined(TEST_IF_STRUCT) */
>     +
>     +
>     +#endif /* defined(TEST_IF_ALT) && defined(TEST_IF_STRUCT) */
>     +
>     +
>
> Let's ignore this until we've made up our mind *how* to best generate
> conditionals.
>

Fixed, that was being extra cautious :)



-- 
Marc-André Lureau