From patchwork Tue Sep 29 22:21:16 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Blake X-Patchwork-Id: 524597 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 83F09140D69 for ; Thu, 1 Oct 2015 07:19:52 +1000 (AEST) Received: from localhost ([::1]:33382 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZhOn0-0007S7-3Y for incoming@patchwork.ozlabs.org; Wed, 30 Sep 2015 17:19:50 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35672) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Zh3HC-0004Bi-I3 for qemu-devel@nongnu.org; Tue, 29 Sep 2015 18:21:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Zh3HB-0001PA-8f for qemu-devel@nongnu.org; Tue, 29 Sep 2015 18:21:34 -0400 Received: from mx1.redhat.com ([209.132.183.28]:59727) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Zh3HB-0001P5-1C for qemu-devel@nongnu.org; Tue, 29 Sep 2015 18:21:33 -0400 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id A0A93C000082; Tue, 29 Sep 2015 22:21:32 +0000 (UTC) Received: from red.redhat.com (ovpn-113-188.phx2.redhat.com [10.3.113.188]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t8TMLInm012619; Tue, 29 Sep 2015 18:21:32 -0400 From: Eric Blake To: qemu-devel@nongnu.org Date: Tue, 29 Sep 2015 16:21:16 -0600 Message-Id: <1443565276-4535-19-git-send-email-eblake@redhat.com> In-Reply-To: <1443565276-4535-1-git-send-email-eblake@redhat.com> References: <1443565276-4535-1-git-send-email-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 209.132.183.28 Cc: Michael Roth , marcandre.lureau@redhat.com, armbru@redhat.com, ehabkost@redhat.com Subject: [Qemu-devel] [RFC PATCH v7 18/18] qapi: Use gen_err_check() in more places 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 Controversial: find all remaining patterns that generate a goto statement due to 'err', and convert them to use gen_err_check(). The bulk of these replacements actually lead to code duplication (extra mcgen() calls with common parameterization), so I will probably drop this patch. Signed-off-by: Eric Blake --- v7: split off of 15/16, for discussion purposes v6: new, split off of 10/46, add label parameter, and catch more instances that could use it --- scripts/qapi-commands.py | 12 ++++++----- scripts/qapi-event.py | 6 +++--- scripts/qapi-visit.py | 55 +++++++++++++++++++++++++++--------------------- 3 files changed, 41 insertions(+), 32 deletions(-) diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py index 43a893b..6994329 100644 --- a/scripts/qapi-commands.py +++ b/scripts/qapi-commands.py @@ -121,7 +121,7 @@ def gen_marshal_input_visit(arg_type, dealloc=False): def gen_marshal_output(ret_type): - return mcgen(''' + ret = mcgen(''' static void qmp_marshal_output_%(c_name)s(%(c_type)s ret_in, QObject **ret_out, Error **errp) { @@ -132,9 +132,10 @@ static void qmp_marshal_output_%(c_name)s(%(c_type)s ret_in, QObject **ret_out, v = qmp_output_get_visitor(qov); visit_type_%(c_name)s(v, &ret_in, "unused", &err); - if (err) { - goto out; - } +''', + c_type=ret_type.c_type(), c_name=ret_type.c_name()) + ret += gen_err_check() + ret += mcgen(''' *ret_out = qmp_output_get_qobject(qov); out: @@ -146,7 +147,8 @@ out: qapi_dealloc_visitor_cleanup(qdv); } ''', - c_type=ret_type.c_type(), c_name=ret_type.c_name()) + c_name=ret_type.c_name()) + return ret def gen_marshal_proto(name): diff --git a/scripts/qapi-event.py b/scripts/qapi-event.py index b5e4d59..8eb353e 100644 --- a/scripts/qapi-event.py +++ b/scripts/qapi-event.py @@ -75,9 +75,9 @@ def gen_event_send(name, arg_type): ret += mcgen(''' visit_end_struct(v, &err); - if (err) { - goto out; - } +''') + ret += gen_err_check() + ret += mcgen(''' obj = qmp_output_get_qobject(qov); g_assert(obj != NULL); diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py index 4f97781..46c4d56 100644 --- a/scripts/qapi-visit.py +++ b/scripts/qapi-visit.py @@ -128,7 +128,7 @@ void visit_type_%(c_name)s(Visitor *v, %(c_name)s **obj, const char *name, Error def gen_visit_list(name, element_type): - return mcgen(''' + ret = mcgen(''' void visit_type_%(c_name)s(Visitor *v, %(c_name)s **obj, const char *name, Error **errp) { @@ -136,9 +136,10 @@ void visit_type_%(c_name)s(Visitor *v, %(c_name)s **obj, const char *name, Error GenericList *i, **prev; visit_start_list(v, name, &err); - if (err) { - goto out; - } +''', + c_name=c_name(name), c_elt_type=element_type.c_name()) + ret += gen_err_check() + ret += mcgen(''' for (prev = (GenericList **)obj; !err && (i = visit_next_list(v, prev, &err)) != NULL; @@ -155,6 +156,7 @@ out: } ''', c_name=c_name(name), c_elt_type=element_type.c_name()) + return ret def gen_visit_enum(name): @@ -176,16 +178,17 @@ void visit_type_%(c_name)s(Visitor *v, %(c_name)s **obj, const char *name, Error Error *err = NULL; visit_start_implicit_struct(v, (void**) obj, sizeof(%(c_name)s), &err); - if (err) { - goto out; - } +''', + c_name=c_name(name)) + ret += gen_err_check() + ret += mcgen(''' visit_get_next_type(v, (int*) &(*obj)->kind, %(c_name)s_qtypes, name, &err); - if (err) { - goto out_obj; - } +''', + c_name=c_name(name)) + ret += gen_err_check(label='out_obj') + ret += mcgen(''' switch ((*obj)->kind) { -''', - c_name=c_name(name)) +''') for var in variants.variants: ret += mcgen(''' @@ -233,14 +236,14 @@ void visit_type_%(c_name)s(Visitor *v, %(c_name)s **obj, const char *name, Error Error *err = NULL; visit_start_struct(v, (void **)obj, "%(name)s", name, sizeof(%(c_name)s), &err); - if (err) { - goto out; - } +''', + c_name=c_name(name), name=name) + ret += gen_err_check() + ret += mcgen(''' if (!*obj) { goto out_obj; } -''', - c_name=c_name(name), name=name) +''') if base: ret += mcgen(''' @@ -255,13 +258,6 @@ void visit_type_%(c_name)s(Visitor *v, %(c_name)s **obj, const char *name, Error tag_key = 'type' ret += mcgen(''' visit_type_%(c_type)s(v, &(*obj)->%(c_name)s, "%(name)s", &err); - if (err) { - goto out_obj; - } - if (!visit_start_union(v, !!(*obj)->data, &err) || err) { - goto out_obj; - } - switch ((*obj)->%(c_name)s) { ''', c_type=variants.tag_member.type.c_name(), # TODO ugly special case for simple union @@ -269,6 +265,17 @@ void visit_type_%(c_name)s(Visitor *v, %(c_name)s **obj, const char *name, Error # it, then: c_name=c_name(variants.tag_member.name) c_name=c_name(variants.tag_name or 'kind'), name=tag_key) + ret += gen_err_check(label='out_obj') + ret += mcgen(''' + if (!visit_start_union(v, !!(*obj)->data, &err) || err) { + goto out_obj; + } + switch ((*obj)->%(c_name)s) { +''', + # TODO ugly special case for simple union + # Use same tag name in C as on the wire to get rid of + # it, then: c_name=c_name(variants.tag_member.name) + c_name=c_name(variants.tag_name or 'kind')) for var in variants.variants: # TODO ugly special case for simple union