qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 04/17] qapi: merge QInt and QFloat in QNum


From: Luiz Capitulino
Subject: Re: [Qemu-devel] [PATCH 04/17] qapi: merge QInt and QFloat in QNum
Date: Fri, 12 May 2017 09:03:35 -0400

On Fri, 12 May 2017 09:37:50 +0200
Markus Armbruster <address@hidden> wrote:

> Luiz, there's a lone question for you further down.  Search for your
> name.

I could not a question, can you paste it here?

> 
> Marc-André Lureau <address@hidden> writes:
> 
> > 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
> >
> > Signed-off-by: Marc-André Lureau <address@hidden>  
> [Snip part I already reviewed...]
> > diff --git a/tests/check-qdict.c b/tests/check-qdict.c
> > index be8d81f07b..bcd06a7d6b 100644
> > --- a/tests/check-qdict.c
> > +++ b/tests/check-qdict.c
> > @@ -11,7 +11,6 @@
> >   */
> >  #include "qemu/osdep.h"
> >  
> > -#include "qapi/qmp/qint.h"
> >  #include "qapi/qmp/qdict.h"
> >  #include "qapi/qmp/qstring.h"
> >  #include "qapi/error.h"
> > @@ -39,7 +38,7 @@ static void qdict_new_test(void)
> >  
> >  static void qdict_put_obj_test(void)
> >  {
> > -    QInt *qi;
> > +    QNum *qi;
> >      QDict *qdict;
> >      QDictEntry *ent;
> >      const int num = 42;
> > @@ -51,8 +50,8 @@ static void qdict_put_obj_test(void)
> >  
> >      g_assert(qdict_size(qdict) == 1);
> >      ent = QLIST_FIRST(&qdict->table[12345 % QDICT_BUCKET_MAX]);
> > -    qi = qobject_to_qint(ent->value);
> > -    g_assert(qint_get_int(qi) == num);
> > +    qi = qobject_to_qnum(ent->value);
> > +    g_assert(qnum_get_int(qi, &error_abort) == num);
> >  
> >      // destroy doesn't exit yet
> >      QDECREF(qi);  
> 
> Since you're touching three out of four lines containing @qi anyway:
> rename it to @qn?  You rename like that in some places, but not all.
> 
> > @@ -74,7 +73,7 @@ static void qdict_destroy_simple_test(void)
> >  
> >  static void qdict_get_test(void)
> >  {
> > -    QInt *qi;
> > +    QNum *qi;
> >      QObject *obj;
> >      const int value = -42;
> >      const char *key = "test";
> > @@ -85,8 +84,8 @@ static void qdict_get_test(void)
> >      obj = qdict_get(tests_dict, key);
> >      g_assert(obj != NULL);
> >  
> > -    qi = qobject_to_qint(obj);
> > -    g_assert(qint_get_int(qi) == value);
> > +    qi = qobject_to_qnum(obj);
> > +    g_assert(qnum_get_int(qi, &error_abort) == value);
> >  
> >      QDECREF(tests_dict);
> >  }
> > @@ -329,7 +328,7 @@ static void qdict_array_split_test(void)
> >  {
> >      QDict *test_dict = qdict_new();
> >      QDict *dict1, *dict2;
> > -    QInt *int1;
> > +    QNum *int1;
> >      QList *test_list;
> >  
> >      /*
> > @@ -380,7 +379,7 @@ static void qdict_array_split_test(void)
> >  
> >      dict1 = qobject_to_qdict(qlist_pop(test_list));
> >      dict2 = qobject_to_qdict(qlist_pop(test_list));
> > -    int1 = qobject_to_qint(qlist_pop(test_list));
> > +    int1 = qobject_to_qnum(qlist_pop(test_list));
> >  
> >      g_assert(dict1);
> >      g_assert(dict2);
> > @@ -402,7 +401,7 @@ static void qdict_array_split_test(void)
> >  
> >      QDECREF(dict2);
> >  
> > -    g_assert(qint_get_int(int1) == 66);
> > +    g_assert(qnum_get_int(int1, &error_abort) == 66);
> >  
> >      QDECREF(int1);
> >  
> > @@ -447,14 +446,14 @@ static void qdict_array_split_test(void)
> >  
> >      qdict_array_split(test_dict, &test_list);
> >  
> > -    int1 = qobject_to_qint(qlist_pop(test_list));
> > +    int1 = qobject_to_qnum(qlist_pop(test_list));
> >  
> >      g_assert(int1);
> >      g_assert(qlist_empty(test_list));
> >  
> >      QDECREF(test_list);
> >  
> > -    g_assert(qint_get_int(int1) == 42);
> > +    g_assert(qnum_get_int(int1, &error_abort) == 42);
> >  
> >      QDECREF(int1);
> >  
> > diff --git a/tests/check-qfloat.c b/tests/check-qfloat.c
> > deleted file mode 100644
> > index 1da2cdae08..0000000000
> > --- a/tests/check-qfloat.c
> > +++ /dev/null
> > @@ -1,53 +0,0 @@
> > -/*
> > - * QFloat unit-tests.
> > - *
> > - * Copyright IBM, Corp. 2009
> > - *
> > - * Authors:
> > - *  Anthony Liguori   <address@hidden>
> > - *
> > - * This work is licensed under the terms of the GNU LGPL, version 2.1 or 
> > later.
> > - * See the COPYING.LIB file in the top-level directory.
> > - *
> > - */
> > -#include "qemu/osdep.h"
> > -
> > -#include "qapi/qmp/qfloat.h"
> > -#include "qemu-common.h"
> > -
> > -/*
> > - * Public Interface test-cases
> > - *
> > - * (with some violations to access 'private' data)
> > - */
> > -
> > -static void qfloat_from_double_test(void)
> > -{
> > -    QFloat *qf;
> > -    const double value = -42.23423;
> > -
> > -    qf = qfloat_from_double(value);
> > -    g_assert(qf != NULL);
> > -    g_assert(qf->value == value);
> > -    g_assert(qf->base.refcnt == 1);
> > -    g_assert(qobject_type(QOBJECT(qf)) == QTYPE_QFLOAT);
> > -
> > -    // destroy doesn't exit yet
> > -    g_free(qf);
> > -}
> > -
> > -static void qfloat_destroy_test(void)
> > -{
> > -    QFloat *qf = qfloat_from_double(0.0);
> > -    QDECREF(qf);
> > -}
> > -
> > -int main(int argc, char **argv)
> > -{
> > -    g_test_init(&argc, &argv, NULL);
> > -
> > -    g_test_add_func("/public/from_double", qfloat_from_double_test);
> > -    g_test_add_func("/public/destroy", qfloat_destroy_test);
> > -
> > -    return g_test_run();
> > -}
> > diff --git a/tests/check-qint.c b/tests/check-qint.c
> > deleted file mode 100644
> > index b6e4555115..0000000000
> > --- a/tests/check-qint.c
> > +++ /dev/null
> > @@ -1,87 +0,0 @@
> > -/*
> > - * QInt unit-tests.
> > - *
> > - * Copyright (C) 2009 Red Hat Inc.
> > - *
> > - * Authors:
> > - *  Luiz Capitulino <address@hidden>
> > - *
> > - * This work is licensed under the terms of the GNU LGPL, version 2.1 or 
> > later.
> > - * See the COPYING.LIB file in the top-level directory.
> > - */
> > -#include "qemu/osdep.h"
> > -
> > -#include "qapi/qmp/qint.h"
> > -#include "qemu-common.h"
> > -
> > -/*
> > - * Public Interface test-cases
> > - *
> > - * (with some violations to access 'private' data)
> > - */
> > -
> > -static void qint_from_int_test(void)
> > -{
> > -    QInt *qi;
> > -    const int value = -42;
> > -
> > -    qi = qint_from_int(value);
> > -    g_assert(qi != NULL);
> > -    g_assert(qi->value == value);
> > -    g_assert(qi->base.refcnt == 1);
> > -    g_assert(qobject_type(QOBJECT(qi)) == QTYPE_QINT);
> > -
> > -    // destroy doesn't exit yet
> > -    g_free(qi);
> > -}
> > -
> > -static void qint_destroy_test(void)
> > -{
> > -    QInt *qi = qint_from_int(0);
> > -    QDECREF(qi);
> > -}
> > -
> > -static void qint_from_int64_test(void)
> > -{
> > -    QInt *qi;
> > -    const int64_t value = 0x1234567890abcdefLL;
> > -
> > -    qi = qint_from_int(value);
> > -    g_assert((int64_t) qi->value == value);
> > -
> > -    QDECREF(qi);
> > -}
> > -
> > -static void qint_get_int_test(void)
> > -{
> > -    QInt *qi;
> > -    const int value = 123456;
> > -
> > -    qi = qint_from_int(value);
> > -    g_assert(qint_get_int(qi) == value);
> > -
> > -    QDECREF(qi);
> > -}
> > -
> > -static void qobject_to_qint_test(void)
> > -{
> > -    QInt *qi;
> > -
> > -    qi = qint_from_int(0);
> > -    g_assert(qobject_to_qint(QOBJECT(qi)) == qi);
> > -
> > -    QDECREF(qi);
> > -}
> > -
> > -int main(int argc, char **argv)
> > -{
> > -    g_test_init(&argc, &argv, NULL);
> > -
> > -    g_test_add_func("/public/from_int", qint_from_int_test);
> > -    g_test_add_func("/public/destroy", qint_destroy_test);
> > -    g_test_add_func("/public/from_int64", qint_from_int64_test);
> > -    g_test_add_func("/public/get_int", qint_get_int_test);
> > -    g_test_add_func("/public/to_qint", qobject_to_qint_test);
> > -
> > -    return g_test_run();
> > -}
> > diff --git a/tests/check-qjson.c b/tests/check-qjson.c
> > index 963dd46f07..c432aebf13 100644
> > --- a/tests/check-qjson.c
> > +++ b/tests/check-qjson.c
> > @@ -886,21 +886,21 @@ static void simple_number(void)
> >      };
> >  
> >      for (i = 0; test_cases[i].encoded; i++) {
> > -        QInt *qint;
> > +        QNum *qnum;
> >  
> > -        qint = qobject_to_qint(qobject_from_json(test_cases[i].encoded,
> > +        qnum = qobject_to_qnum(qobject_from_json(test_cases[i].encoded,
> >                                                   &error_abort));
> > -        g_assert(qint);
> > -        g_assert(qint_get_int(qint) == test_cases[i].decoded);
> > +        g_assert(qnum);
> > +        g_assert(qnum_get_int(qnum, &error_abort) == 
> > test_cases[i].decoded);
> >          if (test_cases[i].skip == 0) {
> >              QString *str;
> >  
> > -            str = qobject_to_json(QOBJECT(qint));
> > +            str = qobject_to_json(QOBJECT(qnum));
> >              g_assert(strcmp(qstring_get_str(str), test_cases[i].encoded) 
> > == 0);
> >              QDECREF(str);
> >          }
> >  
> > -        QDECREF(qint);
> > +        QDECREF(qnum);
> >      }
> >  }
> >  
> > @@ -921,12 +921,12 @@ static void float_number(void)
> >  
> >      for (i = 0; test_cases[i].encoded; i++) {
> >          QObject *obj;
> > -        QFloat *qfloat;
> > +        QNum *qnum;
> >  
> >          obj = qobject_from_json(test_cases[i].encoded, &error_abort);
> > -        qfloat = qobject_to_qfloat(obj);
> > -        g_assert(qfloat);
> > -        g_assert(qfloat_get_double(qfloat) == test_cases[i].decoded);
> > +        qnum = qobject_to_qnum(obj);
> > +        g_assert(qnum);
> > +        g_assert(qnum_get_double(qnum) == test_cases[i].decoded);
> >  
> >          if (test_cases[i].skip == 0) {
> >              QString *str;
> > @@ -936,29 +936,28 @@ static void float_number(void)
> >              QDECREF(str);
> >          }
> >  
> > -        QDECREF(qfloat);
> > +        QDECREF(qnum);
> >      }
> >  }
> >  
> >  static void vararg_number(void)
> >  {
> > -    QInt *qint;
> > -    QFloat *qfloat;
> > +    QNum *qnum;
> >      int value = 0x2342;
> >      long long value_ll = 0x2342342343LL;
> >      double valuef = 2.323423423;
> >  
> > -    qint = qobject_to_qint(qobject_from_jsonf("%d", value));
> > -    g_assert(qint_get_int(qint) == value);
> > -    QDECREF(qint);
> > +    qnum = qobject_to_qnum(qobject_from_jsonf("%d", value));
> > +    g_assert(qnum_get_int(qnum, &error_abort) == value);
> > +    QDECREF(qnum);
> >  
> > -    qint = qobject_to_qint(qobject_from_jsonf("%lld", value_ll));
> > -    g_assert(qint_get_int(qint) == value_ll);
> > -    QDECREF(qint);
> > +    qnum = qobject_to_qnum(qobject_from_jsonf("%lld", value_ll));
> > +    g_assert(qnum_get_int(qnum, &error_abort) == value_ll);
> > +    QDECREF(qnum);
> >  
> > -    qfloat = qobject_to_qfloat(qobject_from_jsonf("%f", valuef));
> > -    g_assert(qfloat_get_double(qfloat) == valuef);
> > -    QDECREF(qfloat);
> > +    qnum = qobject_to_qnum(qobject_from_jsonf("%f", valuef));
> > +    g_assert(qnum_get_double(qnum) == valuef);
> > +    QDECREF(qnum);
> >  }
> >  
> >  static void keyword_literal(void)  
> 
> By now we see the pattern.  It's a mechanical transformation
> 
>     - qobject_to_qint(E)
>     + qobject_to_qnum(E)
> 
>     - qint_get_int(E)
>     + qnum_get_int(E, &error_abort)
> 
>     - qobject_to_qfloat(E)
>     + qobject_to_qnum(E)
> 
>     - qfloat_get_double(E)
>     + qnum_get_double(E)
> 
> plus replacement / merge of QInt / QFloat variables.  Did you do it
> entirely by hand or with help from Coccinelle?
> 
> A helper function qnum_get_int_nofail(E) would result in slightly more
> compact source code (object code probably, too), but I'm not sure it's
> worth it.
> 
> Other patterns that might justify helpers:
> 
>     qnum_get_double(qobject_to_qnum(OBJ))
>     qnum_get_int(qobject_to_qnum(OBJ), ERR)
>     qnum_get_int(qobject_to_qnum(OBJ), &error_abort)
> 
> These are ideas, not demands.
> 
> > @@ -1019,7 +1018,7 @@ struct LiteralQObject
> >  {
> >      int type;
> >      union {
> > -        int64_t qint;
> > +        int64_t qnum;
> >          const char *qstr;
> >          LiteralQDictEntry *qdict;
> >          LiteralQObject *qlist;
> > @@ -1032,7 +1031,7 @@ struct LiteralQDictEntry
> >      LiteralQObject value;
> >  };
> >  
> > -#define QLIT_QINT(val) (LiteralQObject){.type = QTYPE_QINT, .value.qint = 
> > (val)}
> > +#define QLIT_QNUM(val) (LiteralQObject){.type = QTYPE_QNUM, .value.qnum = 
> > (val)}
> >  #define QLIT_QSTR(val) (LiteralQObject){.type = QTYPE_QSTRING, .value.qstr 
> > = (val)}
> >  #define QLIT_QDICT(val) (LiteralQObject){.type = QTYPE_QDICT, .value.qdict 
> > = (val)}
> >  #define QLIT_QLIST(val) (LiteralQObject){.type = QTYPE_QLIST, .value.qlist 
> > = (val)}  
> 
> Aside: yet another private way to compare actual QObjects to expected
> ones.  We should pick *one* way to compare, and stick to it.
> 
> > @@ -1069,8 +1068,9 @@ static int compare_litqobj_to_qobj(LiteralQObject 
> > *lhs, QObject *rhs)
> >      }
> >  
> >      switch (lhs->type) {
> > -    case QTYPE_QINT:
> > -        return lhs->value.qint == qint_get_int(qobject_to_qint(rhs));
> > +    case QTYPE_QNUM:
> > +        return lhs->value.qnum == qnum_get_int(qobject_to_qnum(rhs),
> > +                                               &error_abort);
> >      case QTYPE_QSTRING:
> >          return (strcmp(lhs->value.qstr, 
> > qstring_get_str(qobject_to_qstring(rhs))) == 0);
> >      case QTYPE_QDICT: {
> > @@ -1114,7 +1114,7 @@ static void simple_dict(void)
> >          {
> >              .encoded = "{\"foo\": 42, \"bar\": \"hello world\"}",
> >              .decoded = QLIT_QDICT(((LiteralQDictEntry[]){
> > -                        { "foo", QLIT_QINT(42) },
> > +                        { "foo", QLIT_QNUM(42) },
> >                          { "bar", QLIT_QSTR("hello world") },
> >                          { }
> >                      })),
> > @@ -1126,7 +1126,7 @@ static void simple_dict(void)
> >          }, {
> >              .encoded = "{\"foo\": 43}",
> >              .decoded = QLIT_QDICT(((LiteralQDictEntry[]){
> > -                        { "foo", QLIT_QINT(43) },
> > +                        { "foo", QLIT_QNUM(43) },
> >                          { }
> >                      })),
> >          },
> > @@ -1212,15 +1212,15 @@ static void simple_list(void)
> >          {
> >              .encoded = "[43,42]",
> >              .decoded = QLIT_QLIST(((LiteralQObject[]){
> > -                        QLIT_QINT(43),
> > -                        QLIT_QINT(42),
> > +                        QLIT_QNUM(43),
> > +                        QLIT_QNUM(42),
> >                          { }
> >                      })),
> >          },
> >          {
> >              .encoded = "[43]",
> >              .decoded = QLIT_QLIST(((LiteralQObject[]){
> > -                        QLIT_QINT(43),
> > +                        QLIT_QNUM(43),
> >                          { }
> >                      })),
> >          },
> > @@ -1269,35 +1269,35 @@ static void simple_whitespace(void)
> >          {
> >              .encoded = " [ 43 , 42 ]",
> >              .decoded = QLIT_QLIST(((LiteralQObject[]){
> > -                        QLIT_QINT(43),
> > -                        QLIT_QINT(42),
> > +                        QLIT_QNUM(43),
> > +                        QLIT_QNUM(42),
> >                          { }
> >                      })),
> >          },
> >          {
> >              .encoded = " [ 43 , { 'h' : 'b' }, [ ], 42 ]",
> >              .decoded = QLIT_QLIST(((LiteralQObject[]){
> > -                        QLIT_QINT(43),
> > +                        QLIT_QNUM(43),
> >                          QLIT_QDICT(((LiteralQDictEntry[]){
> >                                      { "h", QLIT_QSTR("b") },
> >                                      { }})),
> >                          QLIT_QLIST(((LiteralQObject[]){
> >                                      { }})),
> > -                        QLIT_QINT(42),
> > +                        QLIT_QNUM(42),
> >                          { }
> >                      })),
> >          },
> >          {
> >              .encoded = " [ 43 , { 'h' : 'b' , 'a' : 32 }, [ ], 42 ]",
> >              .decoded = QLIT_QLIST(((LiteralQObject[]){
> > -                        QLIT_QINT(43),
> > +                        QLIT_QNUM(43),
> >                          QLIT_QDICT(((LiteralQDictEntry[]){
> >                                      { "h", QLIT_QSTR("b") },
> > -                                    { "a", QLIT_QINT(32) },
> > +                                    { "a", QLIT_QNUM(32) },
> >                                      { }})),
> >                          QLIT_QLIST(((LiteralQObject[]){
> >                                      { }})),
> > -                        QLIT_QINT(42),
> > +                        QLIT_QNUM(42),
> >                          { }
> >                      })),
> >          },
> > @@ -1327,11 +1327,11 @@ static void simple_varargs(void)
> >      QObject *embedded_obj;
> >      QObject *obj;
> >      LiteralQObject decoded = QLIT_QLIST(((LiteralQObject[]){
> > -            QLIT_QINT(1),
> > -            QLIT_QINT(2),
> > +            QLIT_QNUM(1),
> > +            QLIT_QNUM(2),
> >              QLIT_QLIST(((LiteralQObject[]){
> > -                        QLIT_QINT(32),
> > -                        QLIT_QINT(42),
> > +                        QLIT_QNUM(32),
> > +                        QLIT_QNUM(42),
> >                          {}})),
> >              {}}));
> >  
> > diff --git a/tests/check-qlist.c b/tests/check-qlist.c
> > index 4983867c27..a2d1701003 100644
> > --- a/tests/check-qlist.c
> > +++ b/tests/check-qlist.c
> > @@ -11,8 +11,8 @@
> >   */
> >  #include "qemu/osdep.h"
> >  
> > -#include "qapi/qmp/qint.h"
> > -#include "qapi/qmp/qlist.h"
> > +#include "qapi/error.h"
> > +#include "qapi/qmp/types.h"  
> 
> qapi/qmp/types.h is a lazy way to increase compile times by including
> more than you need.  One day I'll kill it.  Until then, I tolerate it in
> .c, but not in .h.  But I'd stick to just qlist.h and qnum.h here.
> 
> >  
> >  /*
> >   * Public Interface test-cases
> > @@ -35,11 +35,11 @@ static void qlist_new_test(void)
> >  
> >  static void qlist_append_test(void)
> >  {
> > -    QInt *qi;
> > +    QNum *qi;
> >      QList *qlist;
> >      QListEntry *entry;
> >  
> > -    qi = qint_from_int(42);
> > +    qi = qnum_from_int(42);
> >  
> >      qlist = qlist_new();
> >      qlist_append(qlist, qi);
> > @@ -84,13 +84,14 @@ static const int iter_max = 42;
> >  
> >  static void iter_func(QObject *obj, void *opaque)
> >  {
> > -    QInt *qi;
> > +    QNum *qi;
> >  
> >      g_assert(opaque == NULL);
> >  
> > -    qi = qobject_to_qint(obj);
> > +    qi = qobject_to_qnum(obj);
> >      g_assert(qi != NULL);
> > -    g_assert((qint_get_int(qi) >= 0) && (qint_get_int(qi) <= iter_max));
> > +    g_assert((qnum_get_int(qi, &error_abort) >= 0) &&
> > +             (qnum_get_int(qi, &error_abort) <= iter_max));
> >  
> >      iter_called++;
> >  }
> > diff --git a/tests/check-qnum.c b/tests/check-qnum.c
> > new file mode 100644
> > index 0000000000..d08d35e85a
> > --- /dev/null
> > +++ b/tests/check-qnum.c  
> 
> Let's compare to the old check-qint.c and check-qfloat.c.
> 
> > @@ -0,0 +1,131 @@
> > +/*
> > + * QNum unit-tests.
> > + *
> > + * Copyright (C) 2009 Red Hat Inc.  
> 
> Also merge check-qfloat.c's
> 
>     * Copyright IBM, Corp. 2009
> 
> here, and
> 
> > + *
> > + * Authors:
> > + *  Luiz Capitulino <address@hidden>  
> 
>     *  Anthony Liguori   <address@hidden>
> 
> here.
> 
> > + *
> > + * This work is licensed under the terms of the GNU LGPL, version 2.1 or 
> > later.
> > + * See the COPYING.LIB file in the top-level directory.
> > + */  
> 
> Blank line here, please.
> 
> > +#include "qemu/osdep.h"
> > +
> > +#include "qapi/qmp/qnum.h"
> > +#include "qapi/error.h"
> > +#include "qemu-common.h"
> > +
> > +/*
> > + * Public Interface test-cases
> > + *
> > + * (with some violations to access 'private' data)
> > + */  
> 
> I consider this comment close to useless.
> 
> > +
> > +static void qnum_from_int_test(void)
> > +{
> > +    QNum *qi;
> > +    const int value = -42;
> > +
> > +    qi = qnum_from_int(value);
> > +    g_assert(qi != NULL);  
> 
>        g_assert_cmpint(qi->type, ==, QNUM_I64);
> 
> > +    g_assert_cmpint(qi->u.i64, ==, value);
> > +    g_assert_cmpint(qi->base.refcnt, ==, 1);
> > +    g_assert_cmpint(qobject_type(QOBJECT(qi)), ==, QTYPE_QNUM);
> > +
> > +    // destroy doesn't exit yet
> > +    g_free(qi);
> > +}
> > +
> > +static void qnum_from_double_test(void)
> > +{
> > +    QNum *qf;
> > +    const double value = -42.23423;
> > +
> > +    qf = qnum_from_double(value);
> > +    g_assert(qf != NULL);  
> 
>        g_assert_cmpint(qf->type, ==, QNUM_DOUBLE);
> 
> > +    g_assert_cmpfloat(qf->u.dbl, ==, value);
> > +    g_assert_cmpint(qf->base.refcnt, ==, 1);
> > +    g_assert_cmpint(qobject_type(QOBJECT(qf)), ==, QTYPE_QNUM);
> > +
> > +    // destroy doesn't exit yet
> > +    g_free(qf);
> > +}  
> 
> Let's rename @qi and @qf to @qn.
> 
> > +
> > +static void qnum_from_int64_test(void)
> > +{
> > +    QNum *qi;
> > +    const int64_t value = 0x1234567890abcdefLL;
> > +
> > +    qi = qnum_from_int(value);
> > +    g_assert_cmpint((int64_t) qi->u.i64, ==, value);
> > +
> > +    QDECREF(qi);
> > +}
> > +
> > +static void qnum_get_int_test(void)
> > +{
> > +    QNum *qi;
> > +    const int value = 123456;
> > +
> > +    qi = qnum_from_int(value);
> > +    g_assert_cmpint(qnum_get_int(qi, &error_abort), ==, value);
> > +
> > +    QDECREF(qi);
> > +}
> > +
> > +static void qobject_to_qnum_test(void)
> > +{
> > +    QNum *qn;
> > +
> > +    qn = qnum_from_int(0);
> > +    g_assert(qobject_to_qnum(QOBJECT(qn)) == qn);
> > +    QDECREF(qn);
> > +
> > +    qn = qnum_from_double(0);
> > +    g_assert(qobject_to_qnum(QOBJECT(qn)) == qn);
> > +    QDECREF(qn);  
> 
> You added this one.  Makes sense, but announcing in the commit message
> that you're also adding test cases wouldn't hurt.
> 
> > +}
> > +
> > +static void qnum_to_string_test(void)
> > +{
> > +    QNum *qn;
> > +    char *tmp;
> > +
> > +    qn = qnum_from_int(123456);
> > +    tmp = qnum_to_string(qn);
> > +    g_assert_cmpstr(tmp, ==, "123456");
> > +    g_free(tmp);
> > +    QDECREF(qn);
> > +
> > +    qn = qnum_from_double(0.42);
> > +    tmp = qnum_to_string(qn);
> > +    g_assert_cmpstr(tmp, ==, "0.42");
> > +    g_free(tmp);
> > +    QDECREF(qn);  
> 
> Also new.  Good.
> 
> Test coverage could use further improvement, but this will do for now.
> 
> > +}
> > +
> > +static void qnum_destroy_test(void)
> > +{
> > +    QNum *qn;
> > +
> > +    qn = qnum_from_int(0);
> > +    QDECREF(qn);
> > +
> > +    qn = qnum_from_double(0.42);
> > +    QDECREF(qn);
> > +}
> > +
> > +int main(int argc, char **argv)
> > +{
> > +    g_test_init(&argc, &argv, NULL);
> > +
> > +    g_test_add_func("/qnum/from_int", qnum_from_int_test);
> > +    g_test_add_func("/qnum/from_double", qnum_from_double_test);
> > +    g_test_add_func("/qnum/destroy", qnum_destroy_test);
> > +    g_test_add_func("/qnum/from_int64", qnum_from_int64_test);
> > +    g_test_add_func("/qnum/get_int", qnum_get_int_test);
> > +    g_test_add_func("/qnum/to_qnum", qobject_to_qnum_test);
> > +    g_test_add_func("/qnum/to_string", qnum_to_string_test);
> > +
> > +    return g_test_run();
> > +}
> > diff --git a/tests/test-keyval.c b/tests/test-keyval.c
> > index df0ff831b5..bec574257e 100644
> > --- a/tests/test-keyval.c
> > +++ b/tests/test-keyval.c
> > @@ -611,7 +611,6 @@ static void test_keyval_visit_optional(void)
> >  
> >  static void test_keyval_visit_alternate(void)
> >  {
> > -    Error *err = NULL;
> >      Visitor *v;
> >      QDict *qdict;
> >      AltNumStr *ans;  
> 
> This belongs to PATCH 03.
> 
> > diff --git a/tests/test-qmp-commands.c b/tests/test-qmp-commands.c
> > index acdded4d67..96a52dbca8 100644
> > --- a/tests/test-qmp-commands.c
> > +++ b/tests/test-qmp-commands.c
> > @@ -162,7 +162,7 @@ static void test_dispatch_cmd_io(void)
> >      QDict *ud1b = qdict_new();
> >      QDict *ret, *ret_dict, *ret_dict_dict, *ret_dict_dict_userdef;
> >      QDict *ret_dict_dict2, *ret_dict_dict2_userdef;
> > -    QInt *ret3;
> > +    QNum *ret3;
> >  
> >      qdict_put_int(ud1a, "integer", 42);
> >      qdict_put_str(ud1a, "string", "hello");
> > @@ -194,8 +194,8 @@ static void test_dispatch_cmd_io(void)
> >      qdict_put(req, "arguments", args3);
> >      qdict_put_str(req, "execute", "guest-get-time");
> >  
> > -    ret3 = qobject_to_qint(test_qmp_dispatch(req));
> > -    assert(qint_get_int(ret3) == 66);
> > +    ret3 = qobject_to_qnum(test_qmp_dispatch(req));
> > +    assert(qnum_get_int(ret3, &error_abort) == 66);
> >      QDECREF(ret3);
> >  
> >      QDECREF(req);
> > diff --git a/tests/test-qmp-event.c b/tests/test-qmp-event.c
> > index 4c0f09601d..e996bebc6e 100644
> > --- a/tests/test-qmp-event.c
> > +++ b/tests/test-qmp-event.c
> > @@ -18,7 +18,6 @@
> >  #include "test-qapi-visit.h"
> >  #include "test-qapi-event.h"
> >  #include "qapi/qmp/types.h"
> > -#include "qapi/qmp/qint.h"
> >  #include "qapi/qmp/qobject.h"
> >  #include "qapi/qmp-event.h"
> >  
> > @@ -62,9 +61,9 @@ void qdict_cmp_do_simple(const char *key, QObject *obj1, 
> > void *opaque)
> >          d->result = (qbool_get_bool(qobject_to_qbool(obj1)) ==
> >                       qbool_get_bool(qobject_to_qbool(obj2)));
> >          return;
> > -    case QTYPE_QINT:
> > -        d->result = (qint_get_int(qobject_to_qint(obj1)) ==
> > -                     qint_get_int(qobject_to_qint(obj2)));
> > +    case QTYPE_QNUM:
> > +        d->result = (qnum_get_int(qobject_to_qnum(obj1), &error_abort) ==
> > +                     qnum_get_int(qobject_to_qnum(obj2), &error_abort));
> >          return;
> >      case QTYPE_QSTRING:
> >          d->result = g_strcmp0(qstring_get_str(qobject_to_qstring(obj1)),
> > diff --git a/tests/test-qobject-input-visitor.c 
> > b/tests/test-qobject-input-visitor.c
> > index a30e2d5e95..4484980969 100644
> > --- a/tests/test-qobject-input-visitor.c
> > +++ b/tests/test-qobject-input-visitor.c
> > @@ -152,7 +152,7 @@ static void 
> > test_visitor_in_int_overflow(TestInputVisitorData *data,
> >      Visitor *v;
> >  
> >      /* this will overflow a Qint/int64, so should be deserialized into
> > -     * a QFloat/double field instead, leading to an error if we pass it
> > +     * a QNum/double field instead, leading to an error if we pass it  
> 
> s#a Qint/int64#an int64_t#
> s#a QNum/double field#a double#
> 
> Or perhaps explain using QNUM_I64 and QNUM_DOUBLE.  Your choice.
> 
> >       * to visit_type_int. confirm this.
> >       */
> >      v = visitor_input_test_init(data, "%f", DBL_MAX);
> > @@ -428,7 +428,7 @@ static void test_visitor_in_any(TestInputVisitorData 
> > *data,
> >  {
> >      QObject *res = NULL;
> >      Visitor *v;
> > -    QInt *qint;
> > +    QNum *qnum;
> >      QBool *qbool;
> >      QString *qstring;
> >      QDict *qdict;
> > @@ -436,9 +436,9 @@ static void test_visitor_in_any(TestInputVisitorData 
> > *data,
> >  
> >      v = visitor_input_test_init(data, "-42");
> >      visit_type_any(v, NULL, &res, &error_abort);
> > -    qint = qobject_to_qint(res);
> > -    g_assert(qint);
> > -    g_assert_cmpint(qint_get_int(qint), ==, -42);
> > +    qnum = qobject_to_qnum(res);
> > +    g_assert(qnum);
> > +    g_assert_cmpint(qnum_get_int(qnum, &error_abort), ==, -42);
> >      qobject_decref(res);
> >  
> >      v = visitor_input_test_init(data, "{ 'integer': -42, 'boolean': true, 
> > 'string': 'foo' }");
> > @@ -447,9 +447,9 @@ static void test_visitor_in_any(TestInputVisitorData 
> > *data,
> >      g_assert(qdict && qdict_size(qdict) == 3);
> >      qobj = qdict_get(qdict, "integer");
> >      g_assert(qobj);
> > -    qint = qobject_to_qint(qobj);
> > -    g_assert(qint);
> > -    g_assert_cmpint(qint_get_int(qint), ==, -42);
> > +    qnum = qobject_to_qnum(qobj);
> > +    g_assert(qnum);
> > +    g_assert_cmpint(qnum_get_int(qnum, &error_abort), ==, -42);
> >      qobj = qdict_get(qdict, "boolean");
> >      g_assert(qobj);
> >      qbool = qobject_to_qbool(qobj);
> > @@ -527,7 +527,7 @@ static void 
> > test_visitor_in_alternate(TestInputVisitorData *data,
> >  
> >      v = visitor_input_test_init(data, "42");
> >      visit_type_UserDefAlternate(v, NULL, &tmp, &error_abort);
> > -    g_assert_cmpint(tmp->type, ==, QTYPE_QINT);
> > +    g_assert_cmpint(tmp->type, ==, QTYPE_QNUM);
> >      g_assert_cmpint(tmp->u.i, ==, 42);
> >      qapi_free_UserDefAlternate(tmp);
> >  
> > @@ -555,7 +555,7 @@ static void 
> > test_visitor_in_alternate(TestInputVisitorData *data,
> >  
> >      v = visitor_input_test_init(data, "{ 'alt': 42 }");
> >      visit_type_WrapAlternate(v, NULL, &wrap, &error_abort);
> > -    g_assert_cmpint(wrap->alt->type, ==, QTYPE_QINT);
> > +    g_assert_cmpint(wrap->alt->type, ==, QTYPE_QNUM);
> >      g_assert_cmpint(wrap->alt->u.i, ==, 42);
> >      qapi_free_WrapAlternate(wrap);
> >  
> > @@ -596,19 +596,19 @@ static void 
> > test_visitor_in_alternate_number(TestInputVisitorData *data,
> >  
> >      v = visitor_input_test_init(data, "42");
> >      visit_type_AltStrNum(v, NULL, &asn, &error_abort);
> > -    g_assert_cmpint(asn->type, ==, QTYPE_QFLOAT);
> > +    g_assert_cmpint(asn->type, ==, QTYPE_QNUM);
> >      g_assert_cmpfloat(asn->u.n, ==, 42);
> >      qapi_free_AltStrNum(asn);
> >  
> >      v = visitor_input_test_init(data, "42");
> >      visit_type_AltNumStr(v, NULL, &ans, &error_abort);
> > -    g_assert_cmpint(ans->type, ==, QTYPE_QFLOAT);
> > +    g_assert_cmpint(ans->type, ==, QTYPE_QNUM);
> >      g_assert_cmpfloat(ans->u.n, ==, 42);
> >      qapi_free_AltNumStr(ans);
> >  
> >      v = visitor_input_test_init(data, "42");
> >      visit_type_AltStrInt(v, NULL, &asi, &error_abort);
> > -    g_assert_cmpint(asi->type, ==, QTYPE_QINT);
> > +    g_assert_cmpint(asi->type, ==, QTYPE_QNUM);
> >      g_assert_cmpint(asi->u.i, ==, 42);
> >      qapi_free_AltStrInt(asi);
> >  
> > @@ -621,13 +621,13 @@ static void 
> > test_visitor_in_alternate_number(TestInputVisitorData *data,
> >  
> >      v = visitor_input_test_init(data, "42.5");
> >      visit_type_AltStrNum(v, NULL, &asn, &error_abort);
> > -    g_assert_cmpint(asn->type, ==, QTYPE_QFLOAT);
> > +    g_assert_cmpint(asn->type, ==, QTYPE_QNUM);
> >      g_assert_cmpfloat(asn->u.n, ==, 42.5);
> >      qapi_free_AltStrNum(asn);
> >  
> >      v = visitor_input_test_init(data, "42.5");
> >      visit_type_AltNumStr(v, NULL, &ans, &error_abort);
> > -    g_assert_cmpint(ans->type, ==, QTYPE_QFLOAT);
> > +    g_assert_cmpint(ans->type, ==, QTYPE_QNUM);
> >      g_assert_cmpfloat(ans->u.n, ==, 42.5);
> >      qapi_free_AltNumStr(ans);
> >  
> > diff --git a/tests/test-qobject-output-visitor.c 
> > b/tests/test-qobject-output-visitor.c
> > index 94b9518e40..66a682d5a8 100644
> > --- a/tests/test-qobject-output-visitor.c
> > +++ b/tests/test-qobject-output-visitor.c
> > @@ -58,13 +58,13 @@ static void test_visitor_out_int(TestOutputVisitorData 
> > *data,
> >                                   const void *unused)
> >  {
> >      int64_t value = -42;
> > -    QInt *qint;
> > +    QNum *qnum;
> >  
> >      visit_type_int(data->ov, NULL, &value, &error_abort);
> >  
> > -    qint = qobject_to_qint(visitor_get(data));
> > -    g_assert(qint);
> > -    g_assert_cmpint(qint_get_int(qint), ==, value);
> > +    qnum = qobject_to_qnum(visitor_get(data));
> > +    g_assert(qnum);
> > +    g_assert_cmpint(qnum_get_int(qnum, &error_abort), ==, value);
> >  }
> >  
> >  static void test_visitor_out_bool(TestOutputVisitorData *data,
> > @@ -84,13 +84,13 @@ static void 
> > test_visitor_out_number(TestOutputVisitorData *data,
> >                                      const void *unused)
> >  {
> >      double value = 3.14;
> > -    QFloat *qfloat;
> > +    QNum *qnum;
> >  
> >      visit_type_number(data->ov, NULL, &value, &error_abort);
> >  
> > -    qfloat = qobject_to_qfloat(visitor_get(data));
> > -    g_assert(qfloat);
> > -    g_assert(qfloat_get_double(qfloat) == value);
> > +    qnum = qobject_to_qnum(visitor_get(data));
> > +    g_assert(qnum);
> > +    g_assert(qnum_get_double(qnum) == value);
> >  }
> >  
> >  static void test_visitor_out_string(TestOutputVisitorData *data,
> > @@ -329,16 +329,16 @@ static void 
> > test_visitor_out_any(TestOutputVisitorData *data,
> >                                   const void *unused)
> >  {
> >      QObject *qobj;
> > -    QInt *qint;
> > +    QNum *qnum;
> >      QBool *qbool;
> >      QString *qstring;
> >      QDict *qdict;
> >  
> > -    qobj = QOBJECT(qint_from_int(-42));
> > +    qobj = QOBJECT(qnum_from_int(-42));
> >      visit_type_any(data->ov, NULL, &qobj, &error_abort);
> > -    qint = qobject_to_qint(visitor_get(data));
> > -    g_assert(qint);
> > -    g_assert_cmpint(qint_get_int(qint), ==, -42);
> > +    qnum = qobject_to_qnum(visitor_get(data));
> > +    g_assert(qnum);
> > +    g_assert_cmpint(qnum_get_int(qnum, &error_abort), ==, -42);
> >      qobject_decref(qobj);
> >  
> >      visitor_reset(data);
> > @@ -351,9 +351,9 @@ static void test_visitor_out_any(TestOutputVisitorData 
> > *data,
> >      qobject_decref(qobj);
> >      qdict = qobject_to_qdict(visitor_get(data));
> >      g_assert(qdict);
> > -    qint = qobject_to_qint(qdict_get(qdict, "integer"));
> > -    g_assert(qint);
> > -    g_assert_cmpint(qint_get_int(qint), ==, -42);
> > +    qnum = qobject_to_qnum(qdict_get(qdict, "integer"));
> > +    g_assert(qnum);
> > +    g_assert_cmpint(qnum_get_int(qnum, &error_abort), ==, -42);
> >      qbool = qobject_to_qbool(qdict_get(qdict, "boolean"));
> >      g_assert(qbool);
> >      g_assert(qbool_get_bool(qbool) == true);
> > @@ -388,18 +388,18 @@ static void 
> > test_visitor_out_alternate(TestOutputVisitorData *data,
> >                                         const void *unused)
> >  {
> >      UserDefAlternate *tmp;
> > -    QInt *qint;
> > +    QNum *qnum;
> >      QString *qstr;
> >      QDict *qdict;
> >  
> >      tmp = g_new0(UserDefAlternate, 1);
> > -    tmp->type = QTYPE_QINT;
> > +    tmp->type = QTYPE_QNUM;
> >      tmp->u.i = 42;
> >  
> >      visit_type_UserDefAlternate(data->ov, NULL, &tmp, &error_abort);
> > -    qint = qobject_to_qint(visitor_get(data));
> > -    g_assert(qint);
> > -    g_assert_cmpint(qint_get_int(qint), ==, 42);
> > +    qnum = qobject_to_qnum(visitor_get(data));
> > +    g_assert(qnum);
> > +    g_assert_cmpint(qnum_get_int(qnum, &error_abort), ==, 42);
> >  
> >      qapi_free_UserDefAlternate(tmp);
> >  
> > @@ -603,18 +603,18 @@ static void check_native_list(QObject *qobj,
> >      case USER_DEF_NATIVE_LIST_UNION_KIND_U16:
> >      case USER_DEF_NATIVE_LIST_UNION_KIND_U32:
> >      case USER_DEF_NATIVE_LIST_UNION_KIND_U64:
> > -        /* all integer elements in JSON arrays get stored into QInts when
> > +        /* all integer elements in JSON arrays get stored into QNums when  
> 
> Please use the opportunity to wing the comment at both ends and start
> with a capital letter:
> 
>            /*
>             * All integer ...
> 
> >           * we convert to QObjects, so we can check them all in the same
> >           * fashion, so simply fall through here
> >           */
> >      case USER_DEF_NATIVE_LIST_UNION_KIND_INTEGER:
> >          for (i = 0; i < 32; i++) {
> >              QObject *tmp;
> > -            QInt *qvalue;
> > +            QNum *qvalue;
> >              tmp = qlist_peek(qlist);
> >              g_assert(tmp);
> > -            qvalue = qobject_to_qint(tmp);
> > -            g_assert_cmpint(qint_get_int(qvalue), ==, i);
> > +            qvalue = qobject_to_qnum(tmp);
> > +            g_assert_cmpint(qnum_get_int(qvalue, &error_abort), ==, i);
> >              qobject_decref(qlist_pop(qlist));
> >          }
> >          break;
> > @@ -645,15 +645,15 @@ static void check_native_list(QObject *qobj,
> >      case USER_DEF_NATIVE_LIST_UNION_KIND_NUMBER:
> >          for (i = 0; i < 32; i++) {
> >              QObject *tmp;
> > -            QFloat *qvalue;
> > +            QNum *qvalue;
> >              GString *double_expected = g_string_new("");
> >              GString *double_actual = g_string_new("");
> >  
> >              tmp = qlist_peek(qlist);
> >              g_assert(tmp);
> > -            qvalue = qobject_to_qfloat(tmp);
> > +            qvalue = qobject_to_qnum(tmp);
> >              g_string_printf(double_expected, "%.6f", (double)i / 3);
> > -            g_string_printf(double_actual, "%.6f", 
> > qfloat_get_double(qvalue));
> > +            g_string_printf(double_actual, "%.6f", 
> > qnum_get_double(qvalue));
> >              g_assert_cmpstr(double_actual->str, ==, double_expected->str);
> >  
> >              qobject_decref(qlist_pop(qlist));
> > diff --git a/tests/test-x86-cpuid-compat.c b/tests/test-x86-cpuid-compat.c
> > index 79a2e69a28..60d168fda8 100644
> > --- a/tests/test-x86-cpuid-compat.c
> > +++ b/tests/test-x86-cpuid-compat.c
> > @@ -1,9 +1,7 @@
> >  #include "qemu/osdep.h"
> >  #include "qemu-common.h"
> > -#include "qapi/qmp/qlist.h"
> > -#include "qapi/qmp/qdict.h"
> > -#include "qapi/qmp/qint.h"
> > -#include "qapi/qmp/qbool.h"
> > +#include "qapi/error.h"
> > +#include "qapi/qmp/types.h"  
> 
> Previous note on qapi/qmp/types.h applies.
> 
> >  #include "libqtest.h"
> >  
> >  static char *get_cpu0_qom_path(void)
> > @@ -56,12 +54,13 @@ static void test_cpuid_prop(const void *data)
> >  {
> >      const CpuidTestArgs *args = data;
> >      char *path;
> > -    QInt *value;
> > +    QNum *value;
> >  
> >      qtest_start(args->cmdline);
> >      path = get_cpu0_qom_path();
> > -    value = qobject_to_qint(qom_get(path, args->property));
> > -    g_assert_cmpint(qint_get_int(value), ==, args->expected_value);
> > +    value = qobject_to_qnum(qom_get(path, args->property));
> > +    g_assert_cmpint(qnum_get_int(value, &error_abort), ==,
> > +                    args->expected_value);
> >      qtest_end();
> >  
> >      QDECREF(value);
> > diff --git a/ui/spice-core.c b/ui/spice-core.c
> > index 804abc5c0f..561d0649cf 100644
> > --- a/ui/spice-core.c
> > +++ b/ui/spice-core.c
> > @@ -30,7 +30,6 @@
> >  #include "qemu-x509.h"
> >  #include "qemu/sockets.h"
> >  #include "qmp-commands.h"
> > -#include "qapi/qmp/qint.h"
> >  #include "qapi/qmp/qbool.h"
> >  #include "qapi/qmp/qstring.h"
> >  #include "qapi/qmp/qjson.h"
> > diff --git a/ui/vnc-enc-tight.c b/ui/vnc-enc-tight.c
> > index 1e53b1cf84..89ab12c0d8 100644
> > --- a/ui/vnc-enc-tight.c
> > +++ b/ui/vnc-enc-tight.c
> > @@ -44,7 +44,6 @@
> >  #endif
> >  
> >  #include "qemu/bswap.h"
> > -#include "qapi/qmp/qint.h"
> >  #include "vnc.h"
> >  #include "vnc-enc-tight.h"
> >  #include "vnc-palette.h"
> > diff --git a/util/qemu-option.c b/util/qemu-option.c
> > index 5977bfc3e9..39b1e06225 100644
> > --- a/util/qemu-option.c
> > +++ b/util/qemu-option.c
> > @@ -941,9 +941,8 @@ typedef struct OptsFromQDictState {
> >  static void qemu_opts_from_qdict_1(const char *key, QObject *obj, void 
> > *opaque)
> >  {
> >      OptsFromQDictState *state = opaque;
> > -    char buf[32];
> > +    char buf[32], *tmp = NULL;
> >      const char *value;
> > -    int n;
> >  
> >      if (!strcmp(key, "id") || *state->errp) {
> >          return;
> > @@ -953,17 +952,9 @@ static void qemu_opts_from_qdict_1(const char *key, 
> > QObject *obj, void *opaque)
> >      case QTYPE_QSTRING:
> >          value = qstring_get_str(qobject_to_qstring(obj));
> >          break;
> > -    case QTYPE_QINT:
> > -        n = snprintf(buf, sizeof(buf), "%" PRId64,
> > -                     qint_get_int(qobject_to_qint(obj)));
> > -        assert(n < sizeof(buf));
> > -        value = buf;
> > -        break;
> > -    case QTYPE_QFLOAT:
> > -        n = snprintf(buf, sizeof(buf), "%.17g",
> > -                     qfloat_get_double(qobject_to_qfloat(obj)));
> > -        assert(n < sizeof(buf));
> > -        value = buf;
> > +    case QTYPE_QNUM:
> > +        tmp = qnum_to_string(qobject_to_qnum(obj));
> > +        value = tmp;
> >          break;
> >      case QTYPE_QBOOL:
> >          pstrcpy(buf, sizeof(buf),
> > @@ -975,12 +966,13 @@ static void qemu_opts_from_qdict_1(const char *key, 
> > QObject *obj, void *opaque)
> >      }
> >  
> >      qemu_opt_set(state->opts, key, value, state->errp);
> > +    g_free(tmp);
> >  }
> >  
> >  /*
> >   * Create QemuOpts from a QDict.
> >   * Use value of key "id" as ID if it exists and is a QString.
> > - * Only QStrings, QInts, QFloats and QBools are copied.  Entries with
> > + * Only QStrings, QNums and QBools are copied.  Entries with
> >   * other types are silently ignored.
> >   */  
> 
> Refill the sentence, please.
> 
> >  QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict,
> > diff --git a/MAINTAINERS b/MAINTAINERS
> > index 66c9734311..421fb585ae 100644
> > --- a/MAINTAINERS
> > +++ b/MAINTAINERS
> > @@ -1395,8 +1395,7 @@ F: include/qapi/qmp/
> >  X: include/qapi/qmp/dispatch.h
> >  F: scripts/coccinelle/qobject.cocci
> >  F: tests/check-qdict.c
> > -F: tests/check-qfloat.c
> > -F: tests/check-qint.c
> > +F: tests/check-qnum.c
> >  F: tests/check-qjson.c
> >  F: tests/check-qlist.c
> >  F: tests/check-qstring.c
> > diff --git a/qobject/Makefile.objs b/qobject/Makefile.objs
> > index bed55084bb..fc8885c9a4 100644
> > --- a/qobject/Makefile.objs
> > +++ b/qobject/Makefile.objs
> > @@ -1,2 +1,2 @@
> > -util-obj-y = qnull.o qint.o qstring.o qdict.o qlist.o qfloat.o qbool.o
> > +util-obj-y = qnull.o qnum.o qstring.o qdict.o qlist.o qbool.o
> >  util-obj-y += qjson.o qobject.o json-lexer.o json-streamer.o json-parser.o
> > diff --git a/scripts/coccinelle/qobject.cocci 
> > b/scripts/coccinelle/qobject.cocci
> > index 97703a438b..c3253deb1b 100644
> > --- a/scripts/coccinelle/qobject.cocci
> > +++ b/scripts/coccinelle/qobject.cocci
> > @@ -6,7 +6,7 @@ expression Obj, Key, E;
> >  - qdict_put_obj(Obj, Key, QOBJECT(E));
> >  + qdict_put(Obj, Key, E);
> >  |
> > -- qdict_put(Obj, Key, qint_from_int(E));
> > +- qdict_put(Obj, Key, qnum_from_int(E));
> >  + qdict_put_int(Obj, Key, E);
> >  |
> >  - qdict_put(Obj, Key, qbool_from_bool(E));
> > @@ -24,7 +24,7 @@ expression Obj, E;
> >  - qlist_append_obj(Obj, QOBJECT(E));
> >  + qlist_append(Obj, E);
> >  |
> > -- qlist_append(Obj, qint_from_int(E));
> > +- qlist_append(Obj, qnum_from_int(E));
> >  + qlist_append_int(Obj, E);
> >  |
> >  - qlist_append(Obj, qbool_from_bool(E));
> > diff --git a/tests/.gitignore b/tests/.gitignore
> > index a966740c2c..847f4f1474 100644
> > --- a/tests/.gitignore
> > +++ b/tests/.gitignore
> > @@ -1,7 +1,6 @@
> >  atomic_add-bench
> >  check-qdict
> > -check-qfloat
> > -check-qint
> > +check-qnum
> >  check-qjson
> >  check-qlist
> >  check-qnull
> > diff --git a/tests/Makefile.include b/tests/Makefile.include
> > index 31931c0d77..ac0387d88a 100644
> > --- a/tests/Makefile.include
> > +++ b/tests/Makefile.include
> > @@ -10,10 +10,8 @@ check-unit-y = tests/check-qdict$(EXESUF)
> >  gcov-files-check-qdict-y = qobject/qdict.c
> >  check-unit-y += tests/test-char$(EXESUF)
> >  gcov-files-check-qdict-y = chardev/char.c
> > -check-unit-y += tests/check-qfloat$(EXESUF)
> > -gcov-files-check-qfloat-y = qobject/qfloat.c
> > -check-unit-y += tests/check-qint$(EXESUF)
> > -gcov-files-check-qint-y = qobject/qint.c
> > +check-unit-y += tests/check-qnum$(EXESUF)
> > +gcov-files-check-qnum-y = qobject/qnum.c
> >  check-unit-y += tests/check-qstring$(EXESUF)
> >  gcov-files-check-qstring-y = qobject/qstring.c
> >  check-unit-y += tests/check-qlist$(EXESUF)
> > @@ -500,8 +498,8 @@ GENERATED_FILES += tests/test-qapi-types.h 
> > tests/test-qapi-visit.h \
> >     tests/test-qmp-commands.h tests/test-qapi-event.h \
> >     tests/test-qmp-introspect.h
> >  
> > -test-obj-y = tests/check-qint.o tests/check-qstring.o tests/check-qdict.o \
> > -   tests/check-qlist.o tests/check-qfloat.o tests/check-qnull.o \
> > +test-obj-y = tests/check-qnum.o tests/check-qstring.o tests/check-qdict.o \
> > +   tests/check-qlist.o tests/check-qnull.o \
> >     tests/check-qjson.o \
> >     tests/test-coroutine.o tests/test-string-output-visitor.o \
> >     tests/test-string-input-visitor.o tests/test-qobject-output-visitor.o \
> > @@ -529,11 +527,10 @@ test-crypto-obj-y = $(crypto-obj-y) $(test-qom-obj-y)
> >  test-io-obj-y = $(io-obj-y) $(test-crypto-obj-y)
> >  test-block-obj-y = $(block-obj-y) $(test-io-obj-y) tests/iothread.o
> >  
> > -tests/check-qint$(EXESUF): tests/check-qint.o $(test-util-obj-y)
> > +tests/check-qnum$(EXESUF): tests/check-qnum.o $(test-util-obj-y)
> >  tests/check-qstring$(EXESUF): tests/check-qstring.o $(test-util-obj-y)
> >  tests/check-qdict$(EXESUF): tests/check-qdict.o $(test-util-obj-y)
> >  tests/check-qlist$(EXESUF): tests/check-qlist.o $(test-util-obj-y)
> > -tests/check-qfloat$(EXESUF): tests/check-qfloat.o $(test-util-obj-y)
> >  tests/check-qnull$(EXESUF): tests/check-qnull.o $(test-util-obj-y)
> >  tests/check-qjson$(EXESUF): tests/check-qjson.o $(test-util-obj-y)
> >  tests/check-qom-interface$(EXESUF): tests/check-qom-interface.o 
> > $(test-qom-obj-y)
> > diff --git a/tests/qapi-schema/comments.out b/tests/qapi-schema/comments.out
> > index 5d7c13cad1..17e652535c 100644
> > --- a/tests/qapi-schema/comments.out
> > +++ b/tests/qapi-schema/comments.out
> > @@ -1,4 +1,4 @@
> > -enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 
> > 'qfloat', 'qbool']
> > +enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
> >      prefix QTYPE
> >  enum Status ['good', 'bad', 'ugly']
> >  object q_empty
> > diff --git a/tests/qapi-schema/doc-good.out b/tests/qapi-schema/doc-good.out
> > index 70c1252408..63ca25a8b9 100644
> > --- a/tests/qapi-schema/doc-good.out
> > +++ b/tests/qapi-schema/doc-good.out
> > @@ -6,7 +6,7 @@ object Object
> >      tag base1
> >      case one: Variant1
> >      case two: Variant2
> > -enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 
> > 'qfloat', 'qbool']
> > +enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
> >      prefix QTYPE
> >  object SugaredUnion
> >      member type: SugaredUnionKind optional=False
> > diff --git a/tests/qapi-schema/empty.out b/tests/qapi-schema/empty.out
> > index 8a5b034424..40b886ddae 100644
> > --- a/tests/qapi-schema/empty.out
> > +++ b/tests/qapi-schema/empty.out
> > @@ -1,3 +1,3 @@
> > -enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 
> > 'qfloat', 'qbool']
> > +enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
> >      prefix QTYPE
> >  object q_empty
> > diff --git a/tests/qapi-schema/event-case.out 
> > b/tests/qapi-schema/event-case.out
> > index 5a0f2bf805..313c0fe7be 100644
> > --- a/tests/qapi-schema/event-case.out
> > +++ b/tests/qapi-schema/event-case.out
> > @@ -1,4 +1,4 @@
> > -enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 
> > 'qfloat', 'qbool']
> > +enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
> >      prefix QTYPE
> >  event oops None
> >     boxed=False
> > diff --git a/tests/qapi-schema/ident-with-escape.out 
> > b/tests/qapi-schema/ident-with-escape.out
> > index 1d2722c02e..b5637cb2e0 100644
> > --- a/tests/qapi-schema/ident-with-escape.out
> > +++ b/tests/qapi-schema/ident-with-escape.out
> > @@ -1,4 +1,4 @@
> > -enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 
> > 'qfloat', 'qbool']
> > +enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
> >      prefix QTYPE
> >  command fooA q_obj_fooA-arg -> None
> >     gen=True success_response=True boxed=False
> > diff --git a/tests/qapi-schema/include-relpath.out 
> > b/tests/qapi-schema/include-relpath.out
> > index 5d7c13cad1..17e652535c 100644
> > --- a/tests/qapi-schema/include-relpath.out
> > +++ b/tests/qapi-schema/include-relpath.out
> > @@ -1,4 +1,4 @@
> > -enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 
> > 'qfloat', 'qbool']
> > +enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
> >      prefix QTYPE
> >  enum Status ['good', 'bad', 'ugly']
> >  object q_empty
> > diff --git a/tests/qapi-schema/include-repetition.out 
> > b/tests/qapi-schema/include-repetition.out
> > index 5d7c13cad1..17e652535c 100644
> > --- a/tests/qapi-schema/include-repetition.out
> > +++ b/tests/qapi-schema/include-repetition.out
> > @@ -1,4 +1,4 @@
> > -enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 
> > 'qfloat', 'qbool']
> > +enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
> >      prefix QTYPE
> >  enum Status ['good', 'bad', 'ugly']
> >  object q_empty
> > diff --git a/tests/qapi-schema/include-simple.out 
> > b/tests/qapi-schema/include-simple.out
> > index 5d7c13cad1..17e652535c 100644
> > --- a/tests/qapi-schema/include-simple.out
> > +++ b/tests/qapi-schema/include-simple.out
> > @@ -1,4 +1,4 @@
> > -enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 
> > 'qfloat', 'qbool']
> > +enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
> >      prefix QTYPE
> >  enum Status ['good', 'bad', 'ugly']
> >  object q_empty
> > diff --git a/tests/qapi-schema/indented-expr.out 
> > b/tests/qapi-schema/indented-expr.out
> > index e8171c935f..586795f44d 100644
> > --- a/tests/qapi-schema/indented-expr.out
> > +++ b/tests/qapi-schema/indented-expr.out
> > @@ -1,4 +1,4 @@
> > -enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 
> > 'qfloat', 'qbool']
> > +enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
> >      prefix QTYPE
> >  command eins None -> None
> >     gen=True success_response=True boxed=False
> > diff --git a/tests/qapi-schema/qapi-schema-test.out 
> > b/tests/qapi-schema/qapi-schema-test.out
> > index 5c6655a5c3..7812a6c69b 100644
> > --- a/tests/qapi-schema/qapi-schema-test.out
> > +++ b/tests/qapi-schema/qapi-schema-test.out
> > @@ -46,7 +46,7 @@ object NestedEnumsOne
> >      member enum4: EnumOne optional=True
> >  enum QEnumTwo ['value1', 'value2']
> >      prefix QENUM_TWO
> > -enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 
> > 'qfloat', 'qbool']
> > +enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
> >      prefix QTYPE
> >  object TestStruct
> >      member integer: int optional=False  
> 
> I still like it :)
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]