All of lore.kernel.org
 help / color / mirror / Atom feed
From: Markus Armbruster <armbru@redhat.com>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [PULL v2 05/12] qapi-visit: Expose visit_type_FOO_members()
Date: Sat,  5 Mar 2016 10:50:34 +0100	[thread overview]
Message-ID: <1457171441-24602-6-git-send-email-armbru@redhat.com> (raw)
In-Reply-To: <1457171441-24602-1-git-send-email-armbru@redhat.com>

From: Eric Blake <eblake@redhat.com>

Dan Berrange reported a case where he needs to work with a
QCryptoBlockOptions union type using the OptsVisitor, but only
visit one of the branches of that type (the discriminator is not
visited directly, but learned externally).  When things were
boxed, it was easy: just visit the variant directly, which took
care of both allocating the variant and visiting its members, then
store that pointer in the union type.  But now that things are
unboxed, we need a way to visit the members without allocation,
done by exposing visit_type_FOO_members() to the user.

Before the patch, we had quite a bit of code associated with
object_members_seen to make sure that a declaration of the helper
was in scope before any use of the function.  But now that the
helper is public and declared in the header, the .c file no
longer needs to worry about topological sorting (the helper is
always in scope), which leads to some nice cleanups.

Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1457021813-10704-4-git-send-email-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 scripts/qapi-visit.py | 33 +++++++--------------------------
 1 file changed, 7 insertions(+), 26 deletions(-)

diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py
index 1e52f76..a712e9a 100644
--- a/scripts/qapi-visit.py
+++ b/scripts/qapi-visit.py
@@ -15,10 +15,6 @@
 from qapi import *
 import re
 
-# visit_type_FOO_members() is always emitted; track if a forward declaration
-# or implementation has already been output.
-object_members_seen = set()
-
 
 def gen_visit_decl(name, scalar=False):
     c_type = c_name(name) + ' *'
@@ -30,37 +26,23 @@ void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_type)sobj, Error **
                  c_name=c_name(name), c_type=c_type)
 
 
-def gen_visit_members_decl(typ):
-    if typ.name in object_members_seen:
-        return ''
-    object_members_seen.add(typ.name)
+def gen_visit_members_decl(name):
     return mcgen('''
 
-static void visit_type_%(c_type)s_members(Visitor *v, %(c_type)s *obj, Error **errp);
+void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp);
 ''',
-                 c_type=typ.c_name())
+                 c_name=c_name(name))
 
 
 def gen_visit_object_members(name, base, members, variants):
-    ret = ''
+    ret = mcgen('''
 
-    if base:
-        ret += gen_visit_members_decl(base)
-    if variants:
-        for var in variants.variants:
-            # Ugly special case for simple union TODO get rid of it
-            if not var.simple_union_type():
-                ret += gen_visit_members_decl(var.type)
-
-    object_members_seen.add(name)
-    ret += mcgen('''
-
-static void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
+void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **errp)
 {
     Error *err = NULL;
 
 ''',
-                 c_name=c_name(name))
+                c_name=c_name(name))
 
     if base:
         ret += mcgen('''
@@ -173,8 +155,6 @@ def gen_visit_alternate(name, variants):
     for var in variants.variants:
         if var.type.alternate_qtype() == 'QTYPE_QINT':
             promote_int = 'false'
-        if isinstance(var.type, QAPISchemaObjectType):
-            ret += gen_visit_members_decl(var.type)
 
     ret += mcgen('''
 
@@ -316,6 +296,7 @@ class QAPISchemaGenVisitVisitor(QAPISchemaVisitor):
             self.defn += defn
 
     def visit_object_type(self, name, info, base, members, variants):
+        self.decl += gen_visit_members_decl(name)
         self.decl += gen_visit_decl(name)
         self.defn += gen_visit_object(name, base, members, variants)
 
-- 
2.4.3

  parent reply	other threads:[~2016-03-05  9:50 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-05  9:50 [Qemu-devel] [PULL v2 00/12] QAPI patches for 2016-03-04 Markus Armbruster
2016-03-05  9:50 ` [Qemu-devel] [PULL v2 01/12] qmp-shell: fix pretty printing of JSON responses Markus Armbruster
2016-03-05  9:50 ` [Qemu-devel] [PULL v2 02/12] qapi-dealloc: Reduce use outside of generated code Markus Armbruster
2016-03-05  9:50 ` [Qemu-devel] [PULL v2 03/12] qapi: Rename 'fields' to 'members' in generator Markus Armbruster
2016-03-05  9:50 ` [Qemu-devel] [PULL v2 04/12] qapi: Rename 'fields' to 'members' in generated C code Markus Armbruster
2016-03-05  9:50 ` Markus Armbruster [this message]
2016-03-05  9:50 ` [Qemu-devel] [PULL v2 06/12] qapi: Update docs to match recent generator changes Markus Armbruster
2016-03-05  9:50 ` [Qemu-devel] [PULL v2 07/12] chardev: Shorten references into ChardevBackend Markus Armbruster
2016-03-05  9:50 ` [Qemu-devel] [PULL v2 08/12] util: Shorten references into SocketAddress Markus Armbruster
2016-03-05  9:50 ` [Qemu-devel] [PULL v2 09/12] ui: Shorten references into InputEvent Markus Armbruster
2016-03-05  9:50 ` [Qemu-devel] [PULL v2 10/12] qapi: Avoid use of 'data' member of QAPI unions Markus Armbruster
2016-03-05  9:50 ` [Qemu-devel] [PULL v2 11/12] chardev: Drop useless ChardevDummy type Markus Armbruster
2016-03-05  9:50 ` [Qemu-devel] [PULL v2 12/12] qapi: Drop useless 'data' member of unions Markus Armbruster
2016-03-06 12:41 ` [Qemu-devel] [PULL v2 00/12] QAPI patches for 2016-03-04 Peter Maydell

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=1457171441-24602-6-git-send-email-armbru@redhat.com \
    --to=armbru@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.