From 58634047b7deeab36e4b07c4744e44d698975561 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Wed, 7 Jun 2017 20:35:57 +0400 Subject: qapi: Clean up qobject_input_type_number() control flow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use the more common pattern to error out. Signed-off-by: Marc-André Lureau Message-Id: <20170607163635.17635-6-marcandre.lureau@redhat.com> Reviewed-by: Markus Armbruster [Commit message tweaked] Signed-off-by: Markus Armbruster --- qapi/qobject-input-visitor.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'qapi/qobject-input-visitor.c') diff --git a/qapi/qobject-input-visitor.c b/qapi/qobject-input-visitor.c index eac40f6..26ef49a 100644 --- a/qapi/qobject-input-visitor.c +++ b/qapi/qobject-input-visitor.c @@ -547,13 +547,13 @@ static void qobject_input_type_number(Visitor *v, const char *name, double *obj, } qfloat = qobject_to_qfloat(qobj); - if (qfloat) { - *obj = qfloat_get_double(qobject_to_qfloat(qobj)); + if (!qfloat) { + error_setg(errp, QERR_INVALID_PARAMETER_TYPE, + full_name(qiv, name), "number"); return; } - error_setg(errp, QERR_INVALID_PARAMETER_TYPE, - full_name(qiv, name), "number"); + *obj = qfloat_get_double(qobject_to_qfloat(qobj)); } static void qobject_input_type_number_keyval(Visitor *v, const char *name, -- cgit v1.1 From 01b2ffcedd94ad7b42bc870e4c6936c87ad03429 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Wed, 7 Jun 2017 20:35:58 +0400 Subject: qapi: merge QInt and QFloat in QNum MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We would like to use a same QObject type to represent numbers, whether they are int, uint, or floats. Getters will allow some compatibility between the various types if the number fits other representations. Add a few more tests while at it. Signed-off-by: Marc-André Lureau Message-Id: <20170607163635.17635-7-marcandre.lureau@redhat.com> Reviewed-by: Markus Armbruster [parse_stats_intervals() simplified a bit, comment in test_visitor_in_int_overflow() tidied up, suppress bogus warnings] Signed-off-by: Markus Armbruster --- qapi/qobject-input-visitor.c | 41 +++++++++++++---------------------------- 1 file changed, 13 insertions(+), 28 deletions(-) (limited to 'qapi/qobject-input-visitor.c') diff --git a/qapi/qobject-input-visitor.c b/qapi/qobject-input-visitor.c index 26ef49a..b24f99d 100644 --- a/qapi/qobject-input-visitor.c +++ b/qapi/qobject-input-visitor.c @@ -378,9 +378,6 @@ static void qobject_input_start_alternate(Visitor *v, const char *name, } *obj = g_malloc0(size); (*obj)->type = qobject_type(qobj); - if (promote_int && (*obj)->type == QTYPE_QINT) { - (*obj)->type = QTYPE_QFLOAT; - } } static void qobject_input_type_int64(Visitor *v, const char *name, int64_t *obj, @@ -388,22 +385,18 @@ static void qobject_input_type_int64(Visitor *v, const char *name, int64_t *obj, { QObjectInputVisitor *qiv = to_qiv(v); QObject *qobj = qobject_input_get_object(qiv, name, true, errp); - QInt *qint; + QNum *qnum; if (!qobj) { return; } - qint = qobject_to_qint(qobj); - if (!qint) { + qnum = 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; } - - *obj = qint_get_int(qint); } - static void qobject_input_type_int64_keyval(Visitor *v, const char *name, int64_t *obj, Error **errp) { @@ -424,22 +417,21 @@ static void qobject_input_type_int64_keyval(Visitor *v, const char *name, static void qobject_input_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp) { - /* FIXME: qobject_to_qint mishandles values over INT64_MAX */ + /* FIXME: qobject_to_qnum mishandles values over INT64_MAX */ QObjectInputVisitor *qiv = to_qiv(v); QObject *qobj = qobject_input_get_object(qiv, name, true, errp); - QInt *qint; + QNum *qnum; + int64_t val; if (!qobj) { return; } - qint = qobject_to_qint(qobj); - if (!qint) { + qnum = qobject_to_qnum(qobj); + if (!qnum || !qnum_get_try_int(qnum, &val)) { error_setg(errp, QERR_INVALID_PARAMETER_TYPE, full_name(qiv, name), "integer"); - return; } - - *obj = qint_get_int(qint); + *obj = val; } static void qobject_input_type_uint64_keyval(Visitor *v, const char *name, @@ -534,26 +526,19 @@ static void qobject_input_type_number(Visitor *v, const char *name, double *obj, { QObjectInputVisitor *qiv = to_qiv(v); QObject *qobj = qobject_input_get_object(qiv, name, true, errp); - QInt *qint; - QFloat *qfloat; + QNum *qnum; if (!qobj) { return; } - qint = qobject_to_qint(qobj); - if (qint) { - *obj = qint_get_int(qobject_to_qint(qobj)); - return; - } - - qfloat = qobject_to_qfloat(qobj); - if (!qfloat) { + qnum = qobject_to_qnum(qobj); + if (!qnum) { error_setg(errp, QERR_INVALID_PARAMETER_TYPE, full_name(qiv, name), "number"); return; } - *obj = qfloat_get_double(qobject_to_qfloat(qobj)); + *obj = qnum_get_double(qnum); } static void qobject_input_type_number_keyval(Visitor *v, const char *name, -- cgit v1.1 From 60390d2dc85ffade8981ca41e02335cb07353a6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Wed, 7 Jun 2017 20:35:59 +0400 Subject: qapi: Remove visit_start_alternate() parameter promote_int MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before the previous commit, parameter promote_int = true made visit_start_alternate() with an input visitor avoid QTYPE_QINT variants and create QTYPE_QFLOAT variants instead. This was used where QTYPE_QINT variants were invalid. The previous commit fused QTYPE_QINT with QTYPE_QFLOAT, rendering promote_int useless and unused. Signed-off-by: Marc-André Lureau Reviewed-by: Markus Armbruster Message-Id: <20170607163635.17635-8-marcandre.lureau@redhat.com> Signed-off-by: Markus Armbruster --- qapi/qobject-input-visitor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'qapi/qobject-input-visitor.c') diff --git a/qapi/qobject-input-visitor.c b/qapi/qobject-input-visitor.c index b24f99d..539b3b8 100644 --- a/qapi/qobject-input-visitor.c +++ b/qapi/qobject-input-visitor.c @@ -367,7 +367,7 @@ static void qobject_input_end_list(Visitor *v, void **obj) static void qobject_input_start_alternate(Visitor *v, const char *name, GenericAlternate **obj, size_t size, - bool promote_int, Error **errp) + Error **errp) { QObjectInputVisitor *qiv = to_qiv(v); QObject *qobj = qobject_input_get_object(qiv, name, false, errp); -- cgit v1.1 From 5923f85fb82df7c8c60a89458a5ae856045e5ab1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Wed, 7 Jun 2017 20:36:03 +0400 Subject: qapi: update the qobject visitor to use QNUM_U64 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Switch to use QNum/uint where appropriate to remove i64 limitation. The input visitor will cast i64 input to u64 for compatibility reasons (existing json QMP client already use negative i64 for large u64, and expect an implicit cast in qemu). Note: before the patch, uint64_t values above INT64_MAX are sent over json QMP as negative values, e.g. UINT64_MAX is sent as -1. After the patch, they are sent unmodified. Clearly a bug fix, but we have to consider compatibility issues anyway. libvirt should cope fine, because its parsing of unsigned integers accepts negative values modulo 2^64. There's hope that other clients will, too. Signed-off-by: Marc-André Lureau Reviewed-by: Markus Armbruster Message-Id: <20170607163635.17635-12-marcandre.lureau@redhat.com> [check_native_list() tweaked for consistency with signed case] Signed-off-by: Markus Armbruster --- qapi/qobject-input-visitor.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'qapi/qobject-input-visitor.c') diff --git a/qapi/qobject-input-visitor.c b/qapi/qobject-input-visitor.c index 539b3b8..35aff78 100644 --- a/qapi/qobject-input-visitor.c +++ b/qapi/qobject-input-visitor.c @@ -417,7 +417,6 @@ static void qobject_input_type_int64_keyval(Visitor *v, const char *name, static void qobject_input_type_uint64(Visitor *v, const char *name, uint64_t *obj, Error **errp) { - /* FIXME: qobject_to_qnum mishandles values over INT64_MAX */ QObjectInputVisitor *qiv = to_qiv(v); QObject *qobj = qobject_input_get_object(qiv, name, true, errp); QNum *qnum; @@ -427,11 +426,23 @@ static void qobject_input_type_uint64(Visitor *v, const char *name, return; } qnum = qobject_to_qnum(qobj); - if (!qnum || !qnum_get_try_int(qnum, &val)) { - error_setg(errp, QERR_INVALID_PARAMETER_TYPE, - full_name(qiv, name), "integer"); + if (!qnum) { + goto err; + } + + if (qnum_get_try_uint(qnum, obj)) { + return; } - *obj = val; + + /* Need to accept negative values for backward compatibility */ + if (qnum_get_try_int(qnum, &val)) { + *obj = val; + return; + } + +err: + error_setg(errp, QERR_INVALID_PARAMETER_VALUE, + full_name(qiv, name), "uint64"); } static void qobject_input_type_uint64_keyval(Visitor *v, const char *name, -- cgit v1.1