All of lore.kernel.org
 help / color / mirror / Atom feed
From: Markus Armbruster <armbru@redhat.com>
To: qemu-devel@nongnu.org
Cc: mdroth@linux.vnet.ibm.com, marcandre.lureau@redhat.com,
	eblake@redhat.com
Subject: [Qemu-devel] [RFC PATCH 17/32] qapi: Fix simple union lowering with multiple schemas
Date: Mon,  2 Oct 2017 17:25:37 +0200	[thread overview]
Message-ID: <20171002152552.27999-18-armbru@redhat.com> (raw)
In-Reply-To: <20171002152552.27999-1-armbru@redhat.com>

If more than one schema uses the same built-in type T for a simple
union member, they all generate the same q_obj_T_wrapper into their
qapi-types.h.  They clash when you include more than one schema's
qapi-types.h.

Fix by generating them into builtin-qapi-types.h instead.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 scripts/qapi-types.py                   | 12 ++++++++----
 scripts/qapi.py                         |  2 ++
 tests/qapi-schema/builtins.out          | 30 ++++++++++++++++++++++++++++++
 tests/qapi-schema/qapi-schema-test.json |  3 +--
 tests/qapi-schema/qapi-schema-test.out  |  5 ++---
 5 files changed, 43 insertions(+), 9 deletions(-)

diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py
index 18fd2a98c0..c058540e4d 100644
--- a/scripts/qapi-types.py
+++ b/scripts/qapi-types.py
@@ -53,7 +53,10 @@ def gen_struct_members(members):
     return ret
 
 
-def gen_object(name, base, members, variants):
+def gen_object(name, info, base, members, variants):
+    # TODO use something cleaner than existence of info
+    if not info and args.schema:
+        return ''               # suppress built-in
     if name in objects_seen:
         return ''
     objects_seen.add(name)
@@ -62,7 +65,7 @@ def gen_object(name, base, members, variants):
     if variants:
         for v in variants.variants:
             if isinstance(v.type, QAPISchemaObjectType):
