From d7bea75d35a44023efc9d481d3a1a2600677b2ef Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Fri, 29 Jan 2016 06:48:38 -0700 Subject: qapi: Avoid use of misnamed DO_UPCAST() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The macro DO_UPCAST() is incorrectly named: it converts from a parent class to a derived class (which is a downcast). Better, and more consistent with some of the other qapi visitors, is to use the container_of() macro through a to_FOO() helper. Names like 'to_ov()' may be a bit short, but for a static helper it doesn't hurt too much, and matches existing practice in files like qmp-input-visitor.c. Our current definition of container_of() is weaker than DO_UPCAST(), in that it does not require the derived class to have Visitor as its first member, but this does not hurt our usage patterns in qapi visitors. Signed-off-by: Eric Blake Reviewed-by: Marc-André Lureau Message-Id: <1454075341-13658-3-git-send-email-eblake@redhat.com> Signed-off-by: Markus Armbruster --- qapi/string-input-visitor.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) (limited to 'qapi/string-input-visitor.c') diff --git a/qapi/string-input-visitor.c b/qapi/string-input-visitor.c index 8c5ff7e1d2..52db4cf32b 100644 --- a/qapi/string-input-visitor.c +++ b/qapi/string-input-visitor.c @@ -33,6 +33,11 @@ struct StringInputVisitor const char *string; }; +static StringInputVisitor *to_siv(Visitor *v) +{ + return container_of(v, StringInputVisitor, visitor); +} + static void free_range(void *range, void *dummy) { g_free(range); @@ -121,7 +126,7 @@ error: static void start_list(Visitor *v, const char *name, Error **errp) { - StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); + StringInputVisitor *siv = to_siv(v); parse_str(siv, errp); @@ -137,7 +142,7 @@ start_list(Visitor *v, const char *name, Error **errp) static GenericList * next_list(Visitor *v, GenericList **list, Error **errp) { - StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); + StringInputVisitor *siv = to_siv(v); GenericList **link; Range *r; @@ -176,14 +181,14 @@ next_list(Visitor *v, GenericList **list, Error **errp) static void end_list(Visitor *v, Error **errp) { - StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); + StringInputVisitor *siv = to_siv(v); siv->head = true; } static void parse_type_int(Visitor *v, int64_t *obj, const char *name, Error **errp) { - StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); + StringInputVisitor *siv = to_siv(v); if (!siv->string) { error_setg(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null", @@ -225,7 +230,7 @@ error: static void parse_type_size(Visitor *v, uint64_t *obj, const char *name, Error **errp) { - StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); + StringInputVisitor *siv = to_siv(v); Error *err = NULL; uint64_t val; @@ -247,7 +252,7 @@ static void parse_type_size(Visitor *v, uint64_t *obj, const char *name, static void parse_type_bool(Visitor *v, bool *obj, const char *name, Error **errp) { - StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); + StringInputVisitor *siv = to_siv(v); if (siv->string) { if (!strcasecmp(siv->string, "on") || @@ -271,7 +276,7 @@ static void parse_type_bool(Visitor *v, bool *obj, const char *name, static void parse_type_str(Visitor *v, char **obj, const char *name, Error **errp) { - StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); + StringInputVisitor *siv = to_siv(v); if (siv->string) { *obj = g_strdup(siv->string); } else { @@ -283,7 +288,7 @@ static void parse_type_str(Visitor *v, char **obj, const char *name, static void parse_type_number(Visitor *v, double *obj, const char *name, Error **errp) { - StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); + StringInputVisitor *siv = to_siv(v); char *endp = (char *) siv->string; double val; @@ -302,7 +307,7 @@ static void parse_type_number(Visitor *v, double *obj, const char *name, static void parse_optional(Visitor *v, bool *present, const char *name) { - StringInputVisitor *siv = DO_UPCAST(StringInputVisitor, visitor, v); + StringInputVisitor *siv = to_siv(v); if (!siv->string) { *present = false; -- cgit 1.4.1 From 4c40314a35816de635e7170eaacdc0c35be83a8a Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Fri, 29 Jan 2016 06:48:49 -0700 Subject: qapi: Prefer type_int64 over type_int in visitors The qapi builtin type 'int' is basically shorthand for the type 'int64'. In fact, since no visitor was providing the optional type_int64() callback, visit_type_int64() was just always falling back to type_int(), cementing the equivalence between the types. However, some visitors are providing a type_uint64() callback. For purposes of code consistency, it is nicer if all visitors use the paired type_int64/type_uint64 names rather than the mismatched type_int/type_uint64. So this patch just renames the signed int callbacks in place, dropping the type_int() callback as redundant, and a later patch will focus on the unsigned int callbacks. Add some FIXMEs to questionable reuse of errp in code touched by the rename, while at it (the reuse works as long as the callbacks don't modify value when setting an error, but it's not a good example to set) - a later patch will then fix those. No change in functionality here, although further cleanups are in the pipeline. Signed-off-by: Eric Blake Message-Id: <1454075341-13658-14-git-send-email-eblake@redhat.com> Signed-off-by: Markus Armbruster --- include/qapi/visitor-impl.h | 6 ++++-- qapi/opts-visitor.c | 4 ++-- qapi/qapi-dealloc-visitor.c | 6 +++--- qapi/qapi-visit-core.c | 36 ++++++++++++++++++++++-------------- qapi/qmp-input-visitor.c | 6 +++--- qapi/qmp-output-visitor.c | 6 +++--- qapi/string-input-visitor.c | 6 +++--- qapi/string-output-visitor.c | 6 +++--- 8 files changed, 43 insertions(+), 33 deletions(-) (limited to 'qapi/string-input-visitor.c') diff --git a/include/qapi/visitor-impl.h b/include/qapi/visitor-impl.h index f314894f30..319efe8af5 100644 --- a/include/qapi/visitor-impl.h +++ b/include/qapi/visitor-impl.h @@ -36,7 +36,10 @@ struct Visitor void (*get_next_type)(Visitor *v, QType *type, bool promote_int, const char *name, Error **errp); - void (*type_int)(Visitor *v, int64_t *obj, const char *name, Error **errp); + /* Must be set. */ + void (*type_int64)(Visitor *v, int64_t *obj, const char *name, + Error **errp); + /* Must be set. */ void (*type_bool)(Visitor *v, bool *obj, const char *name, Error **errp); void (*type_str)(Visitor *v, char **obj, const char *name, Error **errp); void (*type_number)(Visitor *v, double *obj, const char *name, @@ -54,7 +57,6 @@ struct Visitor void (*type_int8)(Visitor *v, int8_t *obj, const char *name, Error **errp); void (*type_int16)(Visitor *v, int16_t *obj, const char *name, Error **errp); void (*type_int32)(Visitor *v, int32_t *obj, const char *name, Error **errp); - void (*type_int64)(Visitor *v, int64_t *obj, const char *name, Error **errp); /* visit_type_size() falls back to (*type_uint64)() if type_size is unset */ void (*type_size)(Visitor *v, uint64_t *obj, const char *name, Error **errp); bool (*start_union)(Visitor *v, bool data_present, Error **errp); diff --git a/qapi/opts-visitor.c b/qapi/opts-visitor.c index 4955ac833f..14db02c923 100644 --- a/qapi/opts-visitor.c +++ b/qapi/opts-visitor.c @@ -361,7 +361,7 @@ opts_type_bool(Visitor *v, bool *obj, const char *name, Error **errp) static void -opts_type_int(Visitor *v, int64_t *obj, const char *name, Error **errp) +opts_type_int64(Visitor *v, int64_t *obj, const char *name, Error **errp) { OptsVisitor *ov = to_ov(v); const QemuOpt *opt; @@ -529,7 +529,7 @@ opts_visitor_new(const QemuOpts *opts) */ ov->visitor.type_enum = &input_type_enum; - ov->visitor.type_int = &opts_type_int; + ov->visitor.type_int64 = &opts_type_int64; ov->visitor.type_uint64 = &opts_type_uint64; ov->visitor.type_size = &opts_type_size; ov->visitor.type_bool = &opts_type_bool; diff --git a/qapi/qapi-dealloc-visitor.c b/qapi/qapi-dealloc-visitor.c index c805a7a87d..07d7337b79 100644 --- a/qapi/qapi-dealloc-visitor.c +++ b/qapi/qapi-dealloc-visitor.c @@ -136,8 +136,8 @@ static void qapi_dealloc_type_str(Visitor *v, char **obj, const char *name, } } -static void qapi_dealloc_type_int(Visitor *v, int64_t *obj, const char *name, - Error **errp) +static void qapi_dealloc_type_int64(Visitor *v, int64_t *obj, const char *name, + Error **errp) { } @@ -215,7 +215,7 @@ QapiDeallocVisitor *qapi_dealloc_visitor_new(void) v->visitor.next_list = qapi_dealloc_next_list; v->visitor.end_list = qapi_dealloc_end_list; v->visitor.type_enum = qapi_dealloc_type_enum; - v->visitor.type_int = qapi_dealloc_type_int; + v->visitor.type_int64 = qapi_dealloc_type_int64; v->visitor.type_bool = qapi_dealloc_type_bool; v->visitor.type_str = qapi_dealloc_type_str; v->visitor.type_number = qapi_dealloc_type_number; diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c index 060316b9b0..2446a1287b 100644 --- a/qapi/qapi-visit-core.c +++ b/qapi/qapi-visit-core.c @@ -92,7 +92,7 @@ void visit_type_enum(Visitor *v, int *obj, const char * const strings[], void visit_type_int(Visitor *v, int64_t *obj, const char *name, Error **errp) { - v->type_int(v, obj, name, errp); + v->type_int64(v, obj, name, errp); } void visit_type_uint8(Visitor *v, uint8_t *obj, const char *name, Error **errp) @@ -103,8 +103,10 @@ void visit_type_uint8(Visitor *v, uint8_t *obj, const char *name, Error **errp) v->type_uint8(v, obj, name, errp); } else { value = *obj; - v->type_int(v, &value, name, errp); + v->type_int64(v, &value, name, errp); if (value < 0 || value > UINT8_MAX) { + /* FIXME questionable reuse of errp if callback changed + value on error */ error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "null", "uint8_t"); return; @@ -121,8 +123,10 @@ void visit_type_uint16(Visitor *v, uint16_t *obj, const char *name, Error **errp v->type_uint16(v, obj, name, errp); } else { value = *obj; - v->type_int(v, &value, name, errp); + v->type_int64(v, &value, name, errp); if (value < 0 || value > UINT16_MAX) { + /* FIXME questionable reuse of errp if callback changed + value on error */ error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "null", "uint16_t"); return; @@ -139,8 +143,10 @@ void visit_type_uint32(Visitor *v, uint32_t *obj, const char *name, Error **errp v->type_uint32(v, obj, name, errp); } else { value = *obj; - v->type_int(v, &value, name, errp); + v->type_int64(v, &value, name, errp); if (value < 0 || value > UINT32_MAX) { + /* FIXME questionable reuse of errp if callback changed + value on error */ error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "null", "uint32_t"); return; @@ -157,7 +163,7 @@ void visit_type_uint64(Visitor *v, uint64_t *obj, const char *name, Error **errp v->type_uint64(v, obj, name, errp); } else { value = *obj; - v->type_int(v, &value, name, errp); + v->type_int64(v, &value, name, errp); *obj = value; } } @@ -170,8 +176,10 @@ void visit_type_int8(Visitor *v, int8_t *obj, const char *name, Error **errp) v->type_int8(v, obj, name, errp); } else { value = *obj; - v->type_int(v, &value, name, errp); + v->type_int64(v, &value, name, errp); if (value < INT8_MIN || value > INT8_MAX) { + /* FIXME questionable reuse of errp if callback changed + value on error */ error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "null", "int8_t"); return; @@ -188,8 +196,10 @@ void visit_type_int16(Visitor *v, int16_t *obj, const char *name, Error **errp) v->type_int16(v, obj, name, errp); } else { value = *obj; - v->type_int(v, &value, name, errp); + v->type_int64(v, &value, name, errp); if (value < INT16_MIN || value > INT16_MAX) { + /* FIXME questionable reuse of errp if callback changed + value on error */ error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "null", "int16_t"); return; @@ -206,8 +216,10 @@ void visit_type_int32(Visitor *v, int32_t *obj, const char *name, Error **errp) v->type_int32(v, obj, name, errp); } else { value = *obj; - v->type_int(v, &value, name, errp); + v->type_int64(v, &value, name, errp); if (value < INT32_MIN || value > INT32_MAX) { + /* FIXME questionable reuse of errp if callback changed + value on error */ error_setg(errp, QERR_INVALID_PARAMETER_VALUE, name ? name : "null", "int32_t"); return; @@ -218,11 +230,7 @@ void visit_type_int32(Visitor *v, int32_t *obj, const char *name, Error **errp) void visit_type_int64(Visitor *v, int64_t *obj, const char *name, Error **errp) { - if (v->type_int64) { - v->type_int64(v, obj, name, errp); - } else { - v->type_int(v, obj, name, errp); - } + v->type_int64(v, obj, name, errp); } void visit_type_size(Visitor *v, uint64_t *obj, const char *name, Error **errp) @@ -235,7 +243,7 @@ void visit_type_size(Visitor *v, uint64_t *obj, const char *name, Error **errp) v->type_uint64(v, obj, name, errp); } else { value = *obj; - v->type_int(v, &value, name, errp); + v->type_int64(v, &value, name, errp); *obj = value; } } diff --git a/qapi/qmp-input-visitor.c b/qapi/qmp-input-visitor.c index edb8bd2d68..d1668e343f 100644 --- a/qapi/qmp-input-visitor.c +++ b/qapi/qmp-input-visitor.c @@ -225,8 +225,8 @@ static void qmp_input_get_next_type(Visitor *v, QType *type, bool promote_int, } } -static void qmp_input_type_int(Visitor *v, int64_t *obj, const char *name, - Error **errp) +static void qmp_input_type_int64(Visitor *v, int64_t *obj, const char *name, + Error **errp) { QmpInputVisitor *qiv = to_qiv(v); QInt *qint = qobject_to_qint(qmp_input_get_object(qiv, name, true)); @@ -342,7 +342,7 @@ QmpInputVisitor *qmp_input_visitor_new(QObject *obj) v->visitor.next_list = qmp_input_next_list; v->visitor.end_list = qmp_input_end_list; v->visitor.type_enum = input_type_enum; - v->visitor.type_int = qmp_input_type_int; + v->visitor.type_int64 = qmp_input_type_int64; v->visitor.type_bool = qmp_input_type_bool; v->visitor.type_str = qmp_input_type_str; v->visitor.type_number = qmp_input_type_number; diff --git a/qapi/qmp-output-visitor.c b/qapi/qmp-output-visitor.c index b064fb5a91..a13cf9154d 100644 --- a/qapi/qmp-output-visitor.c +++ b/qapi/qmp-output-visitor.c @@ -159,8 +159,8 @@ static void qmp_output_end_list(Visitor *v, Error **errp) qmp_output_pop(qov); } -static void qmp_output_type_int(Visitor *v, int64_t *obj, const char *name, - Error **errp) +static void qmp_output_type_int64(Visitor *v, int64_t *obj, const char *name, + Error **errp) { QmpOutputVisitor *qov = to_qov(v); qmp_output_add(qov, name, qint_from_int(*obj)); @@ -242,7 +242,7 @@ QmpOutputVisitor *qmp_output_visitor_new(void) v->visitor.next_list = qmp_output_next_list; v->visitor.end_list = qmp_output_end_list; v->visitor.type_enum = output_type_enum; - v->visitor.type_int = qmp_output_type_int; + v->visitor.type_int64 = qmp_output_type_int64; v->visitor.type_bool = qmp_output_type_bool; v->visitor.type_str = qmp_output_type_str; v->visitor.type_number = qmp_output_type_number; diff --git a/qapi/string-input-visitor.c b/qapi/string-input-visitor.c index 52db4cf32b..ffe8cb2f3d 100644 --- a/qapi/string-input-visitor.c +++ b/qapi/string-input-visitor.c @@ -185,8 +185,8 @@ end_list(Visitor *v, Error **errp) siv->head = true; } -static void parse_type_int(Visitor *v, int64_t *obj, const char *name, - Error **errp) +static void parse_type_int64(Visitor *v, int64_t *obj, const char *name, + Error **errp) { StringInputVisitor *siv = to_siv(v); @@ -336,7 +336,7 @@ StringInputVisitor *string_input_visitor_new(const char *str) v = g_malloc0(sizeof(*v)); v->visitor.type_enum = input_type_enum; - v->visitor.type_int = parse_type_int; + v->visitor.type_int64 = parse_type_int64; v->visitor.type_size = parse_type_size; v->visitor.type_bool = parse_type_bool; v->visitor.type_str = parse_type_str; diff --git a/qapi/string-output-visitor.c b/qapi/string-output-visitor.c index b0313cb53a..cf8dfc8b48 100644 --- a/qapi/string-output-visitor.c +++ b/qapi/string-output-visitor.c @@ -122,8 +122,8 @@ static void format_string(StringOutputVisitor *sov, Range *r, bool next, } } -static void print_type_int(Visitor *v, int64_t *obj, const char *name, - Error **errp) +static void print_type_int64(Visitor *v, int64_t *obj, const char *name, + Error **errp) { StringOutputVisitor *sov = to_sov(v); GList *l; @@ -346,7 +346,7 @@ StringOutputVisitor *string_output_visitor_new(bool human) v->string = g_string_new(NULL); v->human = human; v->visitor.type_enum = output_type_enum; - v->visitor.type_int = print_type_int; + v->visitor.type_int64 = print_type_int64; v->visitor.type_size = print_type_size; v->visitor.type_bool = print_type_bool; v->visitor.type_str = print_type_str; -- cgit 1.4.1 From f755dea79dc81b0d6a8f6414e0672e165e28d8ba Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Fri, 29 Jan 2016 06:48:50 -0700 Subject: qapi: Make all visitors supply uint64 callbacks Our qapi visitor contract supports multiple integer visitors, but left the type_uint64 visitor as optional (falling back on type_int64); which in turn can lead to awkward behavior with numbers larger than INT64_MAX (the user has to be aware of twos complement, and deal with negatives). This patch does not address the disparity in handling large values as negatives. It merely moves the fallback from uint64 to int64 from the visitor core to the visitors, where the issue can actually be fixed, by implementing the missing type_uint64() callbacks on top of the respective type_int64() callbacks, and with a FIXME comment explaining why that's wrong. With that done, we now have a type_uint64() callback in every driver, so we can make it mandatory from the core. And although the type_int64() callback can cover the entire valid range of type_uint{8,16,32} on valid user input, using type_uint64() to avoid mixed signedness makes more sense. Signed-off-by: Eric Blake Message-Id: <1454075341-13658-15-git-send-email-eblake@redhat.com> Signed-off-by: Markus Armbruster --- include/qapi/visitor-impl.h | 9 ++++++--- qapi/qapi-dealloc-visitor.c | 6 ++++++ qapi/qapi-visit-core.c | 36 +++++++++++------------------------- qapi/qmp-input-visitor.c | 17 +++++++++++++++++ qapi/qmp-output-visitor.c | 9 +++++++++ qapi/string-input-visitor.c | 15 +++++++++++++++ qapi/string-output-visitor.c | 9 +++++++++ 7 files changed, 73 insertions(+), 28 deletions(-) (limited to 'qapi/string-input-visitor.c') diff --git a/include/qapi/visitor-impl.h b/include/qapi/visitor-impl.h index 319efe8af5..92c4bcbb90 100644 --- a/include/qapi/visitor-impl.h +++ b/include/qapi/visitor-impl.h @@ -40,6 +40,12 @@ struct Visitor void (*type_int64)(Visitor *v, int64_t *obj, const char *name, Error **errp); /* Must be set. */ + void (*type_uint64)(Visitor *v, uint64_t *obj, const char *name, + Error **errp); + /* Optional; fallback is type_uint64(). */ + void (*type_size)(Visitor *v, uint64_t *obj, const char *name, + Error **errp); + /* Must be set. */ void (*type_bool)(Visitor *v, bool *obj, const char *name, Error **errp); void (*type_str)(Visitor *v, char **obj, const char *name, Error **errp); void (*type_number)(Visitor *v, double *obj, const char *name, @@ -53,12 +59,9 @@ struct Visitor void (*type_uint8)(Visitor *v, uint8_t *obj, const char *name, Error **errp); void (*type_uint16)(Visitor *v, uint16_t *obj, const char *name, Error **errp); void (*type_uint32)(Visitor *v, uint32_t *obj, const char *name, Error **errp); - void (*type_uint64)(Visitor *v, uint64_t *obj, const char *name, Error **errp); void (*type_int8)(Visitor *v, int8_t *obj, const char *name, Error **errp); void (*type_int16)(Visitor *v, int16_t *obj, const char *name, Error **errp); void (*type_int32)(Visitor *v, int32_t *obj, const char *name, Error **errp); - /* visit_type_size() falls back to (*type_uint64)() if type_size is unset */ - void (*type_size)(Visitor *v, uint64_t *obj, const char *name, Error **errp); bool (*start_union)(Visitor *v, bool data_present, Error **errp); }; diff --git a/qapi/qapi-dealloc-visitor.c b/qapi/qapi-dealloc-visitor.c index 07d7337b79..2c257d8b48 100644 --- a/qapi/qapi-dealloc-visitor.c +++ b/qapi/qapi-dealloc-visitor.c @@ -141,6 +141,11 @@ static void qapi_dealloc_type_int64(Visitor *v, int64_t *obj, const char *name, { } +static void qapi_dealloc_type_uint64(Visitor *v, uint64_t *obj, + const char *name, Error **errp) +{ +} + static void qapi_dealloc_type_bool(Visitor *v, bool *obj, const char *name, Error **errp) { @@ -216,6 +221,7 @@ QapiDeallocVisitor *qapi_dealloc_visitor_new(void) v->visitor.end_list = qapi_dealloc_end_list; v->visitor.type_enum = qapi_dealloc_type_enum; v->visitor.type_int64 = qapi_dealloc_type_int64; + v->visitor.type_uint64 = qapi_dealloc_type_uint64; v->visitor.type_bool = qapi_dealloc_type_bool; v->visitor.type_str = qapi_dealloc_type_str; v->visitor.type_number = qapi_dealloc_type_number; diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c index 2446a1287b..afcd59be9a 100644 --- a/qapi/qapi-visit-core.c +++ b/qapi/qapi-visit-core.c @@ -97,14 +97,14 @@ void visit_type_int(Visitor *v, int64_t *obj, const char *name, Error **errp) void visit_type_uint8(Visitor *v, uint8_t *obj, const char *name, Error **errp) { - int64_t value; + uint64_t value; if (v->type_uint8) { v->type_uint8(v, obj, name, errp); } else { value = *obj; - v->type_int64(v, &value, name, errp); - if (value < 0 || value > UINT8_MAX) { + v->type_uint64(v, &value, name, errp); + if (value > UINT8_MAX) { /* FIXME questionable reuse of errp if callback changed value on error */ error_setg(errp, QERR_INVALID_PARAMETER_VALUE, @@ -117,14 +117,14 @@ void visit_type_uint8(Visitor *v, uint8_t *obj, const char *name, Error **errp) void visit_type_uint16(Visitor *v, uint16_t *obj, const char *name, Error **errp) { - int64_t value; + uint64_t value; if (v->type_uint16) { v->type_uint16(v, obj, name, errp); } else { value = *obj; - v->type_int64(v, &value, name, errp); - if (value < 0 || value > UINT16_MAX) { + v->type_uint64(v, &value, name, errp); + if (value > UINT16_MAX) { /* FIXME questionable reuse of errp if callback changed value on error */ error_setg(errp, QERR_INVALID_PARAMETER_VALUE, @@ -137,14 +137,14 @@ void visit_type_uint16(Visitor *v, uint16_t *obj, const char *name, Error **errp void visit_type_uint32(Visitor *v, uint32_t *obj, const char *name, Error **errp) { - int64_t value; + uint64_t value; if (v->type_uint32) { v->type_uint32(v, obj, name, errp); } else { value = *obj; - v->type_int64(v, &value, name, errp); - if (value < 0 || value > UINT32_MAX) { + v->type_uint64(v, &value, name, errp); + if (value > UINT32_MAX) { /* FIXME questionable reuse of errp if callback changed value on error */ error_setg(errp, QERR_INVALID_PARAMETER_VALUE, @@ -157,15 +157,7 @@ void visit_type_uint32(Visitor *v, uint32_t *obj, const char *name, Error **errp void visit_type_uint64(Visitor *v, uint64_t *obj, const char *name, Error **errp) { - int64_t value; - - if (v->type_uint64) { - v->type_uint64(v, obj, name, errp); - } else { - value = *obj; - v->type_int64(v, &value, name, errp); - *obj = value; - } + v->type_uint64(v, obj, name, errp); } void visit_type_int8(Visitor *v, int8_t *obj, const char *name, Error **errp) @@ -235,16 +227,10 @@ void visit_type_int64(Visitor *v, int64_t *obj, const char *name, Error **errp) void visit_type_size(Visitor *v, uint64_t *obj, const char *name, Error **errp) { - int64_t value; - if (v->type_size) { v->type_size(v, obj, name, errp); - } else if (v->type_uint64) { - v->type_uint64(v, obj, name, errp); } else { - value = *obj; - v->type_int64(v, &value, name, errp); - *obj = value; + v->type_uint64(v, obj, name, errp); } } diff --git a/qapi/qmp-input-visitor.c b/qapi/qmp-input-visitor.c index d1668e343f..5eb67dfc30 100644 --- a/qapi/qmp-input-visitor.c +++ b/qapi/qmp-input-visitor.c @@ -240,6 +240,22 @@ static void qmp_input_type_int64(Visitor *v, int64_t *obj, const char *name, *obj = qint_get_int(qint); } +static void qmp_input_type_uint64(Visitor *v, uint64_t *obj, const char *name, + Error **errp) +{ + /* FIXME: qobject_to_qint mishandles values over INT64_MAX */ + QmpInputVisitor *qiv = to_qiv(v); + QInt *qint = qobject_to_qint(qmp_input_get_object(qiv, name, true)); + + if (!qint) { + error_setg(errp, QERR_INVALID_PARAMETER_TYPE, name ? name : "null", + "integer"); + return; + } + + *obj = qint_get_int(qint); +} + static void qmp_input_type_bool(Visitor *v, bool *obj, const char *name, Error **errp) { @@ -343,6 +359,7 @@ QmpInputVisitor *qmp_input_visitor_new(QObject *obj) v->visitor.end_list = qmp_input_end_list; v->visitor.type_enum = input_type_enum; v->visitor.type_int64 = qmp_input_type_int64; + v->visitor.type_uint64 = qmp_input_type_uint64; v->visitor.type_bool = qmp_input_type_bool; v->visitor.type_str = qmp_input_type_str; v->visitor.type_number = qmp_input_type_number; diff --git a/qapi/qmp-output-visitor.c b/qapi/qmp-output-visitor.c index a13cf9154d..8a24a00309 100644 --- a/qapi/qmp-output-visitor.c +++ b/qapi/qmp-output-visitor.c @@ -166,6 +166,14 @@ static void qmp_output_type_int64(Visitor *v, int64_t *obj, const char *name, qmp_output_add(qov, name, qint_from_int(*obj)); } +static void qmp_output_type_uint64(Visitor *v, uint64_t *obj, const char *name, + Error **errp) +{ + /* FIXME: QMP outputs values larger than INT64_MAX as negative */ + QmpOutputVisitor *qov = to_qov(v); + qmp_output_add(qov, name, qint_from_int(*obj)); +} + static void qmp_output_type_bool(Visitor *v, bool *obj, const char *name, Error **errp) { @@ -243,6 +251,7 @@ QmpOutputVisitor *qmp_output_visitor_new(void) v->visitor.end_list = qmp_output_end_list; v->visitor.type_enum = output_type_enum; v->visitor.type_int64 = qmp_output_type_int64; + v->visitor.type_uint64 = qmp_output_type_uint64; v->visitor.type_bool = qmp_output_type_bool; v->visitor.type_str = qmp_output_type_str; v->visitor.type_number = qmp_output_type_number; diff --git a/qapi/string-input-visitor.c b/qapi/string-input-visitor.c index ffe8cb2f3d..4c2344771b 100644 --- a/qapi/string-input-visitor.c +++ b/qapi/string-input-visitor.c @@ -227,6 +227,20 @@ error: "an int64 value or range"); } +static void parse_type_uint64(Visitor *v, uint64_t *obj, const char *name, + Error **errp) +{ + /* FIXME: parse_type_int64 mishandles values over INT64_MAX */ + int64_t i; + Error *err = NULL; + parse_type_int64(v, &i, name, &err); + if (err) { + error_propagate(errp, err); + } else { + *obj = i; + } +} + static void parse_type_size(Visitor *v, uint64_t *obj, const char *name, Error **errp) { @@ -337,6 +351,7 @@ StringInputVisitor *string_input_visitor_new(const char *str) v->visitor.type_enum = input_type_enum; v->visitor.type_int64 = parse_type_int64; + v->visitor.type_uint64 = parse_type_uint64; v->visitor.type_size = parse_type_size; v->visitor.type_bool = parse_type_bool; v->visitor.type_str = parse_type_str; diff --git a/qapi/string-output-visitor.c b/qapi/string-output-visitor.c index cf8dfc8b48..8400c8beeb 100644 --- a/qapi/string-output-visitor.c +++ b/qapi/string-output-visitor.c @@ -198,6 +198,14 @@ static void print_type_int64(Visitor *v, int64_t *obj, const char *name, } } +static void print_type_uint64(Visitor *v, uint64_t *obj, const char *name, + Error **errp) +{ + /* FIXME: print_type_int64 mishandles values over INT64_MAX */ + int64_t i = *obj; + print_type_int64(v, &i, name, errp); +} + static void print_type_size(Visitor *v, uint64_t *obj, const char *name, Error **errp) { @@ -347,6 +355,7 @@ StringOutputVisitor *string_output_visitor_new(bool human) v->human = human; v->visitor.type_enum = output_type_enum; v->visitor.type_int64 = print_type_int64; + v->visitor.type_uint64 = print_type_uint64; v->visitor.type_size = print_type_size; v->visitor.type_bool = print_type_bool; v->visitor.type_str = print_type_str; -- cgit 1.4.1 From 0b2a0d6bb2446060944061e53e87d0c7addede79 Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Fri, 29 Jan 2016 06:48:56 -0700 Subject: qapi: Swap 'name' in visit_* callbacks to match public API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As explained in the previous patches, matching argument order of 'name, &value' to JSON's "name":value makes sense. However, while the last two patches were easy with Coccinelle, I ended up doing this one all by hand. Now all the visitor callbacks match the main interface. The compiler is able to enforce that all clients match the changed interface in visitor-impl.h, even where two pointers are being swapped, because only one of the two pointers is const (if that were not the case, then C's looseness on treating 'char *' like 'void *' would have made review a bit harder). Signed-off-by: Eric Blake Reviewed-by: Marc-André Lureau Message-Id: <1454075341-13658-21-git-send-email-eblake@redhat.com> Signed-off-by: Markus Armbruster --- include/qapi/visitor-impl.h | 39 +++++++++++++++++++++------------------ qapi/opts-visitor.c | 16 ++++++++-------- qapi/qapi-dealloc-visitor.c | 25 ++++++++++++------------- qapi/qapi-visit-core.c | 38 +++++++++++++++++++------------------- qapi/qmp-input-visitor.c | 22 +++++++++++----------- qapi/qmp-output-visitor.c | 16 ++++++++-------- qapi/string-input-visitor.c | 16 ++++++++-------- qapi/string-output-visitor.c | 16 ++++++++-------- 8 files changed, 95 insertions(+), 93 deletions(-) (limited to 'qapi/string-input-visitor.c') diff --git a/include/qapi/visitor-impl.h b/include/qapi/visitor-impl.h index 29e2c087fe..734cc13854 100644 --- a/include/qapi/visitor-impl.h +++ b/include/qapi/visitor-impl.h @@ -18,8 +18,8 @@ struct Visitor { /* Must be set */ - void (*start_struct)(Visitor *v, void **obj, const char *kind, - const char *name, size_t size, Error **errp); + void (*start_struct)(Visitor *v, const char *name, void **obj, + const char *kind, size_t size, Error **errp); void (*end_struct)(Visitor *v, Error **errp); void (*start_implicit_struct)(Visitor *v, void **obj, size_t size, @@ -30,38 +30,41 @@ struct Visitor GenericList *(*next_list)(Visitor *v, GenericList **list, Error **errp); void (*end_list)(Visitor *v, Error **errp); - void (*type_enum)(Visitor *v, int *obj, const char * const strings[], - const char *kind, const char *name, Error **errp); + void (*type_enum)(Visitor *v, const char *name, int *obj, + const char *const strings[], const char *kind, + Error **errp); /* May be NULL; only needed for input visitors. */ - void (*get_next_type)(Visitor *v, QType *type, bool promote_int, - const char *name, Error **errp); + void (*get_next_type)(Visitor *v, const char *name, QType *type, + bool promote_int, Error **errp); /* Must be set. */ - void (*type_int64)(Visitor *v, int64_t *obj, const char *name, + void (*type_int64)(Visitor *v, const char *name, int64_t *obj, Error **errp); /* Must be set. */ - void (*type_uint64)(Visitor *v, uint64_t *obj, const char *name, + void (*type_uint64)(Visitor *v, const char *name, uint64_t *obj, Error **errp); /* Optional; fallback is type_uint64(). */ - void (*type_size)(Visitor *v, uint64_t *obj, const char *name, + void (*type_size)(Visitor *v, const char *name, uint64_t *obj, Error **errp); /* Must be set. */ - void (*type_bool)(Visitor *v, bool *obj, const char *name, Error **errp); - void (*type_str)(Visitor *v, char **obj, const char *name, Error **errp); - void (*type_number)(Visitor *v, double *obj, const char *name, + void (*type_bool)(Visitor *v, const char *name, bool *obj, Error **errp); + void (*type_str)(Visitor *v, const char *name, char **obj, Error **errp); + void (*type_number)(Visitor *v, const char *name, double *obj, Error **errp); - void (*type_any)(Visitor *v, QObject **obj, const char *name, + void (*type_any)(Visitor *v, const char *name, QObject **obj, Error **errp); /* May be NULL; most useful for input visitors. */ - void (*optional)(Visitor *v, bool *present, const char *name); + void (*optional)(Visitor *v, const char *name, bool *present); bool (*start_union)(Visitor *v, bool data_present, Error **errp); }; -void input_type_enum(Visitor *v, int *obj, const char * const strings[], - const char *kind, const char *name, Error **errp); -void output_type_enum(Visitor *v, int *obj, const char * const strings[], - const char *kind, const char *name, Error **errp); +void input_type_enum(Visitor *v, const char *name, int *obj, + const char *const strings[], const char *kind, + Error **errp); +void output_type_enum(Visitor *v, const char *name, int *obj, + const char *const strings[], const char *kind, + Error **errp); #endif diff --git a/qapi/opts-visitor.c b/qapi/opts-visitor.c index 14db02c923..a62da35173 100644 --- a/qapi/opts-visitor.c +++ b/qapi/opts-visitor.c @@ -125,8 +125,8 @@ opts_visitor_insert(GHashTable *unprocessed_opts, const QemuOpt *opt) static void -opts_start_struct(Visitor *v, void **obj, const char *kind, - const char *name, size_t size, Error **errp) +opts_start_struct(Visitor *v, const char *name, void **obj, const char *kind, + size_t size, Error **errp) { OptsVisitor *ov = to_ov(v); const QemuOpt *opt; @@ -312,7 +312,7 @@ processed(OptsVisitor *ov, const char *name) static void -opts_type_str(Visitor *v, char **obj, const char *name, Error **errp) +opts_type_str(Visitor *v, const char *name, char **obj, Error **errp) { OptsVisitor *ov = to_ov(v); const QemuOpt *opt; @@ -328,7 +328,7 @@ opts_type_str(Visitor *v, char **obj, const char *name, Error **errp) /* mimics qemu-option.c::parse_option_bool() */ static void -opts_type_bool(Visitor *v, bool *obj, const char *name, Error **errp) +opts_type_bool(Visitor *v, const char *name, bool *obj, Error **errp) { OptsVisitor *ov = to_ov(v); const QemuOpt *opt; @@ -361,7 +361,7 @@ opts_type_bool(Visitor *v, bool *obj, const char *name, Error **errp) static void -opts_type_int64(Visitor *v, int64_t *obj, const char *name, Error **errp) +opts_type_int64(Visitor *v, const char *name, int64_t *obj, Error **errp) { OptsVisitor *ov = to_ov(v); const QemuOpt *opt; @@ -417,7 +417,7 @@ opts_type_int64(Visitor *v, int64_t *obj, const char *name, Error **errp) static void -opts_type_uint64(Visitor *v, uint64_t *obj, const char *name, Error **errp) +opts_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp) { OptsVisitor *ov = to_ov(v); const QemuOpt *opt; @@ -469,7 +469,7 @@ opts_type_uint64(Visitor *v, uint64_t *obj, const char *name, Error **errp) static void -opts_type_size(Visitor *v, uint64_t *obj, const char *name, Error **errp) +opts_type_size(Visitor *v, const char *name, uint64_t *obj, Error **errp) { OptsVisitor *ov = to_ov(v); const QemuOpt *opt; @@ -495,7 +495,7 @@ opts_type_size(Visitor *v, uint64_t *obj, const char *name, Error **errp) static void -opts_optional(Visitor *v, bool *present, const char *name) +opts_optional(Visitor *v, const char *name, bool *present) { OptsVisitor *ov = to_ov(v); diff --git a/qapi/qapi-dealloc-visitor.c b/qapi/qapi-dealloc-visitor.c index 2c257d8b48..556137ec66 100644 --- a/qapi/qapi-dealloc-visitor.c +++ b/qapi/qapi-dealloc-visitor.c @@ -59,8 +59,8 @@ static void *qapi_dealloc_pop(QapiDeallocVisitor *qov) return value; } -static void qapi_dealloc_start_struct(Visitor *v, void **obj, const char *kind, - const char *name, size_t unused, +static void qapi_dealloc_start_struct(Visitor *v, const char *name, void **obj, + const char *kind, size_t unused, Error **errp) { QapiDeallocVisitor *qov = to_qov(v); @@ -128,7 +128,7 @@ static void qapi_dealloc_end_list(Visitor *v, Error **errp) assert(obj == NULL); /* should've been list head tracker with no payload */ } -static void qapi_dealloc_type_str(Visitor *v, char **obj, const char *name, +static void qapi_dealloc_type_str(Visitor *v, const char *name, char **obj, Error **errp) { if (obj) { @@ -136,38 +136,37 @@ static void qapi_dealloc_type_str(Visitor *v, char **obj, const char *name, } } -static void qapi_dealloc_type_int64(Visitor *v, int64_t *obj, const char *name, +static void qapi_dealloc_type_int64(Visitor *v, const char *name, int64_t *obj, Error **errp) { } -static void qapi_dealloc_type_uint64(Visitor *v, uint64_t *obj, - const char *name, Error **errp) +static void qapi_dealloc_type_uint64(Visitor *v, const char *name, + uint64_t *obj, Error **errp) { } -static void qapi_dealloc_type_bool(Visitor *v, bool *obj, const char *name, +static void qapi_dealloc_type_bool(Visitor *v, const char *name, bool *obj, Error **errp) { } -static void qapi_dealloc_type_number(Visitor *v, double *obj, const char *name, +static void qapi_dealloc_type_number(Visitor *v, const char *name, double *obj, Error **errp) { } -static void qapi_dealloc_type_anything(Visitor *v, QObject **obj, - const char *name, Error **errp) +static void qapi_dealloc_type_anything(Visitor *v, const char *name, + QObject **obj, Error **errp) { if (obj) { qobject_decref(*obj); } } -static void qapi_dealloc_type_enum(Visitor *v, int *obj, +static void qapi_dealloc_type_enum(Visitor *v, const char *name, int *obj, const char * const strings[], - const char *kind, const char *name, - Error **errp) + const char *kind, Error **errp) { } diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c index cd8e6031c5..3164f42fe1 100644 --- a/qapi/qapi-visit-core.c +++ b/qapi/qapi-visit-core.c @@ -22,7 +22,7 @@ void visit_start_struct(Visitor *v, const char *name, void **obj, const char *kind, size_t size, Error **errp) { - v->start_struct(v, obj, kind, name, size, errp); + v->start_struct(v, name, obj, kind, size, errp); } void visit_end_struct(Visitor *v, Error **errp) @@ -71,7 +71,7 @@ bool visit_start_union(Visitor *v, bool data_present, Error **errp) bool visit_optional(Visitor *v, const char *name, bool *present) { if (v->optional) { - v->optional(v, present, name); + v->optional(v, name, present); } return *present; } @@ -80,7 +80,7 @@ void visit_get_next_type(Visitor *v, const char *name, QType *type, bool promote_int, Error **errp) { if (v->get_next_type) { - v->get_next_type(v, type, promote_int, name, errp); + v->get_next_type(v, name, type, promote_int, errp); } } @@ -88,12 +88,12 @@ void visit_type_enum(Visitor *v, const char *name, int *obj, const char *const strings[], const char *kind, Error **errp) { - v->type_enum(v, obj, strings, kind, name, errp); + v->type_enum(v, name, obj, strings, kind, errp); } void visit_type_int(Visitor *v, const char *name, int64_t *obj, Error **errp) { - v->type_int64(v, obj, name, errp); + v->type_int64(v, name, obj, errp); } static void visit_type_uintN(Visitor *v, uint64_t *obj, const char *name, @@ -102,7 +102,7 @@ static void visit_type_uintN(Visitor *v, uint64_t *obj, const char *name, Error *err = NULL; uint64_t value = *obj; - v->type_uint64(v, &value, name, &err); + v->type_uint64(v, name, &value, &err); if (err) { error_propagate(errp, err); } else if (value > max) { @@ -140,7 +140,7 @@ void visit_type_uint32(Visitor *v, const char *name, uint32_t *obj, void visit_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp) { - v->type_uint64(v, obj, name, errp); + v->type_uint64(v, name, obj, errp); } static void visit_type_intN(Visitor *v, int64_t *obj, const char *name, @@ -150,7 +150,7 @@ static void visit_type_intN(Visitor *v, int64_t *obj, const char *name, Error *err = NULL; int64_t value = *obj; - v->type_int64(v, &value, name, &err); + v->type_int64(v, name, &value, &err); if (err) { error_propagate(errp, err); } else if (value < min || value > max) { @@ -187,42 +187,42 @@ void visit_type_int32(Visitor *v, const char *name, int32_t *obj, void visit_type_int64(Visitor *v, const char *name, int64_t *obj, Error **errp) { - v->type_int64(v, obj, name, errp); + v->type_int64(v, name, obj, errp); } void visit_type_size(Visitor *v, const char *name, uint64_t *obj, Error **errp) { if (v->type_size) { - v->type_size(v, obj, name, errp); + v->type_size(v, name, obj, errp); } else { - v->type_uint64(v, obj, name, errp); + v->type_uint64(v, name, obj, errp); } } void visit_type_bool(Visitor *v, const char *name, bool *obj, Error **errp) { - v->type_bool(v, obj, name, errp); + v->type_bool(v, name, obj, errp); } void visit_type_str(Visitor *v, const char *name, char **obj, Error **errp) { - v->type_str(v, obj, name, errp); + v->type_str(v, name, obj, errp); } void visit_type_number(Visitor *v, const char *name, double *obj, Error **errp) { - v->type_number(v, obj, name, errp); + v->type_number(v, name, obj, errp); } void visit_type_any(Visitor *v, const char *name, QObject **obj, Error **errp) { - v->type_any(v, obj, name, errp); + v->type_any(v, name, obj, errp); } -void output_type_enum(Visitor *v, int *obj, const char * const strings[], - const char *kind, const char *name, +void output_type_enum(Visitor *v, const char *name, int *obj, + const char *const strings[], const char *kind, Error **errp) { int i = 0; @@ -240,8 +240,8 @@ void output_type_enum(Visitor *v, int *obj, const char * const strings[], visit_type_str(v, name, &enum_str, errp); } -void input_type_enum(Visitor *v, int *obj, const char * const strings[], - const char *kind, const char *name, +void input_type_enum(Visitor *v, const char *name, int *obj, + const char *const strings[], const char *kind, Error **errp) { Error *local_err = NULL; diff --git a/qapi/qmp-input-visitor.c b/qapi/qmp-input-visitor.c index 5eb67dfc30..f3a0fd55c9 100644 --- a/qapi/qmp-input-visitor.c +++ b/qapi/qmp-input-visitor.c @@ -115,8 +115,8 @@ static void qmp_input_pop(QmpInputVisitor *qiv, Error **errp) qiv->nb_stack--; } -static void qmp_input_start_struct(Visitor *v, void **obj, const char *kind, - const char *name, size_t size, Error **errp) +static void qmp_input_start_struct(Visitor *v, const char *name, void **obj, + const char *kind, size_t size, Error **errp) { QmpInputVisitor *qiv = to_qiv(v); QObject *qobj = qmp_input_get_object(qiv, name, true); @@ -209,8 +209,8 @@ static void qmp_input_end_list(Visitor *v, Error **errp) qmp_input_pop(qiv, errp); } -static void qmp_input_get_next_type(Visitor *v, QType *type, bool promote_int, - const char *name, Error **errp) +static void qmp_input_get_next_type(Visitor *v, const char *name, QType *type, + bool promote_int, Error **errp) { QmpInputVisitor *qiv = to_qiv(v); QObject *qobj = qmp_input_get_object(qiv, name, false); @@ -225,7 +225,7 @@ static void qmp_input_get_next_type(Visitor *v, QType *type, bool promote_int, } } -static void qmp_input_type_int64(Visitor *v, int64_t *obj, const char *name, +static void qmp_input_type_int64(Visitor *v, const char *name, int64_t *obj, Error **errp) { QmpInputVisitor *qiv = to_qiv(v); @@ -240,7 +240,7 @@ static void qmp_input_type_int64(Visitor *v, int64_t *obj, const char *name, *obj = qint_get_int(qint); } -static void qmp_input_type_uint64(Visitor *v, uint64_t *obj, const char *name, +static void qmp_input_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp) { /* FIXME: qobject_to_qint mishandles values over INT64_MAX */ @@ -256,7 +256,7 @@ static void qmp_input_type_uint64(Visitor *v, uint64_t *obj, const char *name, *obj = qint_get_int(qint); } -static void qmp_input_type_bool(Visitor *v, bool *obj, const char *name, +static void qmp_input_type_bool(Visitor *v, const char *name, bool *obj, Error **errp) { QmpInputVisitor *qiv = to_qiv(v); @@ -271,7 +271,7 @@ static void qmp_input_type_bool(Visitor *v, bool *obj, const char *name, *obj = qbool_get_bool(qbool); } -static void qmp_input_type_str(Visitor *v, char **obj, const char *name, +static void qmp_input_type_str(Visitor *v, const char *name, char **obj, Error **errp) { QmpInputVisitor *qiv = to_qiv(v); @@ -286,7 +286,7 @@ static void qmp_input_type_str(Visitor *v, char **obj, const char *name, *obj = g_strdup(qstring_get_str(qstr)); } -static void qmp_input_type_number(Visitor *v, double *obj, const char *name, +static void qmp_input_type_number(Visitor *v, const char *name, double *obj, Error **errp) { QmpInputVisitor *qiv = to_qiv(v); @@ -310,7 +310,7 @@ static void qmp_input_type_number(Visitor *v, double *obj, const char *name, "number"); } -static void qmp_input_type_any(Visitor *v, QObject **obj, const char *name, +static void qmp_input_type_any(Visitor *v, const char *name, QObject **obj, Error **errp) { QmpInputVisitor *qiv = to_qiv(v); @@ -320,7 +320,7 @@ static void qmp_input_type_any(Visitor *v, QObject **obj, const char *name, *obj = qobj; } -static void qmp_input_optional(Visitor *v, bool *present, const char *name) +static void qmp_input_optional(Visitor *v, const char *name, bool *present) { QmpInputVisitor *qiv = to_qiv(v); QObject *qobj = qmp_input_get_object(qiv, name, true); diff --git a/qapi/qmp-output-visitor.c b/qapi/qmp-output-visitor.c index 8a24a00309..fe002cd5c8 100644 --- a/qapi/qmp-output-visitor.c +++ b/qapi/qmp-output-visitor.c @@ -111,8 +111,8 @@ static void qmp_output_add_obj(QmpOutputVisitor *qov, const char *name, } } -static void qmp_output_start_struct(Visitor *v, void **obj, const char *kind, - const char *name, size_t unused, +static void qmp_output_start_struct(Visitor *v, const char *name, void **obj, + const char *kind, size_t unused, Error **errp) { QmpOutputVisitor *qov = to_qov(v); @@ -159,14 +159,14 @@ static void qmp_output_end_list(Visitor *v, Error **errp) qmp_output_pop(qov); } -static void qmp_output_type_int64(Visitor *v, int64_t *obj, const char *name, +static void qmp_output_type_int64(Visitor *v, const char *name, int64_t *obj, Error **errp) { QmpOutputVisitor *qov = to_qov(v); qmp_output_add(qov, name, qint_from_int(*obj)); } -static void qmp_output_type_uint64(Visitor *v, uint64_t *obj, const char *name, +static void qmp_output_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp) { /* FIXME: QMP outputs values larger than INT64_MAX as negative */ @@ -174,14 +174,14 @@ static void qmp_output_type_uint64(Visitor *v, uint64_t *obj, const char *name, qmp_output_add(qov, name, qint_from_int(*obj)); } -static void qmp_output_type_bool(Visitor *v, bool *obj, const char *name, +static void qmp_output_type_bool(Visitor *v, const char *name, bool *obj, Error **errp) { QmpOutputVisitor *qov = to_qov(v); qmp_output_add(qov, name, qbool_from_bool(*obj)); } -static void qmp_output_type_str(Visitor *v, char **obj, const char *name, +static void qmp_output_type_str(Visitor *v, const char *name, char **obj, Error **errp) { QmpOutputVisitor *qov = to_qov(v); @@ -192,14 +192,14 @@ static void qmp_output_type_str(Visitor *v, char **obj, const char *name, } } -static void qmp_output_type_number(Visitor *v, double *obj, const char *name, +static void qmp_output_type_number(Visitor *v, const char *name, double *obj, Error **errp) { QmpOutputVisitor *qov = to_qov(v); qmp_output_add(qov, name, qfloat_from_double(*obj)); } -static void qmp_output_type_any(Visitor *v, QObject **obj, const char *name, +static void qmp_output_type_any(Visitor *v, const char *name, QObject **obj, Error **errp) { QmpOutputVisitor *qov = to_qov(v); diff --git a/qapi/string-input-visitor.c b/qapi/string-input-visitor.c index 4c2344771b..cdf129cb7d 100644 --- a/qapi/string-input-visitor.c +++ b/qapi/string-input-visitor.c @@ -185,7 +185,7 @@ end_list(Visitor *v, Error **errp) siv->head = true; } -static void parse_type_int64(Visitor *v, int64_t *obj, const char *name, +static void parse_type_int64(Visitor *v, const char *name, int64_t *obj, Error **errp) { StringInputVisitor *siv = to_siv(v); @@ -227,13 +227,13 @@ error: "an int64 value or range"); } -static void parse_type_uint64(Visitor *v, uint64_t *obj, const char *name, +static void parse_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp) { /* FIXME: parse_type_int64 mishandles values over INT64_MAX */ int64_t i; Error *err = NULL; - parse_type_int64(v, &i, name, &err); + parse_type_int64(v, name, &i, &err); if (err) { error_propagate(errp, err); } else { @@ -241,7 +241,7 @@ static void parse_type_uint64(Visitor *v, uint64_t *obj, const char *name, } } -static void parse_type_size(Visitor *v, uint64_t *obj, const char *name, +static void parse_type_size(Visitor *v, const char *name, uint64_t *obj, Error **errp) { StringInputVisitor *siv = to_siv(v); @@ -263,7 +263,7 @@ static void parse_type_size(Visitor *v, uint64_t *obj, const char *name, *obj = val; } -static void parse_type_bool(Visitor *v, bool *obj, const char *name, +static void parse_type_bool(Visitor *v, const char *name, bool *obj, Error **errp) { StringInputVisitor *siv = to_siv(v); @@ -287,7 +287,7 @@ static void parse_type_bool(Visitor *v, bool *obj, const char *name, "boolean"); } -static void parse_type_str(Visitor *v, char **obj, const char *name, +static void parse_type_str(Visitor *v, const char *name, char **obj, Error **errp) { StringInputVisitor *siv = to_siv(v); @@ -299,7 +299,7 @@ static void parse_type_str(Visitor *v, char **obj, const char *name, } } -static void parse_type_number(Visitor *v, double *obj, const char *name, +static void parse_type_number(Visitor *v, const char *name, double *obj, Error **errp) { StringInputVisitor *siv = to_siv(v); @@ -319,7 +319,7 @@ static void parse_type_number(Visitor *v, double *obj, const char *name, *obj = val; } -static void parse_optional(Visitor *v, bool *present, const char *name) +static void parse_optional(Visitor *v, const char *name, bool *present) { StringInputVisitor *siv = to_siv(v); diff --git a/qapi/string-output-visitor.c b/qapi/string-output-visitor.c index 8400c8beeb..3ce6a3bf67 100644 --- a/qapi/string-output-visitor.c +++ b/qapi/string-output-visitor.c @@ -122,7 +122,7 @@ static void format_string(StringOutputVisitor *sov, Range *r, bool next, } } -static void print_type_int64(Visitor *v, int64_t *obj, const char *name, +static void print_type_int64(Visitor *v, const char *name, int64_t *obj, Error **errp) { StringOutputVisitor *sov = to_sov(v); @@ -198,16 +198,16 @@ static void print_type_int64(Visitor *v, int64_t *obj, const char *name, } } -static void print_type_uint64(Visitor *v, uint64_t *obj, const char *name, +static void 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 = *obj; - print_type_int64(v, &i, name, errp); + print_type_int64(v, name, &i, errp); } -static void print_type_size(Visitor *v, uint64_t *obj, const char *name, - Error **errp) +static void print_type_size(Visitor *v, const char *name, uint64_t *obj, + Error **errp) { StringOutputVisitor *sov = to_sov(v); static const char suffixes[] = { 'B', 'K', 'M', 'G', 'T', 'P', 'E' }; @@ -237,14 +237,14 @@ static void print_type_size(Visitor *v, uint64_t *obj, const char *name, string_output_set(sov, out); } -static void print_type_bool(Visitor *v, bool *obj, const char *name, +static void print_type_bool(Visitor *v, const char *name, bool *obj, Error **errp) { StringOutputVisitor *sov = to_sov(v); string_output_set(sov, g_strdup(*obj ? "true" : "false")); } -static void print_type_str(Visitor *v, char **obj, const char *name, +static void print_type_str(Visitor *v, const char *name, char **obj, Error **errp) { StringOutputVisitor *sov = to_sov(v); @@ -258,7 +258,7 @@ static void print_type_str(Visitor *v, char **obj, const char *name, string_output_set(sov, out); } -static void print_type_number(Visitor *v, double *obj, const char *name, +static void print_type_number(Visitor *v, const char *name, double *obj, Error **errp) { StringOutputVisitor *sov = to_sov(v); -- cgit 1.4.1 From 08f9541dec51700abef0c37994213164ca4e4fc9 Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Fri, 29 Jan 2016 06:48:59 -0700 Subject: qapi: Drop unused error argument for list and implicit struct No backend was setting an error when ending the visit of a list or implicit struct, or when moving to the next list node. Make the callers a bit easier to follow by making this a part of the contract, and removing the errp argument - callers can then unconditionally end an object as part of cleanup without having to think about whether a second error is dominated by a first, because there is no second error. A later patch will then tackle the larger task of splitting visit_end_struct(), which can indeed set an error. Signed-off-by: Eric Blake Message-Id: <1454075341-13658-24-git-send-email-eblake@redhat.com> Signed-off-by: Markus Armbruster --- hw/ppc/spapr_drc.c | 6 +----- include/qapi/visitor-impl.h | 9 ++++++--- include/qapi/visitor.h | 8 +++++--- qapi/opts-visitor.c | 6 +++--- qapi/qapi-dealloc-visitor.c | 8 ++++---- qapi/qapi-visit-core.c | 12 ++++++------ qapi/qmp-input-visitor.c | 11 +++-------- qapi/qmp-output-visitor.c | 6 +++--- qapi/string-input-visitor.c | 8 +++----- qapi/string-output-visitor.c | 8 +++----- scripts/qapi-visit.py | 12 ++++-------- 11 files changed, 41 insertions(+), 53 deletions(-) (limited to 'qapi/string-input-visitor.c') diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c index 1aac6f2f68..ef063c05cf 100644 --- a/hw/ppc/spapr_drc.c +++ b/hw/ppc/spapr_drc.c @@ -315,11 +315,7 @@ static void prop_get_fdt(Object *obj, Visitor *v, const char *name, return; } } - visit_end_list(v, &err); - if (err) { - error_propagate(errp, err); - return; - } + visit_end_list(v); break; } default: diff --git a/include/qapi/visitor-impl.h b/include/qapi/visitor-impl.h index 337f99973f..ea252f8e3a 100644 --- a/include/qapi/visitor-impl.h +++ b/include/qapi/visitor-impl.h @@ -24,11 +24,14 @@ struct Visitor void (*start_implicit_struct)(Visitor *v, void **obj, size_t size, Error **errp); - void (*end_implicit_struct)(Visitor *v, Error **errp); + /* May be NULL */ + void (*end_implicit_struct)(Visitor *v); void (*start_list)(Visitor *v, const char *name, Error **errp); - GenericList *(*next_list)(Visitor *v, GenericList **list, Error **errp); - void (*end_list)(Visitor *v, Error **errp); + /* Must be set */ + GenericList *(*next_list)(Visitor *v, GenericList **list); + /* Must be set */ + void (*end_list)(Visitor *v); void (*type_enum)(Visitor *v, const char *name, int *obj, const char *const strings[], Error **errp); diff --git a/include/qapi/visitor.h b/include/qapi/visitor.h index 997555dbd7..5e581dcf7e 100644 --- a/include/qapi/visitor.h +++ b/include/qapi/visitor.h @@ -1,6 +1,7 @@ /* * Core Definitions for QAPI Visitor Classes * + * Copyright (C) 2012-2016 Red Hat, Inc. * Copyright IBM, Corp. 2011 * * Authors: @@ -32,10 +33,11 @@ void visit_start_struct(Visitor *v, const char *name, void **obj, void visit_end_struct(Visitor *v, Error **errp); void visit_start_implicit_struct(Visitor *v, void **obj, size_t size, Error **errp); -void visit_end_implicit_struct(Visitor *v, Error **errp); +void visit_end_implicit_struct(Visitor *v); + void visit_start_list(Visitor *v, const char *name, Error **errp); -GenericList *visit_next_list(Visitor *v, GenericList **list, Error **errp); -void visit_end_list(Visitor *v, Error **errp); +GenericList *visit_next_list(Visitor *v, GenericList **list); +void visit_end_list(Visitor *v); /** * Check if an optional member @name of an object needs visiting. diff --git a/qapi/opts-visitor.c b/qapi/opts-visitor.c index d1c0c5abf7..d54f75b5e7 100644 --- a/qapi/opts-visitor.c +++ b/qapi/opts-visitor.c @@ -1,7 +1,7 @@ /* * Options Visitor * - * Copyright Red Hat, Inc. 2012, 2013 + * Copyright Red Hat, Inc. 2012-2016 * * Author: Laszlo Ersek * @@ -221,7 +221,7 @@ opts_start_list(Visitor *v, const char *name, Error **errp) static GenericList * -opts_next_list(Visitor *v, GenericList **list, Error **errp) +opts_next_list(Visitor *v, GenericList **list) { OptsVisitor *ov = to_ov(v); GenericList **link; @@ -270,7 +270,7 @@ opts_next_list(Visitor *v, GenericList **list, Error **errp) static void -opts_end_list(Visitor *v, Error **errp) +opts_end_list(Visitor *v) { OptsVisitor *ov = to_ov(v); diff --git a/qapi/qapi-dealloc-visitor.c b/qapi/qapi-dealloc-visitor.c index 7c2148dc2e..2659d3fcca 100644 --- a/qapi/qapi-dealloc-visitor.c +++ b/qapi/qapi-dealloc-visitor.c @@ -1,6 +1,7 @@ /* * Dealloc Visitor * + * Copyright (C) 2012-2016 Red Hat, Inc. * Copyright IBM, Corp. 2011 * * Authors: @@ -84,7 +85,7 @@ static void qapi_dealloc_start_implicit_struct(Visitor *v, qapi_dealloc_push(qov, obj); } -static void qapi_dealloc_end_implicit_struct(Visitor *v, Error **errp) +static void qapi_dealloc_end_implicit_struct(Visitor *v) { QapiDeallocVisitor *qov = to_qov(v); void **obj = qapi_dealloc_pop(qov); @@ -99,8 +100,7 @@ static void qapi_dealloc_start_list(Visitor *v, const char *name, Error **errp) qapi_dealloc_push(qov, NULL); } -static GenericList *qapi_dealloc_next_list(Visitor *v, GenericList **listp, - Error **errp) +static GenericList *qapi_dealloc_next_list(Visitor *v, GenericList **listp) { GenericList *list = *listp; QapiDeallocVisitor *qov = to_qov(v); @@ -120,7 +120,7 @@ static GenericList *qapi_dealloc_next_list(Visitor *v, GenericList **listp, return NULL; } -static void qapi_dealloc_end_list(Visitor *v, Error **errp) +static void qapi_dealloc_end_list(Visitor *v) { QapiDeallocVisitor *qov = to_qov(v); void *obj = qapi_dealloc_pop(qov); diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c index 2be026c7db..f856286461 100644 --- a/qapi/qapi-visit-core.c +++ b/qapi/qapi-visit-core.c @@ -38,10 +38,10 @@ void visit_start_implicit_struct(Visitor *v, void **obj, size_t size, } } -void visit_end_implicit_struct(Visitor *v, Error **errp) +void visit_end_implicit_struct(Visitor *v) { if (v->end_implicit_struct) { - v->end_implicit_struct(v, errp); + v->end_implicit_struct(v); } } @@ -50,14 +50,14 @@ void visit_start_list(Visitor *v, const char *name, Error **errp) v->start_list(v, name, errp); } -GenericList *visit_next_list(Visitor *v, GenericList **list, Error **errp) +GenericList *visit_next_list(Visitor *v, GenericList **list) { - return v->next_list(v, list, errp); + return v->next_list(v, list); } -void visit_end_list(Visitor *v, Error **errp) +void visit_end_list(Visitor *v) { - v->end_list(v, errp); + v->end_list(v); } bool visit_start_union(Visitor *v, bool data_present, Error **errp) diff --git a/qapi/qmp-input-visitor.c b/qapi/qmp-input-visitor.c index 4563c20c13..362a1a33a8 100644 --- a/qapi/qmp-input-visitor.c +++ b/qapi/qmp-input-visitor.c @@ -1,6 +1,7 @@ /* * Input Visitor * + * Copyright (C) 2012-2016 Red Hat, Inc. * Copyright IBM, Corp. 2011 * * Authors: @@ -154,10 +155,6 @@ static void qmp_input_start_implicit_struct(Visitor *v, void **obj, } } -static void qmp_input_end_implicit_struct(Visitor *v, Error **errp) -{ -} - static void qmp_input_start_list(Visitor *v, const char *name, Error **errp) { QmpInputVisitor *qiv = to_qiv(v); @@ -172,8 +169,7 @@ static void qmp_input_start_list(Visitor *v, const char *name, Error **errp) qmp_input_push(qiv, qobj, errp); } -static GenericList *qmp_input_next_list(Visitor *v, GenericList **list, - Error **errp) +static GenericList *qmp_input_next_list(Visitor *v, GenericList **list) { QmpInputVisitor *qiv = to_qiv(v); GenericList *entry; @@ -202,7 +198,7 @@ static GenericList *qmp_input_next_list(Visitor *v, GenericList **list, return entry; } -static void qmp_input_end_list(Visitor *v, Error **errp) +static void qmp_input_end_list(Visitor *v) { QmpInputVisitor *qiv = to_qiv(v); @@ -353,7 +349,6 @@ QmpInputVisitor *qmp_input_visitor_new(QObject *obj) v->visitor.start_struct = qmp_input_start_struct; v->visitor.end_struct = qmp_input_end_struct; v->visitor.start_implicit_struct = qmp_input_start_implicit_struct; - v->visitor.end_implicit_struct = qmp_input_end_implicit_struct; v->visitor.start_list = qmp_input_start_list; v->visitor.next_list = qmp_input_next_list; v->visitor.end_list = qmp_input_end_list; diff --git a/qapi/qmp-output-visitor.c b/qapi/qmp-output-visitor.c index ff480a61a3..41f92c8ca9 100644 --- a/qapi/qmp-output-visitor.c +++ b/qapi/qmp-output-visitor.c @@ -1,6 +1,7 @@ /* * Core Definitions for QAPI/QMP Command Registry * + * Copyright (C) 2012-2016 Red Hat, Inc. * Copyright IBM, Corp. 2011 * * Authors: @@ -136,8 +137,7 @@ static void qmp_output_start_list(Visitor *v, const char *name, Error **errp) qmp_output_push(qov, list); } -static GenericList *qmp_output_next_list(Visitor *v, GenericList **listp, - Error **errp) +static GenericList *qmp_output_next_list(Visitor *v, GenericList **listp) { GenericList *list = *listp; QmpOutputVisitor *qov = to_qov(v); @@ -152,7 +152,7 @@ static GenericList *qmp_output_next_list(Visitor *v, GenericList **listp, return list ? list->next : NULL; } -static void qmp_output_end_list(Visitor *v, Error **errp) +static void qmp_output_end_list(Visitor *v) { QmpOutputVisitor *qov = to_qov(v); qmp_output_pop(qov); diff --git a/qapi/string-input-visitor.c b/qapi/string-input-visitor.c index cdf129cb7d..18b9339768 100644 --- a/qapi/string-input-visitor.c +++ b/qapi/string-input-visitor.c @@ -1,7 +1,7 @@ /* * String parsing visitor * - * Copyright Red Hat, Inc. 2012 + * Copyright Red Hat, Inc. 2012-2016 * * Author: Paolo Bonzini * @@ -139,8 +139,7 @@ start_list(Visitor *v, const char *name, Error **errp) } } -static GenericList * -next_list(Visitor *v, GenericList **list, Error **errp) +static GenericList *next_list(Visitor *v, GenericList **list) { StringInputVisitor *siv = to_siv(v); GenericList **link; @@ -178,8 +177,7 @@ next_list(Visitor *v, GenericList **list, Error **errp) return *link; } -static void -end_list(Visitor *v, Error **errp) +static void end_list(Visitor *v) { StringInputVisitor *siv = to_siv(v); siv->head = true; diff --git a/qapi/string-output-visitor.c b/qapi/string-output-visitor.c index 3ce6a3bf67..b980bd3265 100644 --- a/qapi/string-output-visitor.c +++ b/qapi/string-output-visitor.c @@ -1,7 +1,7 @@ /* * String printing Visitor * - * Copyright Red Hat, Inc. 2012 + * Copyright Red Hat, Inc. 2012-2016 * * Author: Paolo Bonzini * @@ -276,8 +276,7 @@ start_list(Visitor *v, const char *name, Error **errp) sov->head = true; } -static GenericList * -next_list(Visitor *v, GenericList **list, Error **errp) +static GenericList *next_list(Visitor *v, GenericList **list) { StringOutputVisitor *sov = to_sov(v); GenericList *ret = NULL; @@ -303,8 +302,7 @@ next_list(Visitor *v, GenericList **list, Error **errp) return ret; } -static void -end_list(Visitor *v, Error **errp) +static void end_list(Visitor *v) { StringOutputVisitor *sov = to_sov(v); diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py index 308000fbbe..0fdcebcca8 100644 --- a/scripts/qapi-visit.py +++ b/scripts/qapi-visit.py @@ -62,7 +62,7 @@ static void visit_type_implicit_%(c_type)s(Visitor *v, %(c_type)s **obj, Error * visit_start_implicit_struct(v, (void **)obj, sizeof(%(c_type)s), &err); if (!err) { visit_type_%(c_type)s_fields(v, obj, errp); - visit_end_implicit_struct(v, &err); + visit_end_implicit_struct(v); } error_propagate(errp, err); } @@ -161,15 +161,13 @@ void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error } for (prev = (GenericList **)obj; - !err && (i = visit_next_list(v, prev, &err)) != NULL; + !err && (i = visit_next_list(v, prev)) != NULL; prev = &i) { %(c_name)s *native_i = (%(c_name)s *)i; visit_type_%(c_elt_type)s(v, NULL, &native_i->value, &err); } - error_propagate(errp, err); - err = NULL; - visit_end_list(v, &err); + visit_end_list(v); out: error_propagate(errp, err); } @@ -230,9 +228,7 @@ void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error "%(name)s"); } out_obj: - error_propagate(errp, err); - err = NULL; - visit_end_implicit_struct(v, &err); + visit_end_implicit_struct(v); out: error_propagate(errp, err); } -- cgit 1.4.1