qapi: Disallow qmp_marshal_FOO(NULL, ...)

For QMP commands without arguments, gen_marshal() laboriously
generates a qmp_marshal_FOO() that copes with null @args.  Turns
there's just one caller that passes null instead of an empty QDict.
Adjust that caller, and simplify gen_marshal().

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20200424084338.26803-15-armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Markus Armbruster 2020-04-24 10:43:37 +02:00
parent ea097dff0f
commit 2061487bdb
3 changed files with 7 additions and 26 deletions

View File

@ -1579,8 +1579,8 @@ Example:
void qmp_marshal_my_command(QDict *args, QObject **ret, Error **errp) void qmp_marshal_my_command(QDict *args, QObject **ret, Error **errp)
{ {
Error *err = NULL; Error *err = NULL;
UserDefOne *retval;
Visitor *v; Visitor *v;
UserDefOne *retval;
q_obj_my_command_arg arg = {0}; q_obj_my_command_arg arg = {0};
v = qobject_input_visitor_new(QOBJECT(args)); v = qobject_input_visitor_new(QOBJECT(args));

View File

@ -322,9 +322,12 @@ static QDict *qmp_greeting(MonitorQMP *mon)
{ {
QList *cap_list = qlist_new(); QList *cap_list = qlist_new();
QObject *ver = NULL; QObject *ver = NULL;
QDict *args;
QMPCapability cap; QMPCapability cap;
qmp_marshal_query_version(NULL, &ver, NULL); args = qdict_new();
qmp_marshal_query_version(args, &ver, NULL);
qobject_unref(args);
for (cap = 0; cap < QMP_CAPABILITY__MAX; cap++) { for (cap = 0; cap < QMP_CAPABILITY__MAX; cap++) {
if (mon->capab_offered[cap]) { if (mon->capab_offered[cap]) {

View File

@ -104,6 +104,7 @@ def gen_marshal(name, arg_type, boxed, ret_type):
%(proto)s %(proto)s
{ {
Error *err = NULL; Error *err = NULL;
Visitor *v;
''', ''',
proto=build_marshal_proto(name)) proto=build_marshal_proto(name))
@ -117,21 +118,14 @@ def gen_marshal(name, arg_type, boxed, ret_type):
visit_members = ('visit_type_%s_members(v, &arg, &err);' visit_members = ('visit_type_%s_members(v, &arg, &err);'
% arg_type.c_name()) % arg_type.c_name())
ret += mcgen(''' ret += mcgen('''
Visitor *v;
%(c_name)s arg = {0}; %(c_name)s arg = {0};
''', ''',
c_name=arg_type.c_name()) c_name=arg_type.c_name())
else: else:
visit_members = '' visit_members = ''
ret += mcgen('''
Visitor *v = NULL;
if (args) {
''')
push_indent()
ret += mcgen(''' ret += mcgen('''
v = qobject_input_visitor_new(QOBJECT(args)); v = qobject_input_visitor_new(QOBJECT(args));
visit_start_struct(v, NULL, NULL, 0, &err); visit_start_struct(v, NULL, NULL, 0, &err);
if (err) { if (err) {
@ -148,12 +142,6 @@ def gen_marshal(name, arg_type, boxed, ret_type):
''', ''',
visit_members=visit_members) visit_members=visit_members)
if not have_args:
pop_indent()
ret += mcgen('''
}
''')
ret += gen_call(name, arg_type, boxed, ret_type) ret += gen_call(name, arg_type, boxed, ret_type)
ret += mcgen(''' ret += mcgen('''
@ -168,10 +156,6 @@ out:
% arg_type.c_name()) % arg_type.c_name())
else: else:
visit_members = '' visit_members = ''
ret += mcgen('''
if (args) {
''')
push_indent()
ret += mcgen(''' ret += mcgen('''
v = qapi_dealloc_visitor_new(); v = qapi_dealloc_visitor_new();
@ -182,12 +166,6 @@ out:
''', ''',
visit_members=visit_members) visit_members=visit_members)
if not have_args:
pop_indent()
ret += mcgen('''
}
''')
ret += mcgen(''' ret += mcgen('''
} }
''') ''')