All of lore.kernel.org
 help / color / mirror / Atom feed
From: Luiz Capitulino <lcapitulino@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: "Marc-André Lureau" <marcandre.lureau@redhat.com>, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 04/17] qapi: merge QInt and QFloat in QNum
Date: Fri, 12 May 2017 09:03:35 -0400	[thread overview]
Message-ID: <20170512090335.6b20c3ec@redhat.com> (raw)
In-Reply-To: <874lwqjzjl.fsf@dusky.pond.sub.org>

On Fri, 12 May 2017 09:37:50 +0200
Markus Armbruster <armbru@redhat.com> 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 <marcandre.lureau@redhat.com> 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 <marcandre.lureau@redhat.com>  
> [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   <aliguori@us.ibm.com>
> > - *
> > - * 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 <lcapitulino@redhat.com>
> > - *
> > - * 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 <lcapitulino@redhat.com>  
> 
>     *  Anthony Liguori   <aliguori@us.ibm.com>
> 
> 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	other threads:[~2017-05-12 13:03 UTC|newest]

Thread overview: 70+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-09 17:35 [Qemu-devel] [PATCH 00/17] qobject/qapi: add uint type Marc-André Lureau
2017-05-09 17:35 ` [Qemu-devel] [PATCH 01/17] qdev: remove PropertyInfo.qtype field Marc-André Lureau
2017-05-09 18:40   ` Eric Blake
2017-05-11 11:59     ` Markus Armbruster
2017-05-11 12:07       ` Paolo Bonzini
2017-05-09 17:35 ` [Qemu-devel] [PATCH 02/17] object: fix potential leak in getters Marc-André Lureau
2017-05-09 18:44   ` Eric Blake
2017-05-09 17:35 ` [Qemu-devel] [PATCH 03/17] tests: remove alt num-int cases Marc-André Lureau
2017-05-09 18:51   ` Eric Blake
2017-05-11 12:34     ` Markus Armbruster
2017-05-22 17:03   ` Markus Armbruster
2017-05-30  3:40     ` Fam Zheng
2017-05-30 14:17       ` Eric Blake
2017-05-09 17:35 ` [Qemu-devel] [PATCH 04/17] qapi: merge QInt and QFloat in QNum Marc-André Lureau
2017-05-11 14:29   ` Markus Armbruster
2017-05-11 15:09     ` Eric Blake
2017-05-30  7:32     ` Marc-André Lureau
2017-05-30 14:19       ` Eric Blake
2017-05-30 14:23       ` Markus Armbruster
2017-05-30 15:36         ` Marc-André Lureau
2017-06-02  6:30           ` Markus Armbruster
2017-06-02 11:18             ` Marc-André Lureau
2017-05-12  6:30   ` Markus Armbruster
2017-05-12 13:00     ` Luiz Capitulino
2017-05-15  7:00       ` Markus Armbruster
2017-05-12  7:37   ` Markus Armbruster
2017-05-12 13:03     ` Luiz Capitulino [this message]
2017-05-15  6:35       ` Markus Armbruster
2017-05-09 17:35 ` [Qemu-devel] [PATCH 05/17] qapi: remove promote_int Marc-André Lureau
2017-05-11 17:30   ` Markus Armbruster
2017-05-09 17:35 ` [Qemu-devel] [PATCH 06/17] qnum: add uint type Marc-André Lureau
2017-05-15  7:27   ` Markus Armbruster
2017-05-09 17:35 ` [Qemu-devel] [PATCH 07/17] json: learn to parse uint64 numbers Marc-André Lureau
2017-05-15 13:59   ` Markus Armbruster
2017-05-30 11:35     ` Marc-André Lureau
2017-05-30 14:22       ` Eric Blake
2017-05-31  7:38         ` Marc-André Lureau
2017-05-31 10:08       ` Markus Armbruster
2017-05-31 10:53         ` Marc-André Lureau
2017-05-09 17:35 ` [Qemu-devel] [PATCH 08/17] qapi: update the qobject visitor to use QUInt Marc-André Lureau
2017-05-16 17:31   ` Markus Armbruster
2017-05-17 16:26     ` Markus Armbruster
2017-05-30 12:28     ` Marc-André Lureau
2017-05-31 13:10       ` Markus Armbruster
2017-05-09 17:35 ` [Qemu-devel] [PATCH 09/17] qnum: fix get_int() with values > INT64_MAX Marc-André Lureau
2017-05-16 17:35   ` Markus Armbruster
2017-05-09 17:35 ` [Qemu-devel] [PATCH 10/17] object: add uint property setter/getter Marc-André Lureau
2017-05-16 17:41   ` Markus Armbruster
2017-05-09 17:35 ` [Qemu-devel] [PATCH 11/17] object: use more specific property type names Marc-André Lureau
2017-05-17  8:49   ` Markus Armbruster
2017-05-30 13:58     ` Marc-André Lureau
2017-05-31 13:18       ` Markus Armbruster
2017-05-09 17:35 ` [Qemu-devel] [PATCH 12/17] qdev: use int and uint properties as appropriate Marc-André Lureau
2017-05-17 11:09   ` Markus Armbruster
2017-05-09 17:35 ` [Qemu-devel] [PATCH 13/17] qdev: use appropriate getter/setters type Marc-André Lureau
2017-05-17 17:42   ` Markus Armbruster
2017-05-09 17:35 ` [Qemu-devel] [PATCH 14/17] acpi: fix s3/s4 disabled type Marc-André Lureau
2017-05-13 20:49   ` Philippe Mathieu-Daudé
2017-05-18 12:57   ` Markus Armbruster
2017-05-31 11:10     ` Marc-André Lureau
2017-05-31 13:23       ` Markus Armbruster
2017-05-31 13:26         ` Marc-André Lureau
2017-05-09 17:35 ` [Qemu-devel] [PATCH 15/17] Use uint property getter/setter where appropriate Marc-André Lureau
2017-05-18 15:20   ` Markus Armbruster
2017-05-31 12:22     ` Marc-André Lureau
2017-05-09 17:35 ` [Qemu-devel] [PATCH 16/17] RFC: qdict: add uint Marc-André Lureau
2017-05-18 15:27   ` Markus Armbruster
2017-05-09 17:35 ` [Qemu-devel] [PATCH 17/17] qobject: move dump_qobject() from block/ to qobject/ Marc-André Lureau
2017-05-13 21:41 ` [Qemu-devel] [PATCH 00/17] qobject/qapi: add uint type no-reply
2017-05-18 15:39 ` Markus Armbruster

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170512090335.6b20c3ec@redhat.com \
    --to=lcapitulino@redhat.com \
    --cc=armbru@redhat.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.