From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44496) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZAOX1-0003eK-9H for qemu-devel@nongnu.org; Wed, 01 Jul 2015 16:23:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZAOWv-0006CH-Gr for qemu-devel@nongnu.org; Wed, 01 Jul 2015 16:22:54 -0400 Received: from mx1.redhat.com ([209.132.183.28]:33230) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZAOWv-0006BP-7G for qemu-devel@nongnu.org; Wed, 01 Jul 2015 16:22:49 -0400 From: Markus Armbruster Date: Wed, 1 Jul 2015 22:22:23 +0200 Message-Id: <1435782155-31412-36-git-send-email-armbru@redhat.com> In-Reply-To: <1435782155-31412-1-git-send-email-armbru@redhat.com> References: <1435782155-31412-1-git-send-email-armbru@redhat.com> Subject: [Qemu-devel] [PATCH RFC v2 35/47] qapi-commands: Rearrange code List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, berto@igalia.com, mdroth@linux.vnet.ibm.com Rename gen_marshal_input() to gen_marshal(), because the generated function marshals both arguments and results. Rename gen_visitor_input_containers_decl() to gen_marshal_vars(), and move the other variable declarations there, too. Rename gen_visitor_input_block()() to gen_marshal_input_visit(), and rearrange its code slightly. Rename gen_marshal_input_decl() to gen_marshal_proto(), because the result isn't a full declaration, unlike gen_command_decl()'s. New gen_marshal_decl() actually returns a full declaration. Signed-off-by: Markus Armbruster --- scripts/qapi-commands.py | 95 ++++++++++++++++++++++-------------------------- 1 file changed, 43 insertions(+), 52 deletions(-) diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py index 5d11032..728f15b 100644 --- a/scripts/qapi-commands.py +++ b/scripts/qapi-commands.py @@ -56,6 +56,7 @@ def gen_call(name, args, rets): push_indent() ret = mcgen(''' + %(lhs)sqmp_%(c_name)s(%(args)s&local_err); ''', c_name=c_name(name), args=argstr, lhs=lhs) @@ -69,25 +70,31 @@ qmp_marshal_output_%(c_name)s(retval, ret, &local_err); pop_indent() return ret -def gen_visitor_input_containers_decl(args): - ret = '' +def gen_marshal_vars(args, rets): + ret = mcgen(''' + Error *local_err = NULL; +''') push_indent() + + if rets: + # FIXME fishy: only pointers are initialized + if rets.c_null() == 'NULL': + retval = '%s retval = NULL;' % rets.c_type() + else: + retval = '%s retval;' % rets.c_type() + ret += mcgen(''' +%(retval)s +''', + retval=retval) + if args: ret += mcgen(''' QmpInputVisitor *mi = qmp_input_visitor_new_strict(QOBJECT(args)); QapiDeallocVisitor *md; Visitor *v; ''') - pop_indent() - return ret - -def gen_visitor_input_vars_decl(args): - ret = '' - push_indent() - - if args: for memb in args.members: if memb.optional: ret += mcgen(''' @@ -100,14 +107,18 @@ bool has_%(c_name)s = false; c_name=c_name(memb.name), c_type=memb.type.c_type(), c_null=memb.type.c_null()) + ret += '\n' + else: + ret += mcgen(''' + +(void)args; +''') pop_indent() return ret -def gen_visitor_input_block(args, dealloc=False): +def gen_marshal_input_visit(args, dealloc=False): ret = '' - errparg = '&local_err' - errarg = 'local_err' if not args: return ret @@ -123,6 +134,8 @@ md = qapi_dealloc_visitor_new(); v = qapi_dealloc_get_visitor(md); ''') else: + errparg = '&local_err' + errarg = 'local_err' ret += mcgen(''' v = qmp_input_get_visitor(mi); ''') @@ -160,10 +173,7 @@ qapi_dealloc_visitor_cleanup(md); return ret def gen_marshal_output(name, rets): - if not rets: - return '' - - ret = mcgen(''' + return mcgen(''' static void qmp_marshal_output_%(c_cmd_name)s(%(c_type)s ret_in, QObject **ret_out, Error **errp) { @@ -188,50 +198,31 @@ out: qapi_dealloc_visitor_cleanup(md); } ''', - c_type=rets.c_type(), c_cmd_name=c_name(name), - c_name=rets.c_name()) + c_type=rets.c_type(), c_cmd_name=c_name(name), + c_name=rets.c_name()) - return ret - -def gen_marshal_input_decl(name): +def gen_marshal_proto(name): ret = 'void qmp_marshal_input_%s(QDict *args, QObject **ret, Error **errp)' % c_name(name) if not middle_mode: ret = 'static ' + ret return ret -def gen_marshal_input(name, args, rets): - hdr = gen_marshal_input_decl(name) +def gen_marshal_decl(name): + return mcgen(''' +%(proto)s; +''', + proto=gen_marshal_proto(name)) +def gen_marshal(name, args, rets): ret = mcgen(''' -%(header)s +%(proto)s { - Error *local_err = NULL; ''', - header=hdr) - - if rets: - # FIXME fishy: only pointers are initialized - if rets.c_null() == 'NULL': - retval = ' %s retval = NULL;' % rets.c_type() - else: - retval = ' %s retval;' % rets.c_type() - ret += mcgen(''' -%(retval)s -''', - retval=retval) - - if args: - ret += gen_visitor_input_containers_decl(args) - ret += gen_visitor_input_vars_decl(args) + '\n' - ret += gen_visitor_input_block(args) + '\n' - else: - ret += mcgen(''' - - (void)args; - -''') + proto=gen_marshal_proto(name)) + ret += gen_marshal_vars(args, rets) + ret += gen_marshal_input_visit(args) ret += gen_call(name, args, rets) if re.search('^ *goto out;', ret, re.MULTILINE): @@ -242,7 +233,7 @@ out: ret += mcgen(''' error_propagate(errp, local_err); ''') - ret += gen_visitor_input_block(args, dealloc=True) + ret += gen_marshal_input_visit(args, dealloc=True) ret += mcgen(''' } ''') @@ -296,8 +287,8 @@ class QAPISchemaGenCommandVisitor(QAPISchemaVisitor): if rets: self.defn += gen_marshal_output(name, rets) if middle_mode: - self.decl += gen_marshal_input_decl(name) + ';\n' - self.defn += gen_marshal_input(name, args, rets) + self.decl += gen_marshal_decl(name) + self.defn += gen_marshal(name, args, rets) if not middle_mode: self.regy += gen_register_command(name, success_response) -- 1.9.3