Commit 43771d5d authored by Peter Maydell's avatar Peter Maydell
Browse files

Merge remote-tracking branch 'remotes/armbru/tags/pull-qapi-2017-05-31' into staging



QAPI patches for 2017-05-31

# gpg: Signature made Wed 31 May 2017 18:06:39 BST
# gpg:                using RSA key 0x3870B400EB918653
# gpg: Good signature from "Markus Armbruster <armbru@redhat.com>"
# gpg:                 aka "Markus Armbruster <armbru@pond.sub.org>"
# Primary key fingerprint: 354B C8B3 D7EB 2A6B 6867  4E5F 3870 B400 EB91 8653

* remotes/armbru/tags/pull-qapi-2017-05-31:
  qapi: Reject alternates that can't work with keyval_parse()
  tests/qapi-schema: Avoid 'str' in alternate test cases
  qapi: Document visit_type_any() issues with keyval input
  qobject-input-visitor: Reject non-finite numbers with keyval

Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
parents c077a998 c0644771
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -607,6 +607,10 @@ void visit_type_number(Visitor *v, const char *name, double *obj,
 * @obj must be non-NULL.  Input visitors set *@obj to the value;
 * other visitors will leave *@obj unchanged.  *@obj must be non-NULL
 * for output visitors.
 *
 * 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 **errp);

+2 −1
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@
 */

#include "qemu/osdep.h"
#include <math.h>
#include "qapi/error.h"
#include "qapi/qobject-input-visitor.h"
#include "qapi/visitor-impl.h"
@@ -568,7 +569,7 @@ static void qobject_input_type_number_keyval(Visitor *v, const char *name,

    errno = 0;
    *obj = strtod(str, &endp);
    if (errno || endp == str || *endp) {
    if (errno || endp == str || *endp || !isfinite(*obj)) {
        /* TODO report -ERANGE more nicely */
        error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
                   full_name(qiv, name), "number");
+17 −2
Original line number Diff line number Diff line
@@ -812,11 +812,26 @@ def check_alternate(expr, info):
        if not qtype:
            raise QAPISemError(info, "Alternate '%s' member '%s' cannot use "
                               "type '%s'" % (name, key, value))
        if qtype in types_seen:
        conflicting = set([qtype])
        if qtype == 'QTYPE_QSTRING':
            enum_expr = enum_types.get(value)
            if enum_expr:
                for v in enum_expr['data']:
                    if v in ['on', 'off']:
                        conflicting.add('QTYPE_QBOOL')
                    if re.match(r'[-+0-9.]', v): # lazy, could be tightened
                        conflicting.add('QTYPE_QINT')
                        conflicting.add('QTYPE_QFLOAT')
            else:
                conflicting.add('QTYPE_QINT')
                conflicting.add('QTYPE_QFLOAT')
                conflicting.add('QTYPE_QBOOL')
        if conflicting & set(types_seen):
            raise QAPISemError(info, "Alternate '%s' member '%s' can't "
                               "be distinguished from member '%s'"
                               % (name, key, types_seen[qtype]))
        types_seen[qtype] = key
        for qt in conflicting:
            types_seen[qt] = key


def check_enum(expr, info):
+2 −0
Original line number Diff line number Diff line
@@ -342,6 +342,8 @@ qapi-schema += alternate-array.json
qapi-schema += alternate-base.json
qapi-schema += alternate-clash.json
qapi-schema += alternate-conflict-dict.json
qapi-schema += alternate-conflict-enum-bool.json
qapi-schema += alternate-conflict-enum-int.json
qapi-schema += alternate-conflict-string.json
qapi-schema += alternate-empty.json
qapi-schema += alternate-nested.json
+1 −1
Original line number Diff line number Diff line
@@ -5,4 +5,4 @@
# the implicit Alt1Kind enum, we would still have a collision with the
# resulting C union trying to have two members named 'a_b'.
{ 'alternate': 'Alt1',
  'data': { 'a-b': 'str', 'a_b': 'int' } }
  'data': { 'a-b': 'bool', 'a_b': 'int' } }
Loading