-                ret += gen_object(v.type.name, v.type.base,
+                ret += gen_object(v.type.name, v.type.info, v.type.base,
                                   v.type.local_members, v.type.variants)
 
     ret += mcgen('''
@@ -200,7 +203,7 @@ class QAPISchemaGenTypeVisitor(QAPISchemaVisitor):
         if name == 'q_empty':
             return
         self._fwdecl += gen_fwd_object_or_array(name)
-        self.decl += gen_object(name, base, members, variants)
+        self.decl += gen_object(name, info, base, members, variants)
         if base and not base.is_implicit():
             self.decl += gen_upcast(name, base)
         # TODO Worth changing the visitor signature, so we could
@@ -211,7 +214,8 @@ class QAPISchemaGenTypeVisitor(QAPISchemaVisitor):
 
     def visit_alternate_type(self, name, info, variants):
         self._fwdecl += gen_fwd_object_or_array(name)
-        self.decl += gen_object(name, None, [variants.tag_member], variants)
+        self.decl += gen_object(name, info, None,
+                                [variants.tag_member], variants)
         self._gen_type_cleanup(name)
 
 argparser = common_argument_parser(builtins=True)
diff --git a/scripts/qapi.py b/scripts/qapi.py
index 4871eb7740..477402b7f8 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -1499,6 +1499,8 @@ class QAPISchema(object):
         # would be to use lazy instantiation, while figuring out how to
         # avoid compilation issues with multiple qapi-types.h.
         self._make_array_type(name, None)
+        # TODO same for wrapper types
+        self._make_implicit_wrapper_type(name, None)
 
     def _def_predefineds(self):
         for t in [('str',    'string',  'char' + pointer_suffix),
diff --git a/tests/qapi-schema/builtins.out b/tests/qapi-schema/builtins.out
index 40b886ddae..d289bfe919 100644
--- a/tests/qapi-schema/builtins.out
+++ b/tests/qapi-schema/builtins.out
@@ -1,3 +1,33 @@
 enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
     prefix QTYPE
 object q_empty
+object q_obj_any-wrapper
+    member data: any optional=False
+object q_obj_bool-wrapper
+    member data: bool optional=False
+object q_obj_int-wrapper
+    member data: int optional=False
+object q_obj_int16-wrapper
+    member data: int16 optional=False
+object q_obj_int32-wrapper
+    member data: int32 optional=False
+object q_obj_int64-wrapper
+    member data: int64 optional=False
+object q_obj_int8-wrapper
+    member data: int8 optional=False
+object q_obj_null-wrapper
+    member data: null optional=False
+object q_obj_number-wrapper
+    member data: number optional=False
+object q_obj_size-wrapper
+    member data: size optional=False
+object q_obj_str-wrapper
+    member data: str optional=False
+object q_obj_uint16-wrapper
+    member data: uint16 optional=False
+object q_obj_uint32-wrapper
+    member data: uint32 optional=False
+object q_obj_uint64-wrapper
+    member data: uint64 optional=False
+object q_obj_uint8-wrapper
+    member data: uint8 optional=False
diff --git a/tests/qapi-schema/qapi-schema-test.json b/tests/qapi-schema/qapi-schema-test.json
index c091626635..ac8aefc924 100644
--- a/tests/qapi-schema/qapi-schema-test.json
+++ b/tests/qapi-schema/qapi-schema-test.json
@@ -84,8 +84,7 @@
 
 { 'union': 'UserDefSimpleUnion',
   'data': { 'value1': 'UserDefA',
-# FIXME generated q_obj_int_wrapper clashes with qapi-schema.json's
-#           'value2': 'int',
+            'value2': 'int',
             'value3': 'UserDefB' } }
 
 # this variant of UserDefFlatUnion defaults to a union that uses members with
diff --git a/tests/qapi-schema/qapi-schema-test.out b/tests/qapi-schema/qapi-schema-test.out
index 97bb02f2fd..fff25e26d0 100644
--- a/tests/qapi-schema/qapi-schema-test.out
+++ b/tests/qapi-schema/qapi-schema-test.out
@@ -112,8 +112,9 @@ object UserDefSimpleUnion
     member type: UserDefSimpleUnionKind optional=False
     tag type
     case value1: q_obj_UserDefA-wrapper
+    case value2: q_obj_int-wrapper
     case value3: q_obj_UserDefB-wrapper
-enum UserDefSimpleUnionKind ['value1', 'value3']
+enum UserDefSimpleUnionKind ['value1', 'value2', 'value3']
 object UserDefTwo
     member string0: str optional=False
     member dict1: UserDefTwoDict optional=False
@@ -211,8 +212,6 @@ object q_obj_numberList-wrapper
     member data: numberList optional=False
 object q_obj_sizeList-wrapper
     member data: sizeList optional=False
-object q_obj_str-wrapper
-    member data: str optional=False
 object q_obj_strList-wrapper
     member data: strList optional=False
 object q_obj_uint16List-wrapper
-- 
2.13.6

  parent reply	other threads:[~2017-10-02 15:26 UTC|newest]

Thread overview: 61+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-02 15:25 [Qemu-devel] [RFC PATCH 00/32] Command line QAPIfication Markus Armbruster
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 01/32] tests/qapi-schema: Improve coverage of '@' Markus Armbruster
2017-10-04 10:37   ` Marc-André Lureau
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 02/32] texi2pod: Support @verbatim environment Markus Armbruster
2017-10-05 14:58   ` Eric Blake
2017-10-06  5:24     ` Markus Armbruster
2017-10-06 13:40       ` Eric Blake
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 03/32] qapi2texi: Fix for examples containing '@' Markus Armbruster
2017-10-04 10:45   ` Marc-André Lureau
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 04/32] qapi2texi: Fix for '@' not followed by \w character Markus Armbruster
2017-10-04 10:47   ` Marc-André Lureau
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 05/32] qapi2texi: Provide access to Texinfo markup Markus Armbruster
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 06/32] qapi2texi: Drop | example markup Markus Armbruster
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 07/32] qapi: Drop superfluous allow_optional=True Markus Armbruster
2017-10-04 10:52   ` Marc-André Lureau
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 08/32] qapi: Simplify check_name() parameters Markus Armbruster
2017-10-04 10:54   ` Marc-André Lureau
2017-10-04 10:54   ` Marc-André Lureau
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 09/32] qapi: check_type() parameter allow_optional is now unused, drop Markus Armbruster
2017-10-04 10:55   ` Marc-André Lureau
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 10/32] qapi: Don't run generators twice Markus Armbruster
2017-10-04 11:04   ` Marc-André Lureau
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 11/32] qapi: Drop the options to generate only .c or .h Markus Armbruster
2017-10-04 11:07   ` Marc-André Lureau
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 12/32] qapi: Use argparse to parse command line arguments Markus Armbruster
2017-10-04 11:13   ` Marc-André Lureau
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 13/32] qapi: Use argparse to open schema file Markus Armbruster
2017-10-04 11:18   ` Marc-André Lureau
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 14/32] qapi: Rework generated code for built-in types Markus Armbruster
2017-10-04 11:52   ` Marc-André Lureau
2017-10-05  4:24     ` Markus Armbruster
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 15/32] tests/qapi-schema: Improve simple union coverage Markus Armbruster
2017-10-04 12:02   ` Marc-André Lureau
2017-10-05  4:29     ` Markus Armbruster
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 16/32] qapi: Factor out _make_implicit_wrapper_type() Markus Armbruster
2017-10-04 12:00   ` Marc-André Lureau
2017-10-02 15:25 ` Markus Armbruster [this message]
2017-10-04 12:04   ` [Qemu-devel] [RFC PATCH 17/32] qapi: Fix simple union lowering with multiple schemas Marc-André Lureau
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 18/32] docs/devel/qapi-code-gen.txt: Rewrite section on schema syntax Markus Armbruster
2017-10-04 11:59   ` Marc-André Lureau
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 19/32] qapi: Accept double-quoted strings Markus Armbruster
2017-10-04 11:58   ` Marc-André Lureau
2017-10-05  4:41     ` Markus Armbruster
2017-10-05 14:13       ` Marc-André Lureau
2017-10-06  5:29         ` Markus Armbruster
2017-10-05 15:16       ` Eric Blake
2017-10-06  5:27         ` Markus Armbruster
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 20/32] qapi: Frontend for defining command line options Markus Armbruster
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 21/32] qapi: Define QAPIOptionKind and QAPIOption automatically Markus Armbruster
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 22/32] qapi: New helper c_string() Markus Armbruster
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 23/32] qapi-options: Command line option backend Markus Armbruster
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 24/32] qapi-options: Generate help string Markus Armbruster
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 25/32] qapi-introspect: Include command line options information Markus Armbruster
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 26/32] qapi2texi: " Markus Armbruster
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 27/32] os-posix: Drop misleading comment Markus Armbruster
2017-10-04 12:10   ` Marc-André Lureau
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 28/32] vl: QAPIfy command line option definition Markus Armbruster
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 29/32] qapi/options: QAPIfy --echr argument type Markus Armbruster
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 30/32] qapi/options: QAPIfy --watchdog-action " Markus Armbruster
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 31/32] qapi/options: QAPIfy --blockdev " Markus Armbruster
2017-10-02 15:25 ` [Qemu-devel] [RFC PATCH 32/32] qapi/options: QAPIfy --add-fd " 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=20171002152552.27999-18-armbru@redhat.com \
    --to=armbru@redhat.com \
    --cc=eblake@redhat.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=mdroth@linux.vnet.ibm.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.