From patchwork Tue May 20 09:08:00 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fam Zheng X-Patchwork-Id: 350603 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id A9E95140084 for ; Tue, 20 May 2014 19:08:48 +1000 (EST) Received: from localhost ([::1]:51975 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wmg2Q-0004ZI-89 for incoming@patchwork.ozlabs.org; Tue, 20 May 2014 05:08:46 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43490) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wmg1o-0003Xi-If for qemu-devel@nongnu.org; Tue, 20 May 2014 05:08:14 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Wmg1i-000843-Lw for qemu-devel@nongnu.org; Tue, 20 May 2014 05:08:08 -0400 Received: from mx1.redhat.com ([209.132.183.28]:51434) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wmg1i-00083f-F0 for qemu-devel@nongnu.org; Tue, 20 May 2014 05:08:02 -0400 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s4K982Kp008151 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 20 May 2014 05:08:02 -0400 Received: from T430.nay.redhat.com (dhcp-14-247.nay.redhat.com [10.66.14.247]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s4K97mc8019411; Tue, 20 May 2014 05:08:00 -0400 From: Fam Zheng To: qemu-devel@nongnu.org Date: Tue, 20 May 2014 17:08:00 +0800 Message-Id: <1400576881-6954-7-git-send-email-famz@redhat.com> In-Reply-To: <1400576881-6954-1-git-send-email-famz@redhat.com> References: <1400576881-6954-1-git-send-email-famz@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 209.132.183.28 Cc: Kevin Wolf , Stefan Hajnoczi Subject: [Qemu-devel] [RFC PATCH v2 6/7] qapi: Initialize argument value in generated code if has 'default' X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Input marshalling code generation is modified. If an argument has default, initialize its value in generated code to that default. If this argument is specified by user input, visit argument with deallocate visitor, before input visitor, so that the initial value is deallocated. This moves initialization of md, mi, vd, vi before input block as necessary, and moves cleanup of mi aside cleanup of md, for symmetry. Signed-off-by: Fam Zheng --- scripts/qapi-commands.py | 47 +++++++++++++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py index 05904f9..62ab51a 100644 --- a/scripts/qapi-commands.py +++ b/scripts/qapi-commands.py @@ -87,8 +87,8 @@ def gen_visitor_input_containers_decl(args, obj): if len(args) > 0: ret += mcgen(''' QmpInputVisitor *mi = qmp_input_visitor_new_strict(%(obj)s); -QapiDeallocVisitor *md; -Visitor *v; +QapiDeallocVisitor *md = qapi_dealloc_visitor_new(); +Visitor *vi, *vd; ''', obj=obj) pop_indent() @@ -99,12 +99,19 @@ def gen_visitor_input_vars_decl(args): ret = "" push_indent() for argname, argtype, optional, structured, default in parse_args(args): - if optional: + has_default = default is not None + if optional or has_default: ret += mcgen(''' bool has_%(argname)s = false; ''', argname=c_var(argname)) - if c_type(argtype).endswith("*"): + if has_default: + ret += mcgen(''' +%(argtype)s %(argname)s = %(argval)s; +''', + argname=c_var(argname), argtype=c_type(argtype), + argval=c_val(argtype, default)) + elif c_type(argtype).endswith("*"): ret += mcgen(''' %(argtype)s %(argname)s = NULL; ''', @@ -122,6 +129,7 @@ def gen_visitor_input_block(args, dealloc=False): ret = "" errparg = '&local_err' errarg = 'local_err' + vvar = 'vi' if len(args) == 0: return ret @@ -131,35 +139,41 @@ def gen_visitor_input_block(args, dealloc=False): if dealloc: errparg = 'NULL' errarg = None; - ret += mcgen(''' -qmp_input_visitor_cleanup(mi); -md = qapi_dealloc_visitor_new(); -v = qapi_dealloc_get_visitor(md); -''') + vvar = 'vd' else: ret += mcgen(''' -v = qmp_input_get_visitor(mi); +vi = qmp_input_get_visitor(mi); +vd = qapi_dealloc_get_visitor(md); ''') for argname, argtype, optional, structured, default in parse_args(args): - if optional: + has_default = default is not None + if optional or has_default: ret += mcgen(''' -visit_optional(v, &has_%(c_name)s, "%(name)s", %(errp)s); +visit_optional(%(v)s, &has_%(c_name)s, "%(name)s", %(errp)s); ''', - c_name=c_var(argname), name=argname, errp=errparg) + v=vvar, c_name=c_var(argname), name=argname, errp=errparg) ret += gen_err_check(errarg) ret += mcgen(''' if (has_%(c_name)s) { ''', c_name=c_var(argname)) push_indent() + if not dealloc and has_default: + # For input block, we should deallocate argument that is + # initialized with a defualt value, before reading in from input + ret += mcgen(''' +%(visitor)s(vd, &%(c_name)s, "%(name)s", NULL); +''', + c_name=c_var(argname), name=argname, argtype=argtype, + visitor=type_visitor(argtype), errp=errparg) ret += mcgen(''' -%(visitor)s(v, &%(c_name)s, "%(name)s", %(errp)s); +%(visitor)s(%(v)s, &%(c_name)s, "%(name)s", %(errp)s); ''', - c_name=c_var(argname), name=argname, argtype=argtype, + v=vvar, c_name=c_var(argname), name=argname, argtype=argtype, visitor=type_visitor(argtype), errp=errparg) ret += gen_err_check(errarg) - if optional: + if optional or has_default: pop_indent() ret += mcgen(''' } @@ -167,6 +181,7 @@ if (has_%(c_name)s) { if dealloc: ret += mcgen(''' +qmp_input_visitor_cleanup(mi); qapi_dealloc_visitor_cleanup(md); ''') pop_indent()