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, ¶m, &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, ¶m, &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
next prev 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).