[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v2 16/44] qapi: Make visitor functions taking Error ** return
From: |
Markus Armbruster |
Subject: |
Re: [PATCH v2 16/44] qapi: Make visitor functions taking Error ** return bool, not void |
Date: |
Sat, 04 Jul 2020 15:19:02 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) |
Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> writes:
> 02.07.2020 18:49, Markus Armbruster wrote:
>> See recent commit "error: Document Error API usage rules" for
>> rationale.
>>
>> Signed-off-by: Markus Armbruster <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 | 58 +++++++-----
>> qapi/qapi-clone-visitor.c | 67 ++++++++------
>> 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, 452 insertions(+), 355 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"
>> - 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,
>> UserDefOneList **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,
>> UserDefOneList **obj, Error **errp);
>> - void visit_type_q_obj_my_command_arg_members(Visitor *v,
>> q_obj_my_command_arg *obj, Error **errp);
>> + bool visit_type_q_obj_my_command_arg_members(Visitor *v,
>> q_obj_my_command_arg *obj, Error **errp);
>> #endif /* EXAMPLE_QAPI_VISIT_H */
>> $ cat qapi-generated/example-qapi-visit.c
>
> should it be tests/test-qapi-visit.c ? [preexisting, don't care]
No, that one's generated from tests/qapi-schema/qapi-schema-test.json,
while this one is generated from example-schema.json.
>> [Uninteresting stuff omitted...]
>> - void visit_type_UserDefOne_members(Visitor *v, UserDefOne
>> *obj, Error **errp)
>> + bool visit_type_UserDefOne_members(Visitor *v, UserDefOne *obj, Error
>> **errp)
>> {
>> Error *err = NULL;
>> - 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;
>
> Looks weird with redundant err variable.. Still works. I see, after the whole
> series it is handled, so, OK.
Eric spotted this in v1, and asked for an explanation. Perhaps I should
have added a note to my commit message then.
This patch has a narrow scope: it does just enough to make the functions
return bool. The result is a bit weird in places. PATCH 39 will
straighten it out.
We can't drop the @err and error_propagate() here just yet, because the
generator can still generate code that needs it, just not for this
particular input.
>> }
>> - 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 = NULL;
>> - visit_start_struct(v, name, (void **)obj,
>> sizeof(UserDefOne), &err);
>> - if (err) {
>> - goto out;
>
> [..]
>
>> diff --git a/qapi/opts-visitor.c b/qapi/opts-visitor.c
>> index 5fe0276c1c..6d8f4b6928 100644
>> --- a/qapi/opts-visitor.c
>> +++ b/qapi/opts-visitor.c
>> @@ -133,7 +133,7 @@ opts_visitor_insert(GHashTable *unprocessed_opts, const
>> QemuOpt *opt)
>> }
>>
>
> [..]
>
>> @@ -221,7 +224,7 @@ lookup_distinct(const OptsVisitor *ov, const
>> char *name, Error **errp)
>> }
>> -static void
>> +static bool
>> opts_start_list(Visitor *v, const char *name, GenericList **list, size_t
>> size,
>> Error **errp)
>> {
>> @@ -238,6 +241,7 @@ opts_start_list(Visitor *v, const char *name,
>> GenericList **list, size_t size,
>> } else {
>> *list = NULL;
>
> should return false here, as errp is set.
Falcon eyes! I'll fix it.
>> }
>> + return true;
>> }
>> @@ -285,13 +289,14 @@ opts_next_list(Visitor *v, GenericList
>> *tail, size_t size)
>> }
>>
>
> [..]
>
>> diff --git a/qapi/qapi-clone-visitor.c b/qapi/qapi-clone-visitor.c
>> index daab6819b4..5a54bd593f 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);
>> }
>> -static void qapi_clone_start_struct(Visitor *v, const char *name,
>> void **obj,
>> +static bool qapi_clone_start_struct(Visitor *v, const char *name, void
>> **obj,
>> size_t size, Error **errp)
>> {
>> QapiCloneVisitor *qcv = to_qcv(v);
>> @@ -34,11 +34,12 @@ static void qapi_clone_start_struct(Visitor *v, const
>> char *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;
>> }
>> *obj = g_memdup(*obj, size);
>> qcv->depth++;
>> + return true;
>> }
>> static void qapi_clone_end(Visitor *v, void **obj)
>> @@ -51,11 +52,12 @@ static void qapi_clone_end(Visitor *v, void **obj)
>> }
>> }
>> -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 true;
>
> should be return qapi_clone_start_struct(v, name, (void **)listp, size, errp);
You're right.
qapi_clone_start_struct() only ever returns true, but relying on that
would be unclean.
>> }
>> static GenericList *qapi_clone_next_list(Visitor *v, GenericList
>> *tail,
>> @@ -69,45 +71,49 @@ static GenericList *qapi_clone_next_list(Visitor *v,
>> GenericList *tail,
>> return tail->next;
>> }
>> -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 true;
>
> similar here
Right again.
>> }
>> -static void qapi_clone_type_int64(Visitor *v, const char *name,
>> int64_t *obj,
>> - Error **errp)
>> -{
>> - QapiCloneVisitor *qcv = to_qcv(v);
>> -
>> - assert(qcv->depth);
>> - /* Value was already cloned by g_memdup() */
>> -}
>
>
> With three return values fixed:
>
> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Thanks!
- Re: [PATCH v2 19/44] block/parallels: Simplify parallels_open() after previous commit, (continued)
- [PATCH v2 27/44] qom: Make functions taking Error ** return bool, not void, Markus Armbruster, 2020/07/02
- [PATCH v2 10/44] qemu-option: Factor out helper opt_create(), Markus Armbruster, 2020/07/02
- [PATCH v2 42/44] qemu-img: Ignore Error objects where the return value suffices, Markus Armbruster, 2020/07/02
- [PATCH v2 37/44] error: Reduce unnecessary error propagation, Markus Armbruster, 2020/07/02
- [PATCH v2 16/44] qapi: Make visitor functions taking Error ** return bool, not void, Markus Armbruster, 2020/07/02
- [PATCH v2 30/44] qom: Make functions taking Error ** return bool, not 0/-1, Markus Armbruster, 2020/07/02
- [PATCH v2 07/44] qemu-option: Make uses of find_desc_by_name() more similar, Markus Armbruster, 2020/07/02
- [PATCH v2 18/44] qapi: Use returned bool to check for failure, manual part, Markus Armbruster, 2020/07/02
- [PATCH v2 33/44] error: Avoid unnecessary error_propagate() after error_setg(), Markus Armbruster, 2020/07/02
- Re: [PATCH v2 00/44] Less clumsy error checking, Markus Armbruster, 2020/07/02
- [PATCH v2 35/44] error: Eliminate error_propagate() with Coccinelle, part 2, Markus Armbruster, 2020/07/02