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 07/15] qapi-event: Utilize implicit struct visits
Date: Fri, 18 Mar 2016 11:04:21 +0100	[thread overview]
Message-ID: <1458295469-22215-8-git-send-email-armbru@redhat.com> (raw)
In-Reply-To: <1458295469-22215-1-git-send-email-armbru@redhat.com>

From: Eric Blake <eblake@redhat.com>

Rather than generate inline per-member visits, take advantage
of the 'visit_type_FOO_members()' function for emitting events.
This is possible now that implicit structs can be visited like
any other.  Generated code shrinks accordingly; by initializing
a struct based on parameters, through a new gen_param_var()
helper, like:

|@@ -338,6 +250,9 @@ void qapi_event_send_block_job_error(con
|     QMPEventFuncEmit emit = qmp_event_get_func_emit();
|     QmpOutputVisitor *qov;
|     Visitor *v;
|+    q_obj_BLOCK_JOB_ERROR_arg param = {
|+        (char *)device, operation, action
|+    };
|
|     if (!emit) {
|         return;
@@ -351,19 +266,7 @@ void qapi_event_send_block_job_error(con
|     if (err) {
|         goto out;
|     }
|-    visit_type_str(v, "device", (char **)&device, &err);
|-    if (err) {
|-        goto out_obj;
|-    }
|-    visit_type_IoOperationType(v, "operation", &operation, &err);
|-    if (err) {
|-        goto out_obj;
|-    }
|-    visit_type_BlockErrorAction(v, "action", &action, &err);
|-    if (err) {
|-        goto out_obj;
|-    }
|-out_obj:
|+    visit_type_q_obj_BLOCK_JOB_ERROR_arg_members(v, &param, &err);
|     visit_end_struct(v, err ? NULL : &err);

Notice that the initialization of 'param' has to cast away const
(just as the old gen_visit_members() had to do): we can't change
the signature of the user function (which uses 'const char *'), but
have to assign it to a non-const QAPI object (which requires
'char *').

While touching this, document with a FIXME comment that there is
still a potential collision between QMP members and our choice of
local variable names within qapi_event_send_FOO().

This patch also paves the way for some followup simplifications
in the generator, in subsequent patches.

Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1458254921-17042-8-git-send-email-eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 scripts/qapi-event.py | 48 ++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 38 insertions(+), 10 deletions(-)

diff --git a/scripts/qapi-event.py b/scripts/qapi-event.py
index 27af206..9b5c5b5 100644
--- a/scripts/qapi-event.py
+++ b/scripts/qapi-event.py
@@ -28,7 +28,37 @@ def gen_event_send_decl(name, arg_type):
                  proto=gen_event_send_proto(name, arg_type))
 
 
+# Declare and initialize an object 'qapi' using parameters from gen_params()
+def gen_param_var(typ):
+    assert not typ.variants
+    ret = mcgen('''
+    %(c_name)s param = {
+''',
+                c_name=typ.c_name())
+    sep = '        '
+    for memb in typ.members:
+        ret += sep
+        sep = ', '
+        if memb.optional:
+            ret += 'has_' + c_name(memb.name) + sep
+        if memb.type.name == 'str':
+            # Cast away const added in gen_params()
+            ret += '(char *)'
+        ret += c_name(memb.name)
+    ret += mcgen('''
+
+    };
+''')
+    return ret
+
+
 def gen_event_send(name, arg_type):
+    # FIXME: Our declaration of local variables (and of 'errp' in the
+    # parameter list) can collide with exploded members of the event's
+    # data type passed in as parameters.  If this collision ever hits in
+    # practice, we can rename our local variables with a leading _ prefix,
+    # or split the code into a wrapper function that creates a boxed
+    # 'param' object then calls another to do the real work.
     ret = mcgen('''
 
 %(proto)s
@@ -43,10 +73,11 @@ def gen_event_send(name, arg_type):
         ret += mcgen('''
     QmpOutputVisitor *qov;
     Visitor *v;
-
 ''')
+        ret += gen_param_var(arg_type)
 
     ret += mcgen('''
+
     emit = qmp_event_get_func_emit();
     if (!emit) {
         return;
@@ -58,26 +89,23 @@ def gen_event_send(name, arg_type):
                  name=name)
 
     if arg_type and arg_type.members:
-        assert not arg_type.variants
         ret += mcgen('''
     qov = qmp_output_visitor_new();
     v = qmp_output_get_visitor(qov);
 
     visit_start_struct(v, "%(name)s", NULL, 0, &err);
-''',
-                     name=name)
-        ret += gen_err_check()
-        ret += gen_visit_members(arg_type.members, need_cast=True,
-                                 label='out_obj')
-        ret += mcgen('''
-out_obj:
+    if (err) {
+        goto out;
+    }
+    visit_type_%(c_name)s_members(v, &param, &err);
     visit_end_struct(v, err ? NULL : &err);
     if (err) {
         goto out;
     }
 
     qdict_put_obj(qmp, "data", qmp_output_get_qobject(qov));
-''')
+''',
+                     name=name, c_name=arg_type.c_name())
 
     ret += mcgen('''
     emit(%(c_enum)s, qmp, &err);
-- 
2.4.3

  parent reply	other threads:[~2016-03-18 10:04 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-18 10:04 [Qemu-devel] [PULL 00/15] QAPI patches for 2016-03-18 Markus Armbruster
2016-03-18 10:04 ` [Qemu-devel] [PULL 01/15] qapi: Assert in places where variants are not handled Markus Armbruster
2016-03-18 10:04 ` [Qemu-devel] [PULL 02/15] qapi: Fix command with named empty argument type Markus Armbruster
2016-03-18 10:04 ` [Qemu-devel] [PULL 03/15] qapi: Make c_type() more OO-like Markus Armbruster
2016-03-18 10:04 ` [Qemu-devel] [PULL 04/15] qapi: Adjust names of implicit types Markus Armbruster
2016-03-18 10:04 ` [Qemu-devel] [PULL 05/15] qapi: Emit implicit structs in generated C Markus Armbruster
2016-03-18 10:04 ` [Qemu-devel] [PULL 06/15] qapi-event: Drop qmp_output_get_qobject() null check Markus Armbruster
2016-03-18 10:04 ` Markus Armbruster [this message]
2016-03-18 10:04 ` [Qemu-devel] [PULL 08/15] qapi-commands: Utilize implicit struct visits Markus Armbruster
2016-03-18 10:04 ` [Qemu-devel] [PULL 09/15] qapi-commands: Inline single-use helpers of gen_marshal() Markus Armbruster
2016-03-18 10:04 ` [Qemu-devel] [PULL 10/15] qapi: Inline gen_visit_members() into lone caller Markus Armbruster
2016-03-18 10:04 ` [Qemu-devel] [PULL 11/15] qapi: Drop unused c_null() Markus Armbruster
2016-03-18 10:04 ` [Qemu-devel] [PULL 12/15] qapi: Don't special-case simple union wrappers Markus Armbruster
2016-03-18 10:04 ` [Qemu-devel] [PULL 13/15] qapi: Make BlockdevOptions doc example closer to reality Markus Armbruster
2016-03-18 10:04 ` [Qemu-devel] [PULL 14/15] qapi: Allow anonymous base for flat union Markus Armbruster
2016-03-18 10:04 ` [Qemu-devel] [PULL 15/15] qapi: Use anonymous bases in QMP flat unions Markus Armbruster
2016-03-18 18:08 ` [Qemu-devel] [PULL 00/15] QAPI patches for 2016-03-18 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=1458295469-22215-8-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.