From nobody Fri Dec 19 20:42:09 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1594245486; cv=none; d=zohomail.com; s=zohoarc; b=NYdQqhnrLH5IUdi9yZA17TioheZjfB4r2acj40DquImCAaoInDrG+YbM4YjwWlcwwh+cPADbyF8zZmowp7QaPnaY36Oo9JWPnMct9pncfhQ58psa6UcGb5Rm8I7QT6LLVyDLBbRj4rmTO2J6PQGz86Jed7s/gq1M3w8xJamO7IY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1594245486; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=8ZKxpK8CLDy2POMPj/ev17VEMZHFCX2DrRtktbvLGfo=; b=D/K8MbIhYURmFPLqfEGYB1o/2X04r8XomOKJfXeGYNEogYzQbt9z3EbuteNlrgpoeGmH2lAwa3E3Bi15qYOHYn984gG2z8aa2xsAPteIvUPLdWWyDS/znBg6lzHjURjvak6+W/x6awagENGclmmoa3zIZod26gi85I1ljXXbw18= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1594245486358491.01619347525514; Wed, 8 Jul 2020 14:58:06 -0700 (PDT) Received: from localhost ([::1]:50192 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jtI4q-0003mT-QW for importer@patchew.org; Wed, 08 Jul 2020 17:58:04 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:35698) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jtHgl-0006td-QB for qemu-devel@nongnu.org; Wed, 08 Jul 2020 17:33:11 -0400 Received: from us-smtp-delivery-1.mimecast.com ([207.211.31.120]:60388 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1jtHgh-0002mq-2y for qemu-devel@nongnu.org; Wed, 08 Jul 2020 17:33:11 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-360-anP2njqSOWezMB1hp16R0Q-1; Tue, 07 Jul 2020 17:25:14 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id AD83CBFC1; Tue, 7 Jul 2020 21:25:13 +0000 (UTC) Received: from blackfin.pond.sub.org (ovpn-112-143.ams2.redhat.com [10.36.112.143]) by smtp.corp.redhat.com (Postfix) with ESMTPS id D2268C0067; Tue, 7 Jul 2020 21:25:12 +0000 (UTC) Received: by blackfin.pond.sub.org (Postfix, from userid 1000) id 2F8261144249; Tue, 7 Jul 2020 23:25:04 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1594243986; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8ZKxpK8CLDy2POMPj/ev17VEMZHFCX2DrRtktbvLGfo=; b=OtjazHtF+oCxXy5iws0wstzYfHs1BLHmgIhmMTPVHjs7VHIzJSo22MyxMkE+1IfYF8ldw5 9Cm/8inHs2oCNqKHgfGudpyliUi/djZ5z4uVPK1ti5w9MD+79Wa6m/AUldITV8XiRBEMai SGj+LPtu6CP0PwDRir8arR3QXk4AUkY= X-MC-Unique: anP2njqSOWezMB1hp16R0Q-1 From: Markus Armbruster To: qemu-devel@nongnu.org Subject: [PULL 17/53] qapi: Make visitor functions taking Error ** return bool, not void Date: Tue, 7 Jul 2020 23:24:27 +0200 Message-Id: <20200707212503.1495927-18-armbru@redhat.com> In-Reply-To: <20200707212503.1495927-1-armbru@redhat.com> References: <20200707212503.1495927-1-armbru@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=armbru@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=207.211.31.120; envelope-from=armbru@redhat.com; helo=us-smtp-1.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/07/07 17:25:10 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -40 X-Spam_score: -4.1 X-Spam_bar: ---- X-Spam_report: (-4.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-1, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Vladimir Sementsov-Ogievskiy Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Type: text/plain; charset="utf-8" See recent commit "error: Document Error API usage rules" for rationale. Signed-off-by: Markus Armbruster Reviewed-by: Eric Blake Reviewed-by: Vladimir Sementsov-Ogievskiy Message-Id: <20200707160613.848843-18-armbru@redhat.com> --- docs/devel/qapi-code-gen.txt | 51 +++++------ include/qapi/clone-visitor.h | 8 +- include/qapi/visitor-impl.h | 26 +++--- include/qapi/visitor.h | 102 ++++++++++++--------- audio/audio_legacy.c | 15 ++-- qapi/opts-visitor.c | 66 ++++++++------ qapi/qapi-clone-visitor.c | 69 +++++++------- qapi/qapi-dealloc-visitor.c | 27 ++++-- qapi/qapi-visit-core.c | 165 ++++++++++++++++++---------------- qapi/qobject-input-visitor.c | 109 +++++++++++++--------- qapi/qobject-output-visitor.c | 27 ++++-- qapi/string-input-visitor.c | 62 +++++++------ qapi/string-output-visitor.c | 32 ++++--- scripts/qapi/visit.py | 58 +++++------- 14 files changed, 456 insertions(+), 361 deletions(-) diff --git a/docs/devel/qapi-code-gen.txt b/docs/devel/qapi-code-gen.txt index a7794ef658..9bfc57063c 100644 --- a/docs/devel/qapi-code-gen.txt +++ b/docs/devel/qapi-code-gen.txt @@ -1408,42 +1408,38 @@ Example: #include "example-qapi-types.h" =20 =20 - void visit_type_UserDefOne_members(Visitor *v, UserDefOne *obj, Error = **errp); - void visit_type_UserDefOne(Visitor *v, const char *name, UserDefOne **= obj, Error **errp); - void visit_type_UserDefOneList(Visitor *v, const char *name, UserDefOn= eList **obj, Error **errp); + bool visit_type_UserDefOne_members(Visitor *v, UserDefOne *obj, Error = **errp); + bool visit_type_UserDefOne(Visitor *v, const char *name, UserDefOne **= obj, Error **errp); + bool visit_type_UserDefOneList(Visitor *v, const char *name, UserDefOn= eList **obj, Error **errp); =20 - void visit_type_q_obj_my_command_arg_members(Visitor *v, q_obj_my_comm= and_arg *obj, Error **errp); + bool visit_type_q_obj_my_command_arg_members(Visitor *v, q_obj_my_comm= and_arg *obj, Error **errp); =20 #endif /* EXAMPLE_QAPI_VISIT_H */ $ cat qapi-generated/example-qapi-visit.c [Uninteresting stuff omitted...] =20 - void visit_type_UserDefOne_members(Visitor *v, UserDefOne *obj, Error = **errp) + bool visit_type_UserDefOne_members(Visitor *v, UserDefOne *obj, Error = **errp) { Error *err =3D NULL; =20 - visit_type_int(v, "integer", &obj->integer, &err); - if (err) { - goto out; + if (!visit_type_int(v, "integer", &obj->integer, errp)) { + return false; } if (visit_optional(v, "string", &obj->has_string)) { - visit_type_str(v, "string", &obj->string, &err); - if (err) { - goto out; + if (!visit_type_str(v, "string", &obj->string, errp)) { + return false; } } - - out: error_propagate(errp, err); + return !err; } =20 - void visit_type_UserDefOne(Visitor *v, const char *name, UserDefOne **= obj, Error **errp) + bool visit_type_UserDefOne(Visitor *v, const char *name, UserDefOne **= obj, Error **errp) { Error *err =3D NULL; =20 - visit_start_struct(v, name, (void **)obj, sizeof(UserDefOne), &err= ); - if (err) { - goto out; + if (!visit_start_struct(v, name, (void **)obj, sizeof(UserDefOne),= errp)) { + return false; } if (!*obj) { /* incomplete */ @@ -1461,19 +1457,18 @@ Example: qapi_free_UserDefOne(*obj); *obj =3D NULL; } - out: error_propagate(errp, err); + return !err; } =20 - void visit_type_UserDefOneList(Visitor *v, const char *name, UserDefOn= eList **obj, Error **errp) + bool visit_type_UserDefOneList(Visitor *v, const char *name, UserDefOn= eList **obj, Error **errp) { Error *err =3D NULL; UserDefOneList *tail; size_t size =3D sizeof(**obj); =20 - visit_start_list(v, name, (GenericList **)obj, size, &err); - if (err) { - goto out; + if (!visit_start_list(v, name, (GenericList **)obj, size, errp)) { + return false; } =20 for (tail =3D *obj; tail; @@ -1492,21 +1487,19 @@ Example: qapi_free_UserDefOneList(*obj); *obj =3D NULL; } - out: error_propagate(errp, err); + return !err; } =20 - void visit_type_q_obj_my_command_arg_members(Visitor *v, q_obj_my_comm= and_arg *obj, Error **errp) + bool visit_type_q_obj_my_command_arg_members(Visitor *v, q_obj_my_comm= and_arg *obj, Error **errp) { Error *err =3D NULL; =20 - visit_type_UserDefOneList(v, "arg1", &obj->arg1, &err); - if (err) { - goto out; + if (!visit_type_UserDefOneList(v, "arg1", &obj->arg1, errp)) { + return false; } - - out: error_propagate(errp, err); + return !err; } =20 [Uninteresting stuff omitted...] diff --git a/include/qapi/clone-visitor.h b/include/qapi/clone-visitor.h index 5b665ee38c..adf9a788e2 100644 --- a/include/qapi/clone-visitor.h +++ b/include/qapi/clone-visitor.h @@ -20,10 +20,10 @@ */ typedef struct QapiCloneVisitor QapiCloneVisitor; =20 -void *qapi_clone(const void *src, void (*visit_type)(Visitor *, const char= *, +void *qapi_clone(const void *src, bool (*visit_type)(Visitor *, const char= *, void **, Error **)); void qapi_clone_members(void *dst, const void *src, size_t sz, - void (*visit_type_members)(Visitor *, void *, + bool (*visit_type_members)(Visitor *, void *, Error **)); =20 /* @@ -34,7 +34,7 @@ void qapi_clone_members(void *dst, const void *src, size_= t sz, */ #define QAPI_CLONE(type, src) \ ((type *)qapi_clone(src, \ - (void (*)(Visitor *, const char *, void**, \ + (bool (*)(Visitor *, const char *, void **, \ Error **))visit_type_ ## type)) =20 /* @@ -45,7 +45,7 @@ void qapi_clone_members(void *dst, const void *src, size_= t sz, */ #define QAPI_CLONE_MEMBERS(type, dst, src) \ qapi_clone_members(dst, src, sizeof(type), \ - (void (*)(Visitor *, void *, \ + (bool (*)(Visitor *, void *, \ Error **))visit_type_ ## type ## _members) =20 #endif diff --git a/include/qapi/visitor-impl.h b/include/qapi/visitor-impl.h index 98dc533d39..7362c043be 100644 --- a/include/qapi/visitor-impl.h +++ b/include/qapi/visitor-impl.h @@ -48,31 +48,31 @@ struct Visitor */ =20 /* Must be set to visit structs */ - void (*start_struct)(Visitor *v, const char *name, void **obj, + bool (*start_struct)(Visitor *v, const char *name, void **obj, size_t size, Error **errp); =20 /* Optional; intended for input visitors */ - void (*check_struct)(Visitor *v, Error **errp); + bool (*check_struct)(Visitor *v, Error **errp); =20 /* Must be set to visit structs */ void (*end_struct)(Visitor *v, void **obj); =20 /* Must be set; implementations may require @list to be non-null, * but must document it. */ - void (*start_list)(Visitor *v, const char *name, GenericList **list, + bool (*start_list)(Visitor *v, const char *name, GenericList **list, size_t size, Error **errp); =20 /* Must be set */ GenericList *(*next_list)(Visitor *v, GenericList *tail, size_t size); =20 /* Optional; intended for input visitors */ - void (*check_list)(Visitor *v, Error **errp); + bool (*check_list)(Visitor *v, Error **errp); =20 /* Must be set */ void (*end_list)(Visitor *v, void **list); =20 /* Must be set by input and clone visitors to visit alternates */ - void (*start_alternate)(Visitor *v, const char *name, + bool (*start_alternate)(Visitor *v, const char *name, GenericAlternate **obj, size_t size, Error **errp); =20 @@ -80,33 +80,33 @@ struct Visitor void (*end_alternate)(Visitor *v, void **obj); =20 /* Must be set */ - void (*type_int64)(Visitor *v, const char *name, int64_t *obj, + bool (*type_int64)(Visitor *v, const char *name, int64_t *obj, Error **errp); =20 /* Must be set */ - void (*type_uint64)(Visitor *v, const char *name, uint64_t *obj, + bool (*type_uint64)(Visitor *v, const char *name, uint64_t *obj, Error **errp); =20 /* Optional; fallback is type_uint64() */ - void (*type_size)(Visitor *v, const char *name, uint64_t *obj, + bool (*type_size)(Visitor *v, const char *name, uint64_t *obj, Error **errp); =20 /* Must be set */ - void (*type_bool)(Visitor *v, const char *name, bool *obj, Error **err= p); + bool (*type_bool)(Visitor *v, const char *name, bool *obj, Error **err= p); =20 /* Must be set */ - void (*type_str)(Visitor *v, const char *name, char **obj, Error **err= p); + bool (*type_str)(Visitor *v, const char *name, char **obj, Error **err= p); =20 /* Must be set to visit numbers */ - void (*type_number)(Visitor *v, const char *name, double *obj, + bool (*type_number)(Visitor *v, const char *name, double *obj, Error **errp); =20 /* Must be set to visit arbitrary QTypes */ - void (*type_any)(Visitor *v, const char *name, QObject **obj, + bool (*type_any)(Visitor *v, const char *name, QObject **obj, Error **errp); =20 /* Must be set to visit explicit null values. */ - void (*type_null)(Visitor *v, const char *name, QNull **obj, + bool (*type_null)(Visitor *v, const char *name, QNull **obj, Error **errp); =20 /* Must be set for input visitors to visit structs, optional otherwise. diff --git a/include/qapi/visitor.h b/include/qapi/visitor.h index 5573906966..ebc19ede7f 100644 --- a/include/qapi/visitor.h +++ b/include/qapi/visitor.h @@ -60,7 +60,7 @@ * All QAPI types have a corresponding function with a signature * roughly compatible with this: * - * void visit_type_FOO(Visitor *v, const char *name, T obj, Error **errp); + * bool visit_type_FOO(Visitor *v, const char *name, T obj, Error **errp); * * where T is FOO for scalar types, and FOO * otherwise. The scalar * visitors are declared here; the remaining visitors are generated in @@ -95,14 +95,16 @@ * incomplete object, such an object is possible only by manual * construction. * + * visit_type_FOO() returns true on success, false on error. + * * For the QAPI object types (structs, unions, and alternates), there * is an additional generated function in qapi-visit-MODULE.h * compatible with: * - * void visit_type_FOO_members(Visitor *v, FOO *obj, Error **errp); + * bool visit_type_FOO_members(Visitor *v, FOO *obj, Error **errp); * * for visiting the members of a type without also allocating the QAPI - * struct. + * struct. It also returns true on success, false on error. * * Additionally, QAPI pointer types (structs, unions, alternates, and * lists) have a generated function in qapi-types-MODULE.h compatible @@ -131,8 +133,7 @@ * Visitor *v; * * v =3D FOO_visitor_new(...); - * visit_type_Foo(v, NULL, &f, &err); - * if (err) { + * if (!visit_type_Foo(v, NULL, &f, &err)) { * ...handle error... * } else { * ...use f... @@ -148,8 +149,7 @@ * Visitor *v; * * v =3D FOO_visitor_new(...); - * visit_type_FooList(v, NULL, &l, &err); - * if (err) { + * if (!visit_type_FooList(v, NULL, &l, &err)) { * ...handle error... * } else { * for ( ; l; l =3D l->next) { @@ -186,34 +186,32 @@ * * Visitor *v; * Error *err =3D NULL; + * bool ok =3D false; * int value; * * v =3D FOO_visitor_new(...); - * visit_start_struct(v, NULL, NULL, 0, &err); - * if (err) { + * if (!visit_start_struct(v, NULL, NULL, 0, &err)) { * goto out; * } - * visit_start_list(v, "list", NULL, 0, &err); - * if (err) { + * if (!visit_start_list(v, "list", NULL, 0, &err)) { * goto outobj; * } * value =3D 1; - * visit_type_int(v, NULL, &value, &err); - * if (err) { + * if (!visit_type_int(v, NULL, &value, &err)) { * goto outlist; * } * value =3D 2; - * visit_type_int(v, NULL, &value, &err); - * if (err) { + * if (!visit_type_int(v, NULL, &value, &err)) { * goto outlist; * } + * ok =3D true; * outlist: - * if (!err) { - * visit_check_list(v, &err); + * if (ok) { + * ok =3D visit_check_list(v, &err); * } * visit_end_list(v, NULL); - * if (!err) { - * visit_check_struct(v, &err); + * if (ok) { + * ok =3D visit_check_struct(v, &err); * } * outobj: * visit_end_struct(v, NULL); @@ -286,6 +284,8 @@ void visit_free(Visitor *v); * On failure, set *@obj to NULL and store an error through @errp. * Can happen only when @v is an input visitor. * + * Return true on success, false on failure. + * * After visit_start_struct() succeeds, the caller may visit its * members one after the other, passing the member's name and address * within the struct. Finally, visit_end_struct() needs to be called @@ -295,7 +295,7 @@ void visit_free(Visitor *v); * FIXME Should this be named visit_start_object, since it is also * used for QAPI unions, and maps to JSON objects? */ -void visit_start_struct(Visitor *v, const char *name, void **obj, +bool visit_start_struct(Visitor *v, const char *name, void **obj, size_t size, Error **errp); =20 /* @@ -304,12 +304,14 @@ void visit_start_struct(Visitor *v, const char *name,= void **obj, * On failure, store an error through @errp. Can happen only when @v * is an input visitor. * + * Return true on success, false on failure. + * * Should be called prior to visit_end_struct() if all other * intermediate visit steps were successful, to allow the visitor one * last chance to report errors. May be skipped on a cleanup path, * where there is no need to check for further errors. */ -void visit_check_struct(Visitor *v, Error **errp); +bool visit_check_struct(Visitor *v, Error **errp); =20 /* * Complete an object visit started earlier. @@ -341,6 +343,8 @@ void visit_end_struct(Visitor *v, void **obj); * On failure, set *@list to NULL and store an error through @errp. * Can happen only when @v is an input visitor. * + * Return true on success, false on failure. + * * After visit_start_list() succeeds, the caller may visit its members * one after the other. A real visit (where @list is non-NULL) uses * visit_next_list() for traversing the linked list, while a virtual @@ -351,7 +355,7 @@ void visit_end_struct(Visitor *v, void **obj); * same @list to clean up, even if intermediate visits fail. See the * examples above. */ -void visit_start_list(Visitor *v, const char *name, GenericList **list, +bool visit_start_list(Visitor *v, const char *name, GenericList **list, size_t size, Error **errp); =20 /* @@ -376,12 +380,14 @@ GenericList *visit_next_list(Visitor *v, GenericList = *tail, size_t size); * On failure, store an error through @errp. Can happen only when @v * is an input visitor. * + * Return true on success, false on failure. + * * Should be called prior to visit_end_list() if all other * intermediate visit steps were successful, to allow the visitor one * last chance to report errors. May be skipped on a cleanup path, * where there is no need to check for further errors. */ -void visit_check_list(Visitor *v, Error **errp); +bool visit_check_list(Visitor *v, Error **errp); =20 /* * Complete a list visit started earlier. @@ -412,11 +418,13 @@ void visit_end_list(Visitor *v, void **list); * On failure, set *@obj to NULL and store an error through @errp. * Can happen only when @v is an input visitor. * + * Return true on success, false on failure. + * * If successful, this must be paired with visit_end_alternate() with * the same @obj to clean up, even if visiting the contents of the * alternate fails. */ -void visit_start_alternate(Visitor *v, const char *name, +bool visit_start_alternate(Visitor *v, const char *name, GenericAlternate **obj, size_t size, Error **errp); =20 @@ -468,12 +476,14 @@ bool visit_optional(Visitor *v, const char *name, boo= l *present); * On failure, store an error through @errp. Can happen only when @v * is an input visitor. * + * Return true on success, false on failure. + * * May call visit_type_str() under the hood, and the enum visit may * fail even if the corresponding string visit succeeded; this implies * that an input visitor's visit_type_str() must have no unwelcome * side effects. */ -void visit_type_enum(Visitor *v, const char *name, int *obj, +bool visit_type_enum(Visitor *v, const char *name, int *obj, const QEnumLookup *lookup, Error **errp); =20 /* @@ -499,28 +509,30 @@ bool visit_is_dealloc(Visitor *v); * * On failure, store an error through @errp. Can happen only when @v * is an input visitor. + * + * Return true on success, false on failure. */ -void visit_type_int(Visitor *v, const char *name, int64_t *obj, Error **er= rp); +bool visit_type_int(Visitor *v, const char *name, int64_t *obj, Error **er= rp); =20 /* * Visit a uint8_t value. * Like visit_type_int(), except clamps the value to uint8_t range. */ -void visit_type_uint8(Visitor *v, const char *name, uint8_t *obj, +bool visit_type_uint8(Visitor *v, const char *name, uint8_t *obj, Error **errp); =20 /* * Visit a uint16_t value. * Like visit_type_int(), except clamps the value to uint16_t range. */ -void visit_type_uint16(Visitor *v, const char *name, uint16_t *obj, +bool visit_type_uint16(Visitor *v, const char *name, uint16_t *obj, Error **errp); =20 /* * Visit a uint32_t value. * Like visit_type_int(), except clamps the value to uint32_t range. */ -void visit_type_uint32(Visitor *v, const char *name, uint32_t *obj, +bool visit_type_uint32(Visitor *v, const char *name, uint32_t *obj, Error **errp); =20 /* @@ -528,34 +540,34 @@ void visit_type_uint32(Visitor *v, const char *name, = uint32_t *obj, * Like visit_type_int(), except clamps the value to uint64_t range, * that is, ensures it is unsigned. */ -void visit_type_uint64(Visitor *v, const char *name, uint64_t *obj, +bool visit_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp); =20 /* * Visit an int8_t value. * Like visit_type_int(), except clamps the value to int8_t range. */ -void visit_type_int8(Visitor *v, const char *name, int8_t *obj, Error **er= rp); +bool visit_type_int8(Visitor *v, const char *name, int8_t *obj, Error **er= rp); =20 /* * Visit an int16_t value. * Like visit_type_int(), except clamps the value to int16_t range. */ -void visit_type_int16(Visitor *v, const char *name, int16_t *obj, +bool visit_type_int16(Visitor *v, const char *name, int16_t *obj, Error **errp); =20 /* * Visit an int32_t value. * Like visit_type_int(), except clamps the value to int32_t range. */ -void visit_type_int32(Visitor *v, const char *name, int32_t *obj, +bool visit_type_int32(Visitor *v, const char *name, int32_t *obj, Error **errp); =20 /* * Visit an int64_t value. * Identical to visit_type_int(). */ -void visit_type_int64(Visitor *v, const char *name, int64_t *obj, +bool visit_type_int64(Visitor *v, const char *name, int64_t *obj, Error **errp); =20 /* @@ -564,7 +576,7 @@ void visit_type_int64(Visitor *v, const char *name, int= 64_t *obj, * recognize additional syntax, such as suffixes for easily scaling * values. */ -void visit_type_size(Visitor *v, const char *name, uint64_t *obj, +bool visit_type_size(Visitor *v, const char *name, uint64_t *obj, Error **errp); =20 /* @@ -578,8 +590,10 @@ void visit_type_size(Visitor *v, const char *name, uin= t64_t *obj, * * On failure, store an error through @errp. Can happen only when @v * is an input visitor. + * + * Return true on success, false on failure. */ -void visit_type_bool(Visitor *v, const char *name, bool *obj, Error **errp= ); +bool visit_type_bool(Visitor *v, const char *name, bool *obj, Error **errp= ); =20 /* * Visit a string value. @@ -598,9 +612,11 @@ void visit_type_bool(Visitor *v, const char *name, boo= l *obj, Error **errp); * On failure, set *@obj to NULL and store an error through @errp. * Can happen only when @v is an input visitor. * + * Return true on success, false on failure. + * * FIXME: Callers that try to output NULL *obj should not be allowed. */ -void visit_type_str(Visitor *v, const char *name, char **obj, Error **errp= ); +bool visit_type_str(Visitor *v, const char *name, char **obj, Error **errp= ); =20 /* * Visit a number (i.e. double) value. @@ -614,8 +630,10 @@ void visit_type_str(Visitor *v, const char *name, char= **obj, Error **errp); * * On failure, store an error through @errp. Can happen only when @v * is an input visitor. + * + * Return true on success, false on failure. */ -void visit_type_number(Visitor *v, const char *name, double *obj, +bool visit_type_number(Visitor *v, const char *name, double *obj, Error **errp); =20 /* @@ -631,11 +649,13 @@ void visit_type_number(Visitor *v, const char *name, = double *obj, * On failure, set *@obj to NULL and store an error through @errp. * Can happen only when @v is an input visitor. * + * Return true on success, false on failure. + * * Note that some kinds of input can't express arbitrary QObject. * E.g. the visitor returned by qobject_input_visitor_new_keyval() * can't create numbers or booleans, only strings. */ -void visit_type_any(Visitor *v, const char *name, QObject **obj, Error **e= rrp); +bool visit_type_any(Visitor *v, const char *name, QObject **obj, Error **e= rrp); =20 /* * Visit a JSON null value. @@ -648,8 +668,10 @@ void visit_type_any(Visitor *v, const char *name, QObj= ect **obj, Error **errp); * * On failure, set *@obj to NULL and store an error through @errp. * Can happen only when @v is an input visitor. + * + * Return true on success, false on failure. */ -void visit_type_null(Visitor *v, const char *name, QNull **obj, +bool visit_type_null(Visitor *v, const char *name, QNull **obj, Error **errp); =20 #endif diff --git a/audio/audio_legacy.c b/audio/audio_legacy.c index ebd7d9fa0d..ffdbd0bcce 100644 --- a/audio/audio_legacy.c +++ b/audio/audio_legacy.c @@ -421,11 +421,12 @@ typedef struct { GList *path; } LegacyPrintVisitor; =20 -static void lv_start_struct(Visitor *v, const char *name, void **obj, +static bool lv_start_struct(Visitor *v, const char *name, void **obj, size_t size, Error **errp) { LegacyPrintVisitor *lv =3D (LegacyPrintVisitor *) v; lv->path =3D g_list_append(lv->path, g_strdup(name)); + return true; } =20 static void lv_end_struct(Visitor *v, void **obj) @@ -453,27 +454,30 @@ static void lv_print_key(Visitor *v, const char *name) printf("%s=3D", name); } =20 -static void lv_type_int64(Visitor *v, const char *name, int64_t *obj, +static bool lv_type_int64(Visitor *v, const char *name, int64_t *obj, Error **errp) { lv_print_key(v, name); printf("%" PRIi64, *obj); + return true; } =20 -static void lv_type_uint64(Visitor *v, const char *name, uint64_t *obj, +static bool lv_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp) { lv_print_key(v, name); printf("%" PRIu64, *obj); + return true; } =20 -static void lv_type_bool(Visitor *v, const char *name, bool *obj, Error **= errp) +static bool lv_type_bool(Visitor *v, const char *name, bool *obj, Error **= errp) { lv_print_key(v, name); printf("%s", *obj ? "on" : "off"); + return true; } =20 -static void lv_type_str(Visitor *v, const char *name, char **obj, Error **= errp) +static bool lv_type_str(Visitor *v, const char *name, char **obj, Error **= errp) { const char *str =3D *obj; lv_print_key(v, name); @@ -484,6 +488,7 @@ static void lv_type_str(Visitor *v, const char *name, c= har **obj, Error **errp) } putchar(*str++); } + return true; } =20 static void lv_complete(Visitor *v, void *opaque) diff --git a/qapi/opts-visitor.c b/qapi/opts-visitor.c index 5fe0276c1c..7781c23a42 100644 --- a/qapi/opts-visitor.c +++ b/qapi/opts-visitor.c @@ -133,7 +133,7 @@ opts_visitor_insert(GHashTable *unprocessed_opts, const= QemuOpt *opt) } =20 =20 -static void +static bool opts_start_struct(Visitor *v, const char *name, void **obj, size_t size, Error **errp) { @@ -144,7 +144,7 @@ opts_start_struct(Visitor *v, const char *name, void **= obj, *obj =3D g_malloc0(size); } if (ov->depth++ > 0) { - return; + return true; } =20 ov->unprocessed_opts =3D g_hash_table_new_full(&g_str_hash, &g_str_equ= al, @@ -163,10 +163,11 @@ opts_start_struct(Visitor *v, const char *name, void = **obj, ov->fake_id_opt->str =3D g_strdup(ov->opts_root->id); opts_visitor_insert(ov->unprocessed_opts, ov->fake_id_opt); } + return true; } =20 =20 -static void +static bool opts_check_struct(Visitor *v, Error **errp) { OptsVisitor *ov =3D to_ov(v); @@ -174,7 +175,7 @@ opts_check_struct(Visitor *v, Error **errp) GQueue *any; =20 if (ov->depth > 1) { - return; + return true; } =20 /* we should have processed all (distinct) QemuOpt instances */ @@ -184,7 +185,9 @@ opts_check_struct(Visitor *v, Error **errp) =20 first =3D g_queue_peek_head(any); error_setg(errp, QERR_INVALID_PARAMETER, first->name); + return false; } + return true; } =20 =20 @@ -221,7 +224,7 @@ lookup_distinct(const OptsVisitor *ov, const char *name= , Error **errp) } =20 =20 -static void +static bool opts_start_list(Visitor *v, const char *name, GenericList **list, size_t s= ize, Error **errp) { @@ -232,12 +235,13 @@ opts_start_list(Visitor *v, const char *name, Generic= List **list, size_t size, /* we don't support visits without a list */ assert(list); ov->repeated_opts =3D lookup_distinct(ov, name, errp); - if (ov->repeated_opts) { - ov->list_mode =3D LM_IN_PROGRESS; - *list =3D g_malloc0(size); - } else { + if (!ov->repeated_opts) { *list =3D NULL; + return false; } + ov->list_mode =3D LM_IN_PROGRESS; + *list =3D g_malloc0(size); + return true; } =20 =20 @@ -285,13 +289,14 @@ opts_next_list(Visitor *v, GenericList *tail, size_t = size) } =20 =20 -static void +static bool opts_check_list(Visitor *v, Error **errp) { /* * Unvisited list elements will be reported later when checking * whether unvisited struct members remain. */ + return true; } =20 =20 @@ -341,7 +346,7 @@ processed(OptsVisitor *ov, const char *name) } =20 =20 -static void +static bool opts_type_str(Visitor *v, const char *name, char **obj, Error **errp) { OptsVisitor *ov =3D to_ov(v); @@ -350,7 +355,7 @@ opts_type_str(Visitor *v, const char *name, char **obj,= Error **errp) opt =3D lookup_scalar(ov, name, errp); if (!opt) { *obj =3D NULL; - return; + return false; } *obj =3D g_strdup(opt->str ? opt->str : ""); /* Note that we consume a string even if this is called as part of @@ -359,11 +364,12 @@ opts_type_str(Visitor *v, const char *name, char **ob= j, Error **errp) * consumed only matters to visit_end_struct() as the final error * check if there were no other failures during the visit. */ processed(ov, name); + return true; } =20 =20 /* mimics qemu-option.c::parse_option_bool() */ -static void +static bool opts_type_bool(Visitor *v, const char *name, bool *obj, Error **errp) { OptsVisitor *ov =3D to_ov(v); @@ -371,7 +377,7 @@ opts_type_bool(Visitor *v, const char *name, bool *obj,= Error **errp) =20 opt =3D lookup_scalar(ov, name, errp); if (!opt) { - return; + return false; } =20 if (opt->str) { @@ -386,17 +392,18 @@ opts_type_bool(Visitor *v, const char *name, bool *ob= j, Error **errp) } else { error_setg(errp, QERR_INVALID_PARAMETER_VALUE, opt->name, "on|yes|y|off|no|n"); - return; + return false; } } else { *obj =3D true; } =20 processed(ov, name); + return true; } =20 =20 -static void +static bool opts_type_int64(Visitor *v, const char *name, int64_t *obj, Error **errp) { OptsVisitor *ov =3D to_ov(v); @@ -407,12 +414,12 @@ opts_type_int64(Visitor *v, const char *name, int64_t= *obj, Error **errp) =20 if (ov->list_mode =3D=3D LM_SIGNED_INTERVAL) { *obj =3D ov->range_next.s; - return; + return true; } =20 opt =3D lookup_scalar(ov, name, errp); if (!opt) { - return; + return false; } str =3D opt->str ? opt->str : ""; =20 @@ -425,7 +432,7 @@ opts_type_int64(Visitor *v, const char *name, int64_t *= obj, Error **errp) if (*endptr =3D=3D '\0') { *obj =3D val; processed(ov, name); - return; + return true; } if (*endptr =3D=3D '-' && ov->list_mode =3D=3D LM_IN_PROGRESS) { long long val2; @@ -442,17 +449,18 @@ opts_type_int64(Visitor *v, const char *name, int64_t= *obj, Error **errp) =20 /* as if entering on the top */ *obj =3D ov->range_next.s; - return; + return true; } } } error_setg(errp, QERR_INVALID_PARAMETER_VALUE, opt->name, (ov->list_mode =3D=3D LM_NONE) ? "an int64 value" : "an int64 value or range"); + return false; } =20 =20 -static void +static bool opts_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp) { OptsVisitor *ov =3D to_ov(v); @@ -463,12 +471,12 @@ opts_type_uint64(Visitor *v, const char *name, uint64= _t *obj, Error **errp) =20 if (ov->list_mode =3D=3D LM_UNSIGNED_INTERVAL) { *obj =3D ov->range_next.u; - return; + return true; } =20 opt =3D lookup_scalar(ov, name, errp); if (!opt) { - return; + return false; } str =3D opt->str; =20 @@ -479,7 +487,7 @@ opts_type_uint64(Visitor *v, const char *name, uint64_t= *obj, Error **errp) if (*endptr =3D=3D '\0') { *obj =3D val; processed(ov, name); - return; + return true; } if (*endptr =3D=3D '-' && ov->list_mode =3D=3D LM_IN_PROGRESS) { unsigned long long val2; @@ -494,17 +502,18 @@ opts_type_uint64(Visitor *v, const char *name, uint64= _t *obj, Error **errp) =20 /* as if entering on the top */ *obj =3D ov->range_next.u; - return; + return true; } } } error_setg(errp, QERR_INVALID_PARAMETER_VALUE, opt->name, (ov->list_mode =3D=3D LM_NONE) ? "a uint64 value" : "a uint64 value or range"); + return false; } =20 =20 -static void +static bool opts_type_size(Visitor *v, const char *name, uint64_t *obj, Error **errp) { OptsVisitor *ov =3D to_ov(v); @@ -513,17 +522,18 @@ opts_type_size(Visitor *v, const char *name, uint64_t= *obj, Error **errp) =20 opt =3D lookup_scalar(ov, name, errp); if (!opt) { - return; + return false; } =20 err =3D qemu_strtosz(opt->str ? opt->str : "", NULL, obj); if (err < 0) { error_setg(errp, QERR_INVALID_PARAMETER_VALUE, opt->name, "a size value"); - return; + return false; } =20 processed(ov, name); + return true; } =20 =20 diff --git a/qapi/qapi-clone-visitor.c b/qapi/qapi-clone-visitor.c index daab6819b4..c45c5caa3b 100644 --- a/qapi/qapi-clone-visitor.c +++ b/qapi/qapi-clone-visitor.c @@ -24,7 +24,7 @@ static QapiCloneVisitor *to_qcv(Visitor *v) return container_of(v, QapiCloneVisitor, visitor); } =20 -static void qapi_clone_start_struct(Visitor *v, const char *name, void **o= bj, +static bool qapi_clone_start_struct(Visitor *v, const char *name, void **o= bj, size_t size, Error **errp) { QapiCloneVisitor *qcv =3D to_qcv(v); @@ -34,11 +34,12 @@ static void qapi_clone_start_struct(Visitor *v, const c= har *name, void **obj, /* Only possible when visiting an alternate's object * branch. Nothing further to do here, since the earlier * visit_start_alternate() already copied memory. */ - return; + return true; } =20 *obj =3D g_memdup(*obj, size); qcv->depth++; + return true; } =20 static void qapi_clone_end(Visitor *v, void **obj) @@ -51,11 +52,11 @@ static void qapi_clone_end(Visitor *v, void **obj) } } =20 -static void qapi_clone_start_list(Visitor *v, const char *name, +static bool qapi_clone_start_list(Visitor *v, const char *name, GenericList **listp, size_t size, Error **errp) { - qapi_clone_start_struct(v, name, (void **)listp, size, errp); + return qapi_clone_start_struct(v, name, (void **)listp, size, errp); } =20 static GenericList *qapi_clone_next_list(Visitor *v, GenericList *tail, @@ -69,45 +70,48 @@ static GenericList *qapi_clone_next_list(Visitor *v, Ge= nericList *tail, return tail->next; } =20 -static void qapi_clone_start_alternate(Visitor *v, const char *name, +static bool qapi_clone_start_alternate(Visitor *v, const char *name, GenericAlternate **obj, size_t size, Error **errp) { - qapi_clone_start_struct(v, name, (void **)obj, size, errp); + return qapi_clone_start_struct(v, name, (void **)obj, size, errp); } =20 -static void qapi_clone_type_int64(Visitor *v, const char *name, int64_t *o= bj, - Error **errp) -{ - QapiCloneVisitor *qcv =3D to_qcv(v); - - assert(qcv->depth); - /* Value was already cloned by g_memdup() */ -} - -static void qapi_clone_type_uint64(Visitor *v, const char *name, - uint64_t *obj, Error **errp) -{ - QapiCloneVisitor *qcv =3D to_qcv(v); - - assert(qcv->depth); - /* Value was already cloned by g_memdup() */ -} - -static void qapi_clone_type_bool(Visitor *v, const char *name, bool *obj, +static bool qapi_clone_type_int64(Visitor *v, const char *name, int64_t *o= bj, Error **errp) { QapiCloneVisitor *qcv =3D to_qcv(v); =20 assert(qcv->depth); /* Value was already cloned by g_memdup() */ + return true; } =20 -static void qapi_clone_type_str(Visitor *v, const char *name, char **obj, +static bool qapi_clone_type_uint64(Visitor *v, const char *name, + uint64_t *obj, Error **errp) +{ + QapiCloneVisitor *qcv =3D to_qcv(v); + + assert(qcv->depth); + /* Value was already cloned by g_memdup() */ + return true; +} + +static bool qapi_clone_type_bool(Visitor *v, const char *name, bool *obj, Error **errp) { QapiCloneVisitor *qcv =3D to_qcv(v); =20 + assert(qcv->depth); + /* Value was already cloned by g_memdup() */ + return true; +} + +static bool qapi_clone_type_str(Visitor *v, const char *name, char **obj, + Error **errp) +{ + QapiCloneVisitor *qcv =3D to_qcv(v); + assert(qcv->depth); /* * Pointer was already cloned by g_memdup; create fresh copy. @@ -117,24 +121,27 @@ static void qapi_clone_type_str(Visitor *v, const cha= r *name, char **obj, * string is intended. */ *obj =3D g_strdup(*obj ?: ""); + return true; } =20 -static void qapi_clone_type_number(Visitor *v, const char *name, double *o= bj, - Error **errp) +static bool qapi_clone_type_number(Visitor *v, const char *name, double *o= bj, + Error **errp) { QapiCloneVisitor *qcv =3D to_qcv(v); =20 assert(qcv->depth); /* Value was already cloned by g_memdup() */ + return true; } =20 -static void qapi_clone_type_null(Visitor *v, const char *name, QNull **obj, +static bool qapi_clone_type_null(Visitor *v, const char *name, QNull **obj, Error **errp) { QapiCloneVisitor *qcv =3D to_qcv(v); =20 assert(qcv->depth); *obj =3D qnull(); + return true; } =20 static void qapi_clone_free(Visitor *v) @@ -167,7 +174,7 @@ static Visitor *qapi_clone_visitor_new(void) return &v->visitor; } =20 -void *qapi_clone(const void *src, void (*visit_type)(Visitor *, const char= *, +void *qapi_clone(const void *src, bool (*visit_type)(Visitor *, const char= *, void **, Error **)) { Visitor *v; @@ -184,7 +191,7 @@ void *qapi_clone(const void *src, void (*visit_type)(Vi= sitor *, const char *, } =20 void qapi_clone_members(void *dst, const void *src, size_t sz, - void (*visit_type_members)(Visitor *, void *, + bool (*visit_type_members)(Visitor *, void *, Error **)) { Visitor *v; diff --git a/qapi/qapi-dealloc-visitor.c b/qapi/qapi-dealloc-visitor.c index 2239fc6417..ef283f2966 100644 --- a/qapi/qapi-dealloc-visitor.c +++ b/qapi/qapi-dealloc-visitor.c @@ -22,9 +22,10 @@ struct QapiDeallocVisitor Visitor visitor; }; =20 -static void qapi_dealloc_start_struct(Visitor *v, const char *name, void *= *obj, +static bool qapi_dealloc_start_struct(Visitor *v, const char *name, void *= *obj, size_t unused, Error **errp) { + return true; } =20 static void qapi_dealloc_end_struct(Visitor *v, void **obj) @@ -41,10 +42,11 @@ static void qapi_dealloc_end_alternate(Visitor *v, void= **obj) } } =20 -static void qapi_dealloc_start_list(Visitor *v, const char *name, +static bool qapi_dealloc_start_list(Visitor *v, const char *name, GenericList **list, size_t size, Error **errp) { + return true; } =20 static GenericList *qapi_dealloc_next_list(Visitor *v, GenericList *tail, @@ -59,48 +61,55 @@ static void qapi_dealloc_end_list(Visitor *v, void **ob= j) { } =20 -static void qapi_dealloc_type_str(Visitor *v, const char *name, char **obj, +static bool qapi_dealloc_type_str(Visitor *v, const char *name, char **obj, Error **errp) { if (obj) { g_free(*obj); } + return true; } =20 -static void qapi_dealloc_type_int64(Visitor *v, const char *name, int64_t = *obj, +static bool qapi_dealloc_type_int64(Visitor *v, const char *name, int64_t = *obj, Error **errp) { + return true; } =20 -static void qapi_dealloc_type_uint64(Visitor *v, const char *name, +static bool qapi_dealloc_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp) { + return true; } =20 -static void qapi_dealloc_type_bool(Visitor *v, const char *name, bool *obj, +static bool qapi_dealloc_type_bool(Visitor *v, const char *name, bool *obj, Error **errp) { + return true; } =20 -static void qapi_dealloc_type_number(Visitor *v, const char *name, double = *obj, +static bool qapi_dealloc_type_number(Visitor *v, const char *name, double = *obj, Error **errp) { + return true; } =20 -static void qapi_dealloc_type_anything(Visitor *v, const char *name, +static bool qapi_dealloc_type_anything(Visitor *v, const char *name, QObject **obj, Error **errp) { if (obj) { qobject_unref(*obj); } + return true; } =20 -static void qapi_dealloc_type_null(Visitor *v, const char *name, +static bool qapi_dealloc_type_null(Visitor *v, const char *name, QNull **obj, Error **errp) { if (obj) { qobject_unref(*obj); } + return true; } =20 static void qapi_dealloc_free(Visitor *v) diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c index 74aa9c04bd..5a9c47aabf 100644 --- a/qapi/qapi-visit-core.c +++ b/qapi/qapi-visit-core.c @@ -36,7 +36,7 @@ void visit_free(Visitor *v) } } =20 -void visit_start_struct(Visitor *v, const char *name, void **obj, +bool visit_start_struct(Visitor *v, const char *name, void **obj, size_t size, Error **errp) { Error *err =3D NULL; @@ -51,14 +51,13 @@ void visit_start_struct(Visitor *v, const char *name, v= oid **obj, assert(!err !=3D !*obj); } error_propagate(errp, err); + return !err; } =20 -void visit_check_struct(Visitor *v, Error **errp) +bool visit_check_struct(Visitor *v, Error **errp) { trace_visit_check_struct(v); - if (v->check_struct) { - v->check_struct(v, errp); - } + return v->check_struct ? v->check_struct(v, errp) : true; } =20 void visit_end_struct(Visitor *v, void **obj) @@ -67,7 +66,7 @@ void visit_end_struct(Visitor *v, void **obj) v->end_struct(v, obj); } =20 -void visit_start_list(Visitor *v, const char *name, GenericList **list, +bool visit_start_list(Visitor *v, const char *name, GenericList **list, size_t size, Error **errp) { Error *err =3D NULL; @@ -79,6 +78,7 @@ void visit_start_list(Visitor *v, const char *name, Gener= icList **list, assert(!(err && *list)); } error_propagate(errp, err); + return !err; } =20 GenericList *visit_next_list(Visitor *v, GenericList *tail, size_t size) @@ -88,12 +88,10 @@ GenericList *visit_next_list(Visitor *v, GenericList *t= ail, size_t size) return v->next_list(v, tail, size); } =20 -void visit_check_list(Visitor *v, Error **errp) +bool visit_check_list(Visitor *v, Error **errp) { trace_visit_check_list(v); - if (v->check_list) { - v->check_list(v, errp); - } + return v->check_list ? v->check_list(v, errp) : true; } =20 void visit_end_list(Visitor *v, void **obj) @@ -102,7 +100,7 @@ void visit_end_list(Visitor *v, void **obj) v->end_list(v, obj); } =20 -void visit_start_alternate(Visitor *v, const char *name, +bool visit_start_alternate(Visitor *v, const char *name, GenericAlternate **obj, size_t size, Error **errp) { @@ -118,6 +116,7 @@ void visit_start_alternate(Visitor *v, const char *name, assert(v->start_alternate && !err !=3D !*obj); } error_propagate(errp, err); + return !err; } =20 void visit_end_alternate(Visitor *v, void **obj) @@ -147,155 +146,168 @@ bool visit_is_dealloc(Visitor *v) return v->type =3D=3D VISITOR_DEALLOC; } =20 -void visit_type_int(Visitor *v, const char *name, int64_t *obj, Error **er= rp) +bool visit_type_int(Visitor *v, const char *name, int64_t *obj, Error **er= rp) { assert(obj); trace_visit_type_int(v, name, obj); - v->type_int64(v, name, obj, errp); + return v->type_int64(v, name, obj, errp); } =20 -static void visit_type_uintN(Visitor *v, uint64_t *obj, const char *name, +static bool visit_type_uintN(Visitor *v, uint64_t *obj, const char *name, uint64_t max, const char *type, Error **errp) { - Error *err =3D NULL; uint64_t value =3D *obj; =20 assert(v->type =3D=3D VISITOR_INPUT || value <=3D max); =20 - v->type_uint64(v, name, &value, &err); - if (err) { - error_propagate(errp, err); - } else if (value > max) { + if (!v->type_uint64(v, name, &value, errp)) { + return false; + } + if (value > max) { assert(v->type =3D=3D VISITOR_INPUT); error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "null", type); - } else { - *obj =3D value; + return false; } + *obj =3D value; + return true; } =20 -void visit_type_uint8(Visitor *v, const char *name, uint8_t *obj, +bool visit_type_uint8(Visitor *v, const char *name, uint8_t *obj, Error **errp) { uint64_t value; + bool ok; =20 trace_visit_type_uint8(v, name, obj); value =3D *obj; - visit_type_uintN(v, &value, name, UINT8_MAX, "uint8_t", errp); + ok =3D visit_type_uintN(v, &value, name, UINT8_MAX, "uint8_t", errp); *obj =3D value; + return ok; } =20 -void visit_type_uint16(Visitor *v, const char *name, uint16_t *obj, +bool visit_type_uint16(Visitor *v, const char *name, uint16_t *obj, Error **errp) { uint64_t value; + bool ok; =20 trace_visit_type_uint16(v, name, obj); value =3D *obj; - visit_type_uintN(v, &value, name, UINT16_MAX, "uint16_t", errp); + ok =3D visit_type_uintN(v, &value, name, UINT16_MAX, "uint16_t", errp); *obj =3D value; + return ok; } =20 -void visit_type_uint32(Visitor *v, const char *name, uint32_t *obj, +bool visit_type_uint32(Visitor *v, const char *name, uint32_t *obj, Error **errp) { uint64_t value; + bool ok; =20 trace_visit_type_uint32(v, name, obj); value =3D *obj; - visit_type_uintN(v, &value, name, UINT32_MAX, "uint32_t", errp); + ok =3D visit_type_uintN(v, &value, name, UINT32_MAX, "uint32_t", errp); *obj =3D value; + return ok; } =20 -void visit_type_uint64(Visitor *v, const char *name, uint64_t *obj, +bool visit_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp) { assert(obj); trace_visit_type_uint64(v, name, obj); - v->type_uint64(v, name, obj, errp); + return v->type_uint64(v, name, obj, errp); } =20 -static void visit_type_intN(Visitor *v, int64_t *obj, const char *name, +static bool visit_type_intN(Visitor *v, int64_t *obj, const char *name, int64_t min, int64_t max, const char *type, Error **errp) { - Error *err =3D NULL; int64_t value =3D *obj; =20 assert(v->type =3D=3D VISITOR_INPUT || (value >=3D min && value <=3D m= ax)); =20 - v->type_int64(v, name, &value, &err); - if (err) { - error_propagate(errp, err); - } else if (value < min || value > max) { + if (!v->type_int64(v, name, &value, errp)) { + return false; + } + if (value < min || value > max) { assert(v->type =3D=3D VISITOR_INPUT); error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "null", type); - } else { - *obj =3D value; + return false; } + *obj =3D value; + return true; } =20 -void visit_type_int8(Visitor *v, const char *name, int8_t *obj, Error **er= rp) +bool visit_type_int8(Visitor *v, const char *name, int8_t *obj, Error **er= rp) { int64_t value; + bool ok; =20 trace_visit_type_int8(v, name, obj); value =3D *obj; - visit_type_intN(v, &value, name, INT8_MIN, INT8_MAX, "int8_t", errp); + ok =3D visit_type_intN(v, &value, name, INT8_MIN, INT8_MAX, "int8_t", = errp); *obj =3D value; + return ok; } =20 -void visit_type_int16(Visitor *v, const char *name, int16_t *obj, +bool visit_type_int16(Visitor *v, const char *name, int16_t *obj, Error **errp) { int64_t value; + bool ok; =20 trace_visit_type_int16(v, name, obj); value =3D *obj; - visit_type_intN(v, &value, name, INT16_MIN, INT16_MAX, "int16_t", errp= ); + ok =3D visit_type_intN(v, &value, name, INT16_MIN, INT16_MAX, "int16_t= ", + errp); *obj =3D value; + return ok; } =20 -void visit_type_int32(Visitor *v, const char *name, int32_t *obj, +bool visit_type_int32(Visitor *v, const char *name, int32_t *obj, Error **errp) { int64_t value; + bool ok; =20 trace_visit_type_int32(v, name, obj); value =3D *obj; - visit_type_intN(v, &value, name, INT32_MIN, INT32_MAX, "int32_t", errp= ); + ok =3D visit_type_intN(v, &value, name, INT32_MIN, INT32_MAX, "int32_t= ", + errp); *obj =3D value; + return ok; } =20 -void visit_type_int64(Visitor *v, const char *name, int64_t *obj, +bool visit_type_int64(Visitor *v, const char *name, int64_t *obj, Error **errp) { assert(obj); trace_visit_type_int64(v, name, obj); - v->type_int64(v, name, obj, errp); + return v->type_int64(v, name, obj, errp); } =20 -void visit_type_size(Visitor *v, const char *name, uint64_t *obj, +bool visit_type_size(Visitor *v, const char *name, uint64_t *obj, Error **errp) { assert(obj); trace_visit_type_size(v, name, obj); if (v->type_size) { - v->type_size(v, name, obj, errp); - } else { - v->type_uint64(v, name, obj, errp); + return v->type_size(v, name, obj, errp); } + return v->type_uint64(v, name, obj, errp); } =20 -void visit_type_bool(Visitor *v, const char *name, bool *obj, Error **errp) +bool visit_type_bool(Visitor *v, const char *name, bool *obj, Error **errp) { assert(obj); trace_visit_type_bool(v, name, obj); - v->type_bool(v, name, obj, errp); + return v->type_bool(v, name, obj, errp); } =20 -void visit_type_str(Visitor *v, const char *name, char **obj, Error **errp) +bool visit_type_str(Visitor *v, const char *name, char **obj, Error **errp) { Error *err =3D NULL; =20 @@ -310,89 +322,88 @@ void visit_type_str(Visitor *v, const char *name, cha= r **obj, Error **errp) assert(!err !=3D !*obj); } error_propagate(errp, err); + return !err; } =20 -void visit_type_number(Visitor *v, const char *name, double *obj, +bool visit_type_number(Visitor *v, const char *name, double *obj, Error **errp) { assert(obj); trace_visit_type_number(v, name, obj); - v->type_number(v, name, obj, errp); + return v->type_number(v, name, obj, errp); } =20 -void visit_type_any(Visitor *v, const char *name, QObject **obj, Error **e= rrp) +bool visit_type_any(Visitor *v, const char *name, QObject **obj, Error **e= rrp) { - Error *err =3D NULL; + bool ok; =20 assert(obj); assert(v->type !=3D VISITOR_OUTPUT || *obj); trace_visit_type_any(v, name, obj); - v->type_any(v, name, obj, &err); + ok =3D v->type_any(v, name, obj, errp); if (v->type =3D=3D VISITOR_INPUT) { - assert(!err !=3D !*obj); + assert(ok !=3D !*obj); } - error_propagate(errp, err); + return ok; } =20 -void visit_type_null(Visitor *v, const char *name, QNull **obj, +bool visit_type_null(Visitor *v, const char *name, QNull **obj, Error **errp) { trace_visit_type_null(v, name, obj); - v->type_null(v, name, obj, errp); + return v->type_null(v, name, obj, errp); } =20 -static void output_type_enum(Visitor *v, const char *name, int *obj, +static bool output_type_enum(Visitor *v, const char *name, int *obj, const QEnumLookup *lookup, Error **errp) { int value =3D *obj; char *enum_str; =20 enum_str =3D (char *)qapi_enum_lookup(lookup, value); - visit_type_str(v, name, &enum_str, errp); + return visit_type_str(v, name, &enum_str, errp); } =20 -static void input_type_enum(Visitor *v, const char *name, int *obj, +static bool input_type_enum(Visitor *v, const char *name, int *obj, const QEnumLookup *lookup, Error **errp) { - Error *local_err =3D NULL; int64_t value; char *enum_str; =20 - visit_type_str(v, name, &enum_str, &local_err); - if (local_err) { - error_propagate(errp, local_err); - return; + if (!visit_type_str(v, name, &enum_str, errp)) { + return false; } =20 value =3D qapi_enum_parse(lookup, enum_str, -1, NULL); if (value < 0) { error_setg(errp, QERR_INVALID_PARAMETER, enum_str); g_free(enum_str); - return; + return false; } =20 g_free(enum_str); *obj =3D value; + return true; } =20 -void visit_type_enum(Visitor *v, const char *name, int *obj, +bool visit_type_enum(Visitor *v, const char *name, int *obj, const QEnumLookup *lookup, Error **errp) { assert(obj && lookup); trace_visit_type_enum(v, name, obj); switch (v->type) { case VISITOR_INPUT: - input_type_enum(v, name, obj, lookup, errp); - break; + return input_type_enum(v, name, obj, lookup, errp); case VISITOR_OUTPUT: - output_type_enum(v, name, obj, lookup, errp); - break; + return output_type_enum(v, name, obj, lookup, errp); case VISITOR_CLONE: /* nothing further to do, scalar value was already copied by * g_memdup() during visit_start_*() */ - break; + return true; case VISITOR_DEALLOC: /* nothing to deallocate for a scalar */ - break; + return true; + default: + abort(); } } diff --git a/qapi/qobject-input-visitor.c b/qapi/qobject-input-visitor.c index 5ce3ec2e5f..f918a05e5f 100644 --- a/qapi/qobject-input-visitor.c +++ b/qapi/qobject-input-visitor.c @@ -237,7 +237,7 @@ static const QListEntry *qobject_input_push(QObjectInpu= tVisitor *qiv, } =20 =20 -static void qobject_input_check_struct(Visitor *v, Error **errp) +static bool qobject_input_check_struct(Visitor *v, Error **errp) { QObjectInputVisitor *qiv =3D to_qiv(v); StackObject *tos =3D QSLIST_FIRST(&qiv->stack); @@ -250,7 +250,9 @@ static void qobject_input_check_struct(Visitor *v, Erro= r **errp) if (g_hash_table_iter_next(&iter, (void **)&key, NULL)) { error_setg(errp, "Parameter '%s' is unexpected", full_name(qiv, key)); + return false; } + return true; } =20 static void qobject_input_stack_object_free(StackObject *tos) @@ -272,7 +274,7 @@ static void qobject_input_pop(Visitor *v, void **obj) qobject_input_stack_object_free(tos); } =20 -static void qobject_input_start_struct(Visitor *v, const char *name, void = **obj, +static bool qobject_input_start_struct(Visitor *v, const char *name, void = **obj, size_t size, Error **errp) { QObjectInputVisitor *qiv =3D to_qiv(v); @@ -282,12 +284,12 @@ static void qobject_input_start_struct(Visitor *v, co= nst char *name, void **obj, *obj =3D NULL; } if (!qobj) { - return; + return false; } if (qobject_type(qobj) !=3D QTYPE_QDICT) { error_setg(errp, QERR_INVALID_PARAMETER_TYPE, full_name(qiv, name), "object"); - return; + return false; } =20 qobject_input_push(qiv, name, qobj, obj); @@ -295,6 +297,7 @@ static void qobject_input_start_struct(Visitor *v, cons= t char *name, void **obj, if (obj) { *obj =3D g_malloc0(size); } + return true; } =20 static void qobject_input_end_struct(Visitor *v, void **obj) @@ -307,7 +310,7 @@ static void qobject_input_end_struct(Visitor *v, void *= *obj) } =20 =20 -static void qobject_input_start_list(Visitor *v, const char *name, +static bool qobject_input_start_list(Visitor *v, const char *name, GenericList **list, size_t size, Error **errp) { @@ -319,18 +322,19 @@ static void qobject_input_start_list(Visitor *v, cons= t char *name, *list =3D NULL; } if (!qobj) { - return; + return false; } if (qobject_type(qobj) !=3D QTYPE_QLIST) { error_setg(errp, QERR_INVALID_PARAMETER_TYPE, full_name(qiv, name), "array"); - return; + return false; } =20 entry =3D qobject_input_push(qiv, name, qobj, list); if (entry && list) { *list =3D g_malloc0(size); } + return true; } =20 static GenericList *qobject_input_next_list(Visitor *v, GenericList *tail, @@ -348,7 +352,7 @@ static GenericList *qobject_input_next_list(Visitor *v,= GenericList *tail, return tail->next; } =20 -static void qobject_input_check_list(Visitor *v, Error **errp) +static bool qobject_input_check_list(Visitor *v, Error **errp) { QObjectInputVisitor *qiv =3D to_qiv(v); StackObject *tos =3D QSLIST_FIRST(&qiv->stack); @@ -358,7 +362,9 @@ static void qobject_input_check_list(Visitor *v, Error = **errp) if (tos->entry) { error_setg(errp, "Only %u list elements expected in %s", tos->index + 1, full_name_nth(qiv, NULL, 1)); + return false; } + return true; } =20 static void qobject_input_end_list(Visitor *v, void **obj) @@ -370,7 +376,7 @@ static void qobject_input_end_list(Visitor *v, void **o= bj) qobject_input_pop(v, obj); } =20 -static void qobject_input_start_alternate(Visitor *v, const char *name, +static bool qobject_input_start_alternate(Visitor *v, const char *name, GenericAlternate **obj, size_t s= ize, Error **errp) { @@ -379,13 +385,14 @@ static void qobject_input_start_alternate(Visitor *v,= const char *name, =20 if (!qobj) { *obj =3D NULL; - return; + return false; } *obj =3D g_malloc0(size); (*obj)->type =3D qobject_type(qobj); + return true; } =20 -static void qobject_input_type_int64(Visitor *v, const char *name, int64_t= *obj, +static bool qobject_input_type_int64(Visitor *v, const char *name, int64_t= *obj, Error **errp) { QObjectInputVisitor *qiv =3D to_qiv(v); @@ -393,33 +400,37 @@ static void qobject_input_type_int64(Visitor *v, cons= t char *name, int64_t *obj, QNum *qnum; =20 if (!qobj) { - return; + return false; } qnum =3D qobject_to(QNum, qobj); if (!qnum || !qnum_get_try_int(qnum, obj)) { error_setg(errp, QERR_INVALID_PARAMETER_TYPE, full_name(qiv, name), "integer"); + return false; } + return true; } =20 -static void qobject_input_type_int64_keyval(Visitor *v, const char *name, +static bool qobject_input_type_int64_keyval(Visitor *v, const char *name, int64_t *obj, Error **errp) { QObjectInputVisitor *qiv =3D to_qiv(v); const char *str =3D qobject_input_get_keyval(qiv, name, errp); =20 if (!str) { - return; + return false; } =20 if (qemu_strtoi64(str, NULL, 0, obj) < 0) { /* TODO report -ERANGE more nicely */ error_setg(errp, QERR_INVALID_PARAMETER_VALUE, full_name(qiv, name), "integer"); + return false; } + return true; } =20 -static void qobject_input_type_uint64(Visitor *v, const char *name, +static bool qobject_input_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp) { QObjectInputVisitor *qiv =3D to_qiv(v); @@ -428,7 +439,7 @@ static void qobject_input_type_uint64(Visitor *v, const= char *name, int64_t val; =20 if (!qobj) { - return; + return false; } qnum =3D qobject_to(QNum, qobj); if (!qnum) { @@ -436,38 +447,41 @@ static void qobject_input_type_uint64(Visitor *v, con= st char *name, } =20 if (qnum_get_try_uint(qnum, obj)) { - return; + return true; } =20 /* Need to accept negative values for backward compatibility */ if (qnum_get_try_int(qnum, &val)) { *obj =3D val; - return; + return true; } =20 err: error_setg(errp, QERR_INVALID_PARAMETER_VALUE, full_name(qiv, name), "uint64"); + return false; } =20 -static void qobject_input_type_uint64_keyval(Visitor *v, const char *name, +static bool qobject_input_type_uint64_keyval(Visitor *v, const char *name, uint64_t *obj, Error **errp) { QObjectInputVisitor *qiv =3D to_qiv(v); const char *str =3D qobject_input_get_keyval(qiv, name, errp); =20 if (!str) { - return; + return false; } =20 if (qemu_strtou64(str, NULL, 0, obj) < 0) { /* TODO report -ERANGE more nicely */ error_setg(errp, QERR_INVALID_PARAMETER_VALUE, full_name(qiv, name), "integer"); + return false; } + return true; } =20 -static void qobject_input_type_bool(Visitor *v, const char *name, bool *ob= j, +static bool qobject_input_type_bool(Visitor *v, const char *name, bool *ob= j, Error **errp) { QObjectInputVisitor *qiv =3D to_qiv(v); @@ -475,26 +489,27 @@ static void qobject_input_type_bool(Visitor *v, const= char *name, bool *obj, QBool *qbool; =20 if (!qobj) { - return; + return false; } qbool =3D qobject_to(QBool, qobj); if (!qbool) { error_setg(errp, QERR_INVALID_PARAMETER_TYPE, full_name(qiv, name), "boolean"); - return; + return false; } =20 *obj =3D qbool_get_bool(qbool); + return true; } =20 -static void qobject_input_type_bool_keyval(Visitor *v, const char *name, +static bool qobject_input_type_bool_keyval(Visitor *v, const char *name, bool *obj, Error **errp) { QObjectInputVisitor *qiv =3D to_qiv(v); const char *str =3D qobject_input_get_keyval(qiv, name, errp); =20 if (!str) { - return; + return false; } =20 if (!strcmp(str, "on")) { @@ -504,10 +519,12 @@ static void qobject_input_type_bool_keyval(Visitor *v= , const char *name, } else { error_setg(errp, QERR_INVALID_PARAMETER_VALUE, full_name(qiv, name), "'on' or 'off'"); + return false; } + return true; } =20 -static void qobject_input_type_str(Visitor *v, const char *name, char **ob= j, +static bool qobject_input_type_str(Visitor *v, const char *name, char **ob= j, Error **errp) { QObjectInputVisitor *qiv =3D to_qiv(v); @@ -516,28 +533,30 @@ static void qobject_input_type_str(Visitor *v, const = char *name, char **obj, =20 *obj =3D NULL; if (!qobj) { - return; + return false; } qstr =3D qobject_to(QString, qobj); if (!qstr) { error_setg(errp, QERR_INVALID_PARAMETER_TYPE, full_name(qiv, name), "string"); - return; + return false; } =20 *obj =3D g_strdup(qstring_get_str(qstr)); + return true; } =20 -static void qobject_input_type_str_keyval(Visitor *v, const char *name, +static bool qobject_input_type_str_keyval(Visitor *v, const char *name, char **obj, Error **errp) { QObjectInputVisitor *qiv =3D to_qiv(v); const char *str =3D qobject_input_get_keyval(qiv, name, errp); =20 *obj =3D g_strdup(str); + return !!str; } =20 -static void qobject_input_type_number(Visitor *v, const char *name, double= *obj, +static bool qobject_input_type_number(Visitor *v, const char *name, double= *obj, Error **errp) { QObjectInputVisitor *qiv =3D to_qiv(v); @@ -545,19 +564,20 @@ static void qobject_input_type_number(Visitor *v, con= st char *name, double *obj, QNum *qnum; =20 if (!qobj) { - return; + return false; } qnum =3D qobject_to(QNum, qobj); if (!qnum) { error_setg(errp, QERR_INVALID_PARAMETER_TYPE, full_name(qiv, name), "number"); - return; + return false; } =20 *obj =3D qnum_get_double(qnum); + return true; } =20 -static void qobject_input_type_number_keyval(Visitor *v, const char *name, +static bool qobject_input_type_number_keyval(Visitor *v, const char *name, double *obj, Error **errp) { QObjectInputVisitor *qiv =3D to_qiv(v); @@ -565,20 +585,21 @@ static void qobject_input_type_number_keyval(Visitor = *v, const char *name, double val; =20 if (!str) { - return; + return false; } =20 if (qemu_strtod_finite(str, NULL, &val)) { /* TODO report -ERANGE more nicely */ error_setg(errp, QERR_INVALID_PARAMETER_TYPE, full_name(qiv, name), "number"); - return; + return false; } =20 *obj =3D val; + return true; } =20 -static void qobject_input_type_any(Visitor *v, const char *name, QObject *= *obj, +static bool qobject_input_type_any(Visitor *v, const char *name, QObject *= *obj, Error **errp) { QObjectInputVisitor *qiv =3D to_qiv(v); @@ -586,13 +607,14 @@ static void qobject_input_type_any(Visitor *v, const = char *name, QObject **obj, =20 *obj =3D NULL; if (!qobj) { - return; + return false; } =20 *obj =3D qobject_ref(qobj); + return true; } =20 -static void qobject_input_type_null(Visitor *v, const char *name, +static bool qobject_input_type_null(Visitor *v, const char *name, QNull **obj, Error **errp) { QObjectInputVisitor *qiv =3D to_qiv(v); @@ -600,32 +622,35 @@ static void qobject_input_type_null(Visitor *v, const= char *name, =20 *obj =3D NULL; if (!qobj) { - return; + return false; } =20 if (qobject_type(qobj) !=3D QTYPE_QNULL) { error_setg(errp, QERR_INVALID_PARAMETER_TYPE, full_name(qiv, name), "null"); - return; + return false; } *obj =3D qnull(); + return true; } =20 -static void qobject_input_type_size_keyval(Visitor *v, const char *name, +static bool qobject_input_type_size_keyval(Visitor *v, const char *name, uint64_t *obj, Error **errp) { QObjectInputVisitor *qiv =3D to_qiv(v); const char *str =3D qobject_input_get_keyval(qiv, name, errp); =20 if (!str) { - return; + return false; } =20 if (qemu_strtosz(str, NULL, obj) < 0) { /* TODO report -ERANGE more nicely */ error_setg(errp, QERR_INVALID_PARAMETER_VALUE, full_name(qiv, name), "size"); + return false; } + return true; } =20 static void qobject_input_optional(Visitor *v, const char *name, bool *pre= sent) diff --git a/qapi/qobject-output-visitor.c b/qapi/qobject-output-visitor.c index 26d7be5ec9..ba6f6ac8a7 100644 --- a/qapi/qobject-output-visitor.c +++ b/qapi/qobject-output-visitor.c @@ -103,7 +103,7 @@ static void qobject_output_add_obj(QObjectOutputVisitor= *qov, const char *name, } } =20 -static void qobject_output_start_struct(Visitor *v, const char *name, +static bool qobject_output_start_struct(Visitor *v, const char *name, void **obj, size_t unused, Error *= *errp) { QObjectOutputVisitor *qov =3D to_qov(v); @@ -111,6 +111,7 @@ static void qobject_output_start_struct(Visitor *v, con= st char *name, =20 qobject_output_add(qov, name, dict); qobject_output_push(qov, dict, obj); + return true; } =20 static void qobject_output_end_struct(Visitor *v, void **obj) @@ -120,7 +121,7 @@ static void qobject_output_end_struct(Visitor *v, void = **obj) assert(qobject_type(value) =3D=3D QTYPE_QDICT); } =20 -static void qobject_output_start_list(Visitor *v, const char *name, +static bool qobject_output_start_list(Visitor *v, const char *name, GenericList **listp, size_t size, Error **errp) { @@ -129,6 +130,7 @@ static void qobject_output_start_list(Visitor *v, const= char *name, =20 qobject_output_add(qov, name, list); qobject_output_push(qov, list, listp); + return true; } =20 static GenericList *qobject_output_next_list(Visitor *v, GenericList *tail, @@ -144,28 +146,31 @@ static void qobject_output_end_list(Visitor *v, void = **obj) assert(qobject_type(value) =3D=3D QTYPE_QLIST); } =20 -static void qobject_output_type_int64(Visitor *v, const char *name, +static bool qobject_output_type_int64(Visitor *v, const char *name, int64_t *obj, Error **errp) { QObjectOutputVisitor *qov =3D to_qov(v); qobject_output_add(qov, name, qnum_from_int(*obj)); + return true; } =20 -static void qobject_output_type_uint64(Visitor *v, const char *name, +static bool qobject_output_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp) { QObjectOutputVisitor *qov =3D to_qov(v); qobject_output_add(qov, name, qnum_from_uint(*obj)); + return true; } =20 -static void qobject_output_type_bool(Visitor *v, const char *name, bool *o= bj, +static bool qobject_output_type_bool(Visitor *v, const char *name, bool *o= bj, Error **errp) { QObjectOutputVisitor *qov =3D to_qov(v); qobject_output_add(qov, name, qbool_from_bool(*obj)); + return true; } =20 -static void qobject_output_type_str(Visitor *v, const char *name, char **o= bj, +static bool qobject_output_type_str(Visitor *v, const char *name, char **o= bj, Error **errp) { QObjectOutputVisitor *qov =3D to_qov(v); @@ -174,28 +179,32 @@ static void qobject_output_type_str(Visitor *v, const= char *name, char **obj, } else { qobject_output_add(qov, name, qstring_from_str("")); } + return true; } =20 -static void qobject_output_type_number(Visitor *v, const char *name, +static bool qobject_output_type_number(Visitor *v, const char *name, double *obj, Error **errp) { QObjectOutputVisitor *qov =3D to_qov(v); qobject_output_add(qov, name, qnum_from_double(*obj)); + return true; } =20 -static void qobject_output_type_any(Visitor *v, const char *name, +static bool qobject_output_type_any(Visitor *v, const char *name, QObject **obj, Error **errp) { QObjectOutputVisitor *qov =3D to_qov(v); =20 qobject_output_add_obj(qov, name, qobject_ref(*obj)); + return true; } =20 -static void qobject_output_type_null(Visitor *v, const char *name, +static bool qobject_output_type_null(Visitor *v, const char *name, QNull **obj, Error **errp) { QObjectOutputVisitor *qov =3D to_qov(v); qobject_output_add(qov, name, qnull()); + return true; } =20 /* Finish building, and return the root object. diff --git a/qapi/string-input-visitor.c b/qapi/string-input-visitor.c index 730fa4630d..d0ca10aefa 100644 --- a/qapi/string-input-visitor.c +++ b/qapi/string-input-visitor.c @@ -60,7 +60,7 @@ static StringInputVisitor *to_siv(Visitor *v) return container_of(v, StringInputVisitor, visitor); } =20 -static void start_list(Visitor *v, const char *name, GenericList **list, +static bool start_list(Visitor *v, const char *name, GenericList **list, size_t size, Error **errp) { StringInputVisitor *siv =3D to_siv(v); @@ -80,6 +80,7 @@ static void start_list(Visitor *v, const char *name, Gene= ricList **list, } siv->lm =3D LM_UNPARSED; } + return true; } =20 static GenericList *next_list(Visitor *v, GenericList *tail, size_t size) @@ -102,7 +103,7 @@ static GenericList *next_list(Visitor *v, GenericList *= tail, size_t size) return tail->next; } =20 -static void check_list(Visitor *v, Error **errp) +static bool check_list(Visitor *v, Error **errp) { const StringInputVisitor *siv =3D to_siv(v); =20 @@ -111,9 +112,9 @@ static void check_list(Visitor *v, Error **errp) case LM_UINT64_RANGE: case LM_UNPARSED: error_setg(errp, "Fewer list elements expected"); - return; + return false; case LM_END: - return; + return true; default: abort(); } @@ -178,7 +179,7 @@ static int try_parse_int64_list_entry(StringInputVisito= r *siv, int64_t *obj) return 0; } =20 -static void parse_type_int64(Visitor *v, const char *name, int64_t *obj, +static bool parse_type_int64(Visitor *v, const char *name, int64_t *obj, Error **errp) { StringInputVisitor *siv =3D to_siv(v); @@ -188,17 +189,17 @@ static void parse_type_int64(Visitor *v, const char *= name, int64_t *obj, case LM_NONE: /* just parse a simple int64, bail out if not completely consumed = */ if (qemu_strtoi64(siv->string, NULL, 0, &val)) { - error_setg(errp, QERR_INVALID_PARAMETER_VALUE, - name ? name : "null", "int64"); - return; + error_setg(errp, QERR_INVALID_PARAMETER_VALUE, + name ? name : "null", "int64"); + return false; } *obj =3D val; - return; + return true; case LM_UNPARSED: if (try_parse_int64_list_entry(siv, obj)) { error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "= null", "list of int64 values or ranges"); - return; + return false; } assert(siv->lm =3D=3D LM_INT64_RANGE); /* fall through */ @@ -211,10 +212,10 @@ static void parse_type_int64(Visitor *v, const char *= name, int64_t *obj, /* end of range, check if there is more to parse */ siv->lm =3D siv->unparsed_string[0] ? LM_UNPARSED : LM_END; } - return; + return true; case LM_END: error_setg(errp, "Fewer list elements expected"); - return; + return false; default: abort(); } @@ -268,7 +269,7 @@ static int try_parse_uint64_list_entry(StringInputVisit= or *siv, uint64_t *obj) return 0; } =20 -static void parse_type_uint64(Visitor *v, const char *name, uint64_t *obj, +static bool parse_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp) { StringInputVisitor *siv =3D to_siv(v); @@ -280,15 +281,15 @@ static void parse_type_uint64(Visitor *v, const char = *name, uint64_t *obj, if (qemu_strtou64(siv->string, NULL, 0, &val)) { error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "= null", "uint64"); - return; + return false; } *obj =3D val; - return; + return true; case LM_UNPARSED: if (try_parse_uint64_list_entry(siv, obj)) { error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "= null", "list of uint64 values or ranges"); - return; + return false; } assert(siv->lm =3D=3D LM_UINT64_RANGE); /* fall through */ @@ -301,16 +302,16 @@ static void parse_type_uint64(Visitor *v, const char = *name, uint64_t *obj, /* end of range, check if there is more to parse */ siv->lm =3D siv->unparsed_string[0] ? LM_UNPARSED : LM_END; } - return; + return true; case LM_END: error_setg(errp, "Fewer list elements expected"); - return; + return false; default: abort(); } } =20 -static void parse_type_size(Visitor *v, const char *name, uint64_t *obj, +static bool parse_type_size(Visitor *v, const char *name, uint64_t *obj, Error **errp) { StringInputVisitor *siv =3D to_siv(v); @@ -320,13 +321,14 @@ static void parse_type_size(Visitor *v, const char *n= ame, uint64_t *obj, assert(siv->lm =3D=3D LM_NONE); if (!parse_option_size(name, siv->string, &val, &err)) { error_propagate(errp, err); - return; + return false; } =20 *obj =3D val; + return true; } =20 -static void parse_type_bool(Visitor *v, const char *name, bool *obj, +static bool parse_type_bool(Visitor *v, const char *name, bool *obj, Error **errp) { StringInputVisitor *siv =3D to_siv(v); @@ -336,29 +338,31 @@ static void parse_type_bool(Visitor *v, const char *n= ame, bool *obj, !strcasecmp(siv->string, "yes") || !strcasecmp(siv->string, "true")) { *obj =3D true; - return; + return true; } if (!strcasecmp(siv->string, "off") || !strcasecmp(siv->string, "no") || !strcasecmp(siv->string, "false")) { *obj =3D false; - return; + return true; } =20 error_setg(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null", "boolean"); + return false; } =20 -static void parse_type_str(Visitor *v, const char *name, char **obj, +static bool parse_type_str(Visitor *v, const char *name, char **obj, Error **errp) { StringInputVisitor *siv =3D to_siv(v); =20 assert(siv->lm =3D=3D LM_NONE); *obj =3D g_strdup(siv->string); + return true; } =20 -static void parse_type_number(Visitor *v, const char *name, double *obj, +static bool parse_type_number(Visitor *v, const char *name, double *obj, Error **errp) { StringInputVisitor *siv =3D to_siv(v); @@ -368,13 +372,14 @@ static void parse_type_number(Visitor *v, const char = *name, double *obj, if (qemu_strtod_finite(siv->string, NULL, &val)) { error_setg(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null", "number"); - return; + return false; } =20 *obj =3D val; + return true; } =20 -static void parse_type_null(Visitor *v, const char *name, QNull **obj, +static bool parse_type_null(Visitor *v, const char *name, QNull **obj, Error **errp) { StringInputVisitor *siv =3D to_siv(v); @@ -385,10 +390,11 @@ static void parse_type_null(Visitor *v, const char *n= ame, QNull **obj, if (siv->string[0]) { error_setg(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null", "null"); - return; + return false; } =20 *obj =3D qnull(); + return true; } =20 static void string_input_free(Visitor *v) diff --git a/qapi/string-output-visitor.c b/qapi/string-output-visitor.c index 0d93605d77..b74aa4d44c 100644 --- a/qapi/string-output-visitor.c +++ b/qapi/string-output-visitor.c @@ -123,7 +123,7 @@ static void format_string(StringOutputVisitor *sov, Ran= ge *r, bool next, } } =20 -static void print_type_int64(Visitor *v, const char *name, int64_t *obj, +static bool print_type_int64(Visitor *v, const char *name, int64_t *obj, Error **errp) { StringOutputVisitor *sov =3D to_sov(v); @@ -138,7 +138,7 @@ static void print_type_int64(Visitor *v, const char *na= me, int64_t *obj, sov->range_start.s =3D *obj; sov->range_end.s =3D *obj; sov->list_mode =3D LM_IN_PROGRESS; - return; + return true; =20 case LM_IN_PROGRESS: if (sov->range_end.s + 1 =3D=3D *obj) { @@ -155,7 +155,7 @@ static void print_type_int64(Visitor *v, const char *na= me, int64_t *obj, sov->range_start.s =3D *obj; sov->range_end.s =3D *obj; } - return; + return true; =20 case LM_END: if (sov->range_end.s + 1 =3D=3D *obj) { @@ -197,17 +197,19 @@ static void print_type_int64(Visitor *v, const char *= name, int64_t *obj, } g_string_append(sov->string, ")"); } + + return true; } =20 -static void print_type_uint64(Visitor *v, const char *name, uint64_t *obj, +static bool print_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp) { /* FIXME: print_type_int64 mishandles values over INT64_MAX */ int64_t i =3D *obj; - print_type_int64(v, name, &i, errp); + return print_type_int64(v, name, &i, errp); } =20 -static void print_type_size(Visitor *v, const char *name, uint64_t *obj, +static bool print_type_size(Visitor *v, const char *name, uint64_t *obj, Error **errp) { StringOutputVisitor *sov =3D to_sov(v); @@ -217,7 +219,7 @@ static void print_type_size(Visitor *v, const char *nam= e, uint64_t *obj, if (!sov->human) { out =3D g_strdup_printf("%"PRIu64, *obj); string_output_set(sov, out); - return; + return true; } =20 val =3D *obj; @@ -226,16 +228,18 @@ static void print_type_size(Visitor *v, const char *n= ame, uint64_t *obj, string_output_set(sov, out); =20 g_free(psize); + return true; } =20 -static void print_type_bool(Visitor *v, const char *name, bool *obj, +static bool print_type_bool(Visitor *v, const char *name, bool *obj, Error **errp) { StringOutputVisitor *sov =3D to_sov(v); string_output_set(sov, g_strdup(*obj ? "true" : "false")); + return true; } =20 -static void print_type_str(Visitor *v, const char *name, char **obj, +static bool print_type_str(Visitor *v, const char *name, char **obj, Error **errp) { StringOutputVisitor *sov =3D to_sov(v); @@ -247,16 +251,18 @@ static void print_type_str(Visitor *v, const char *na= me, char **obj, out =3D g_strdup(*obj ? *obj : ""); } string_output_set(sov, out); + return true; } =20 -static void print_type_number(Visitor *v, const char *name, double *obj, +static bool print_type_number(Visitor *v, const char *name, double *obj, Error **errp) { StringOutputVisitor *sov =3D to_sov(v); string_output_set(sov, g_strdup_printf("%f", *obj)); + return true; } =20 -static void print_type_null(Visitor *v, const char *name, QNull **obj, +static bool print_type_null(Visitor *v, const char *name, QNull **obj, Error **errp) { StringOutputVisitor *sov =3D to_sov(v); @@ -268,9 +274,10 @@ static void print_type_null(Visitor *v, const char *na= me, QNull **obj, out =3D g_strdup(""); } string_output_set(sov, out); + return true; } =20 -static void +static bool start_list(Visitor *v, const char *name, GenericList **list, size_t size, Error **errp) { @@ -285,6 +292,7 @@ start_list(Visitor *v, const char *name, GenericList **= list, size_t size, if (*list && (*list)->next) { sov->list_mode =3D LM_STARTED; } + return true; } =20 static GenericList *next_list(Visitor *v, GenericList *tail, size_t size) diff --git a/scripts/qapi/visit.py b/scripts/qapi/visit.py index d5d7a1031f..ba0cf0b074 100644 --- a/scripts/qapi/visit.py +++ b/scripts/qapi/visit.py @@ -23,7 +23,7 @@ def gen_visit_decl(name, scalar=3DFalse): if not scalar: c_type +=3D '*' return mcgen(''' -void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_type)sobj, Er= ror **errp); +bool visit_type_%(c_name)s(Visitor *v, const char *name, %(c_type)sobj, Er= ror **errp); ''', c_name=3Dc_name(name), c_type=3Dc_type) =20 @@ -31,7 +31,7 @@ void visit_type_%(c_name)s(Visitor *v, const char *name, = %(c_type)sobj, Error ** def gen_visit_members_decl(name): return mcgen(''' =20 -void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **er= rp); +bool visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **er= rp); ''', c_name=3Dc_name(name)) =20 @@ -39,7 +39,7 @@ void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s= *obj, Error **errp); def gen_visit_object_members(name, base, members, variants): ret =3D mcgen(''' =20 -void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **er= rp) +bool visit_type_%(c_name)s_members(Visitor *v, %(c_name)s *obj, Error **er= rp) { Error *err =3D NULL; =20 @@ -48,9 +48,8 @@ void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s= *obj, Error **errp) =20 if base: ret +=3D mcgen(''' - visit_type_%(c_type)s_members(v, (%(c_type)s *)obj, &err); - if (err) { - goto out; + if (!visit_type_%(c_type)s_members(v, (%(c_type)s *)obj, errp)) { + return false; } ''', c_type=3Dbase.c_name()) @@ -64,9 +63,8 @@ void visit_type_%(c_name)s_members(Visitor *v, %(c_name)s= *obj, Error **errp) name=3Dmemb.name, c_name=3Dc_name(memb.name)) push_indent() ret +=3D mcgen(''' - visit_type_%(c_type)s(v, "%(name)s", &obj->%(c_name)s, &err); - if (err) { - goto out; + if (!visit_type_%(c_type)s(v, "%(name)s", &obj->%(c_name)s, errp)) { + return false; } ''', c_type=3Dmemb.type.c_name(), name=3Dmemb.name, @@ -112,15 +110,9 @@ void visit_type_%(c_name)s_members(Visitor *v, %(c_nam= e)s *obj, Error **errp) } ''') =20 - # 'goto out' produced for base, for each member, and if variants were - # present - if base or members or variants: - ret +=3D mcgen(''' - -out: -''') ret +=3D mcgen(''' error_propagate(errp, err); + return !err; } ''') return ret @@ -129,15 +121,14 @@ out: def gen_visit_list(name, element_type): return mcgen(''' =20 -void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj,= Error **errp) +bool visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj,= Error **errp) { Error *err =3D NULL; %(c_name)s *tail; size_t size =3D sizeof(**obj); =20 - visit_start_list(v, name, (GenericList **)obj, size, &err); - if (err) { - goto out; + if (!visit_start_list(v, name, (GenericList **)obj, size, errp)) { + return false; } =20 for (tail =3D *obj; tail; @@ -156,8 +147,8 @@ void visit_type_%(c_name)s(Visitor *v, const char *name= , %(c_name)s **obj, Error qapi_free_%(c_name)s(*obj); *obj =3D NULL; } -out: error_propagate(errp, err); + return !err; } ''', c_name=3Dc_name(name), c_elt_type=3Delement_type.c_name()) @@ -166,11 +157,12 @@ out: def gen_visit_enum(name): return mcgen(''' =20 -void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s *obj, = Error **errp) +bool visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s *obj, = Error **errp) { int value =3D *obj; - visit_type_enum(v, name, &value, &%(c_name)s_lookup, errp); + bool ok =3D visit_type_enum(v, name, &value, &%(c_name)s_lookup, errp); *obj =3D value; + return ok; } ''', c_name=3Dc_name(name)) @@ -179,14 +171,13 @@ void visit_type_%(c_name)s(Visitor *v, const char *na= me, %(c_name)s *obj, Error def gen_visit_alternate(name, variants): ret =3D mcgen(''' =20 -void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj,= Error **errp) +bool visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj,= Error **errp) { Error *err =3D NULL; =20 - visit_start_alternate(v, name, (GenericAlternate **)obj, sizeof(**obj), - &err); - if (err) { - goto out; + if (!visit_start_alternate(v, name, (GenericAlternate **)obj, + sizeof(**obj), errp)) { + return false; } if (!*obj) { /* incomplete */ @@ -245,8 +236,8 @@ out_obj: qapi_free_%(c_name)s(*obj); *obj =3D NULL; } -out: error_propagate(errp, err); + return !err; } ''', name=3Dname, c_name=3Dc_name(name)) @@ -257,13 +248,12 @@ out: def gen_visit_object(name, base, members, variants): return mcgen(''' =20 -void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj,= Error **errp) +bool visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj,= Error **errp) { Error *err =3D NULL; =20 - visit_start_struct(v, name, (void **)obj, sizeof(%(c_name)s), &err); - if (err) { - goto out; + if (!visit_start_struct(v, name, (void **)obj, sizeof(%(c_name)s), err= p)) { + return false; } if (!*obj) { /* incomplete */ @@ -281,8 +271,8 @@ out_obj: qapi_free_%(c_name)s(*obj); *obj =3D NULL; } -out: error_propagate(errp, err); + return !err; } ''', c_name=3Dc_name(name)) --=20 2.26.2