qapi: merge QInt and QFloat in QNum
We would like to use a same QObject type to represent numbers, whether they are int, uint, or floats. Getters will allow some compatibility between the various types if the number fits other representations. Add a few more tests while at it. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-Id: <20170607163635.17635-7-marcandre.lureau@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> [parse_stats_intervals() simplified a bit, comment in test_visitor_in_int_overflow() tidied up, suppress bogus warnings] Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
parent
58634047b7
commit
01b2ffcedd
|
@ -1411,8 +1411,7 @@ F: include/qapi/qmp/
|
||||||
X: include/qapi/qmp/dispatch.h
|
X: include/qapi/qmp/dispatch.h
|
||||||
F: scripts/coccinelle/qobject.cocci
|
F: scripts/coccinelle/qobject.cocci
|
||||||
F: tests/check-qdict.c
|
F: tests/check-qdict.c
|
||||||
F: tests/check-qfloat.c
|
F: tests/check-qnum.c
|
||||||
F: tests/check-qint.c
|
|
||||||
F: tests/check-qjson.c
|
F: tests/check-qjson.c
|
||||||
F: tests/check-qlist.c
|
F: tests/check-qlist.c
|
||||||
F: tests/check-qstring.c
|
F: tests/check-qstring.c
|
||||||
|
|
|
@ -31,7 +31,6 @@
|
||||||
#include "qemu/module.h"
|
#include "qemu/module.h"
|
||||||
#include "qapi/qmp/qbool.h"
|
#include "qapi/qmp/qbool.h"
|
||||||
#include "qapi/qmp/qdict.h"
|
#include "qapi/qmp/qdict.h"
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
#include "sysemu/qtest.h"
|
#include "sysemu/qtest.h"
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,6 @@
|
||||||
#include "qapi/qobject-output-visitor.h"
|
#include "qapi/qobject-output-visitor.h"
|
||||||
#include "qapi/qmp/qdict.h"
|
#include "qapi/qmp/qdict.h"
|
||||||
#include "qapi/qmp/qjson.h"
|
#include "qapi/qmp/qjson.h"
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
#include "qemu/cutils.h"
|
#include "qemu/cutils.h"
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,6 @@
|
||||||
#include "qemu/cutils.h"
|
#include "qemu/cutils.h"
|
||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "qapi/qmp/qdict.h"
|
#include "qapi/qmp/qdict.h"
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
#include "qapi-visit.h"
|
#include "qapi-visit.h"
|
||||||
#include "qapi/qobject-input-visitor.h"
|
#include "qapi/qobject-input-visitor.h"
|
||||||
|
|
13
block/qapi.c
13
block/qapi.c
|
@ -595,9 +595,11 @@ static void dump_qobject(fprintf_function func_fprintf, void *f,
|
||||||
int comp_indent, QObject *obj)
|
int comp_indent, QObject *obj)
|
||||||
{
|
{
|
||||||
switch (qobject_type(obj)) {
|
switch (qobject_type(obj)) {
|
||||||
case QTYPE_QINT: {
|
case QTYPE_QNUM: {
|
||||||
QInt *value = qobject_to_qint(obj);
|
QNum *value = qobject_to_qnum(obj);
|
||||||
func_fprintf(f, "%" PRId64, qint_get_int(value));
|
char *tmp = qnum_to_string(value);
|
||||||
|
func_fprintf(f, "%s", tmp);
|
||||||
|
g_free(tmp);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case QTYPE_QSTRING: {
|
case QTYPE_QSTRING: {
|
||||||
|
@ -615,11 +617,6 @@ static void dump_qobject(fprintf_function func_fprintf, void *f,
|
||||||
dump_qlist(func_fprintf, f, comp_indent, value);
|
dump_qlist(func_fprintf, f, comp_indent, value);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case QTYPE_QFLOAT: {
|
|
||||||
QFloat *value = qobject_to_qfloat(obj);
|
|
||||||
func_fprintf(f, "%g", qfloat_get_double(value));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case QTYPE_QBOOL: {
|
case QTYPE_QBOOL: {
|
||||||
QBool *value = qobject_to_qbool(obj);
|
QBool *value = qobject_to_qbool(obj);
|
||||||
func_fprintf(f, "%s", qbool_get_bool(value) ? "true" : "false");
|
func_fprintf(f, "%s", qbool_get_bool(value) ? "true" : "false");
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
#include "qapi/qmp/qbool.h"
|
#include "qapi/qmp/qbool.h"
|
||||||
#include "qapi/qmp/qdict.h"
|
#include "qapi/qmp/qdict.h"
|
||||||
#include "qapi/qmp/qerror.h"
|
#include "qapi/qmp/qerror.h"
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qmp/qjson.h"
|
#include "qapi/qmp/qjson.h"
|
||||||
#include "qapi/qmp/qlist.h"
|
#include "qapi/qmp/qlist.h"
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
|
|
|
@ -16,7 +16,6 @@
|
||||||
#include "qapi-visit.h"
|
#include "qapi-visit.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
#include "qapi/qmp/qdict.h"
|
#include "qapi/qmp/qdict.h"
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qobject-input-visitor.h"
|
#include "qapi/qobject-input-visitor.h"
|
||||||
#include "qemu/uri.h"
|
#include "qemu/uri.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
|
|
|
@ -34,7 +34,6 @@
|
||||||
#include "qemu/sockets.h"
|
#include "qemu/sockets.h"
|
||||||
#include "qemu/uri.h"
|
#include "qemu/uri.h"
|
||||||
#include "qapi-visit.h"
|
#include "qapi-visit.h"
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
#include "qapi/qobject-input-visitor.h"
|
#include "qapi/qobject-input-visitor.h"
|
||||||
#include "qapi/qobject-output-visitor.h"
|
#include "qapi/qobject-output-visitor.h"
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
#include "qemu/module.h"
|
#include "qemu/module.h"
|
||||||
#include "qemu/bswap.h"
|
#include "qemu/bswap.h"
|
||||||
#include "migration/blocker.h"
|
#include "migration/blocker.h"
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qmp/qbool.h"
|
#include "qapi/qmp/qbool.h"
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
#include "qemu/cutils.h"
|
#include "qemu/cutils.h"
|
||||||
|
|
|
@ -334,8 +334,9 @@ static bool parse_stats_intervals(BlockAcctStats *stats, QList *intervals,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case QTYPE_QINT: {
|
case QTYPE_QNUM: {
|
||||||
int64_t length = qint_get_int(qobject_to_qint(entry->value));
|
int64_t length = qnum_get_int(qobject_to_qnum(entry->value));
|
||||||
|
|
||||||
if (length > 0 && length <= UINT_MAX) {
|
if (length > 0 && length <= UINT_MAX) {
|
||||||
block_acct_add_interval(stats, (unsigned) length);
|
block_acct_add_interval(stats, (unsigned) length);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -37,7 +37,6 @@
|
||||||
#include "hw/pci/pci_bus.h"
|
#include "hw/pci/pci_bus.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
#include "qom/qom-qobject.h"
|
#include "qom/qom-qobject.h"
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
|
|
||||||
//#define DEBUG
|
//#define DEBUG
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,6 @@
|
||||||
|
|
||||||
#include "hw/acpi/aml-build.h"
|
#include "hw/acpi/aml-build.h"
|
||||||
|
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qom/qom-qobject.h"
|
#include "qom/qom-qobject.h"
|
||||||
#include "hw/i386/amd_iommu.h"
|
#include "hw/i386/amd_iommu.h"
|
||||||
#include "hw/i386/intel_iommu.h"
|
#include "hw/i386/intel_iommu.h"
|
||||||
|
@ -150,21 +149,21 @@ static void acpi_get_pm_info(AcpiPmInfo *pm)
|
||||||
/* Fill in optional s3/s4 related properties */
|
/* Fill in optional s3/s4 related properties */
|
||||||
o = object_property_get_qobject(obj, ACPI_PM_PROP_S3_DISABLED, NULL);
|
o = object_property_get_qobject(obj, ACPI_PM_PROP_S3_DISABLED, NULL);
|
||||||
if (o) {
|
if (o) {
|
||||||
pm->s3_disabled = qint_get_int(qobject_to_qint(o));
|
pm->s3_disabled = qnum_get_int(qobject_to_qnum(o));
|
||||||
} else {
|
} else {
|
||||||
pm->s3_disabled = false;
|
pm->s3_disabled = false;
|
||||||
}
|
}
|
||||||
qobject_decref(o);
|
qobject_decref(o);
|
||||||
o = object_property_get_qobject(obj, ACPI_PM_PROP_S4_DISABLED, NULL);
|
o = object_property_get_qobject(obj, ACPI_PM_PROP_S4_DISABLED, NULL);
|
||||||
if (o) {
|
if (o) {
|
||||||
pm->s4_disabled = qint_get_int(qobject_to_qint(o));
|
pm->s4_disabled = qnum_get_int(qobject_to_qnum(o));
|
||||||
} else {
|
} else {
|
||||||
pm->s4_disabled = false;
|
pm->s4_disabled = false;
|
||||||
}
|
}
|
||||||
qobject_decref(o);
|
qobject_decref(o);
|
||||||
o = object_property_get_qobject(obj, ACPI_PM_PROP_S4_VAL, NULL);
|
o = object_property_get_qobject(obj, ACPI_PM_PROP_S4_VAL, NULL);
|
||||||
if (o) {
|
if (o) {
|
||||||
pm->s4_val = qint_get_int(qobject_to_qint(o));
|
pm->s4_val = qnum_get_int(qobject_to_qnum(o));
|
||||||
} else {
|
} else {
|
||||||
pm->s4_val = false;
|
pm->s4_val = false;
|
||||||
}
|
}
|
||||||
|
@ -529,7 +528,7 @@ static void build_append_pci_bus_devices(Aml *parent_scope, PCIBus *bus,
|
||||||
|
|
||||||
bsel = object_property_get_qobject(OBJECT(bus), ACPI_PCIHP_PROP_BSEL, NULL);
|
bsel = object_property_get_qobject(OBJECT(bus), ACPI_PCIHP_PROP_BSEL, NULL);
|
||||||
if (bsel) {
|
if (bsel) {
|
||||||
int64_t bsel_val = qint_get_int(qobject_to_qint(bsel));
|
int64_t bsel_val = qnum_get_int(qobject_to_qnum(bsel));
|
||||||
|
|
||||||
aml_append(parent_scope, aml_name_decl("BSEL", aml_int(bsel_val)));
|
aml_append(parent_scope, aml_name_decl("BSEL", aml_int(bsel_val)));
|
||||||
notify_method = aml_method("DVNT", 2, AML_NOTSERIALIZED);
|
notify_method = aml_method("DVNT", 2, AML_NOTSERIALIZED);
|
||||||
|
@ -639,7 +638,8 @@ static void build_append_pci_bus_devices(Aml *parent_scope, PCIBus *bus,
|
||||||
|
|
||||||
/* If bus supports hotplug select it and notify about local events */
|
/* If bus supports hotplug select it and notify about local events */
|
||||||
if (bsel) {
|
if (bsel) {
|
||||||
int64_t bsel_val = qint_get_int(qobject_to_qint(bsel));
|
int64_t bsel_val = qnum_get_int(qobject_to_qnum(bsel));
|
||||||
|
|
||||||
aml_append(method, aml_store(aml_int(bsel_val), aml_name("BNUM")));
|
aml_append(method, aml_store(aml_int(bsel_val), aml_name("BNUM")));
|
||||||
aml_append(method,
|
aml_append(method,
|
||||||
aml_call2("DVNT", aml_name("PCIU"), aml_int(1) /* Device Check */)
|
aml_call2("DVNT", aml_name("PCIU"), aml_int(1) /* Device Check */)
|
||||||
|
@ -2614,12 +2614,12 @@ static bool acpi_get_mcfg(AcpiMcfgInfo *mcfg)
|
||||||
if (!o) {
|
if (!o) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
mcfg->mcfg_base = qint_get_int(qobject_to_qint(o));
|
mcfg->mcfg_base = qnum_get_int(qobject_to_qnum(o));
|
||||||
qobject_decref(o);
|
qobject_decref(o);
|
||||||
|
|
||||||
o = object_property_get_qobject(pci_host, PCIE_HOST_MCFG_SIZE, NULL);
|
o = object_property_get_qobject(pci_host, PCIE_HOST_MCFG_SIZE, NULL);
|
||||||
assert(o);
|
assert(o);
|
||||||
mcfg->mcfg_size = qint_get_int(qobject_to_qint(o));
|
mcfg->mcfg_size = qnum_get_int(qobject_to_qnum(o));
|
||||||
qobject_decref(o);
|
qobject_decref(o);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,6 @@
|
||||||
#include "hw/xen/xen_backend.h"
|
#include "hw/xen/xen_backend.h"
|
||||||
#include "monitor/qdev.h"
|
#include "monitor/qdev.h"
|
||||||
#include "qapi/qmp/qbool.h"
|
#include "qapi/qmp/qbool.h"
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
|
|
||||||
#include "hw/xen/io/ring.h"
|
#include "hw/xen/io/ring.h"
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
#include "qapi/qmp/qobject.h"
|
#include "qapi/qmp/qobject.h"
|
||||||
#include "qapi/qmp/qlist.h"
|
#include "qapi/qmp/qlist.h"
|
||||||
|
#include "qapi/qmp/qnum.h"
|
||||||
#include "qemu/queue.h"
|
#include "qemu/queue.h"
|
||||||
|
|
||||||
#define QDICT_BUCKET_MAX 512
|
#define QDICT_BUCKET_MAX 512
|
||||||
|
@ -54,7 +55,7 @@ void qdict_destroy_obj(QObject *obj);
|
||||||
|
|
||||||
/* Helpers for int, bool, and string */
|
/* Helpers for int, bool, and string */
|
||||||
#define qdict_put_int(qdict, key, value) \
|
#define qdict_put_int(qdict, key, value) \
|
||||||
qdict_put(qdict, key, qint_from_int(value))
|
qdict_put(qdict, key, qnum_from_int(value))
|
||||||
#define qdict_put_bool(qdict, key, value) \
|
#define qdict_put_bool(qdict, key, value) \
|
||||||
qdict_put(qdict, key, qbool_from_bool(value))
|
qdict_put(qdict, key, qbool_from_bool(value))
|
||||||
#define qdict_put_str(qdict, key, value) \
|
#define qdict_put_str(qdict, key, value) \
|
||||||
|
|
|
@ -1,29 +0,0 @@
|
||||||
/*
|
|
||||||
* QFloat Module
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef QFLOAT_H
|
|
||||||
#define QFLOAT_H
|
|
||||||
|
|
||||||
#include "qapi/qmp/qobject.h"
|
|
||||||
|
|
||||||
typedef struct QFloat {
|
|
||||||
QObject base;
|
|
||||||
double value;
|
|
||||||
} QFloat;
|
|
||||||
|
|
||||||
QFloat *qfloat_from_double(double value);
|
|
||||||
double qfloat_get_double(const QFloat *qi);
|
|
||||||
QFloat *qobject_to_qfloat(const QObject *obj);
|
|
||||||
void qfloat_destroy_obj(QObject *obj);
|
|
||||||
|
|
||||||
#endif /* QFLOAT_H */
|
|
|
@ -1,28 +0,0 @@
|
||||||
/*
|
|
||||||
* QInt Module
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef QINT_H
|
|
||||||
#define QINT_H
|
|
||||||
|
|
||||||
#include "qapi/qmp/qobject.h"
|
|
||||||
|
|
||||||
typedef struct QInt {
|
|
||||||
QObject base;
|
|
||||||
int64_t value;
|
|
||||||
} QInt;
|
|
||||||
|
|
||||||
QInt *qint_from_int(int64_t value);
|
|
||||||
int64_t qint_get_int(const QInt *qi);
|
|
||||||
QInt *qobject_to_qint(const QObject *obj);
|
|
||||||
void qint_destroy_obj(QObject *obj);
|
|
||||||
|
|
||||||
#endif /* QINT_H */
|
|
|
@ -14,6 +14,7 @@
|
||||||
#define QLIST_H
|
#define QLIST_H
|
||||||
|
|
||||||
#include "qapi/qmp/qobject.h"
|
#include "qapi/qmp/qobject.h"
|
||||||
|
#include "qapi/qmp/qnum.h"
|
||||||
#include "qemu/queue.h"
|
#include "qemu/queue.h"
|
||||||
|
|
||||||
typedef struct QListEntry {
|
typedef struct QListEntry {
|
||||||
|
@ -31,7 +32,7 @@ typedef struct QList {
|
||||||
|
|
||||||
/* Helpers for int, bool, and string */
|
/* Helpers for int, bool, and string */
|
||||||
#define qlist_append_int(qlist, value) \
|
#define qlist_append_int(qlist, value) \
|
||||||
qlist_append(qlist, qint_from_int(value))
|
qlist_append(qlist, qnum_from_int(value))
|
||||||
#define qlist_append_bool(qlist, value) \
|
#define qlist_append_bool(qlist, value) \
|
||||||
qlist_append(qlist, qbool_from_bool(value))
|
qlist_append(qlist, qbool_from_bool(value))
|
||||||
#define qlist_append_str(qlist, value) \
|
#define qlist_append_str(qlist, value) \
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* QNum Module
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Red Hat Inc.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Luiz Capitulino <lcapitulino@redhat.com>
|
||||||
|
* Anthony Liguori <aliguori@us.ibm.com>
|
||||||
|
* Marc-André Lureau <marcandre.lureau@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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef QNUM_H
|
||||||
|
#define QNUM_H
|
||||||
|
|
||||||
|
#include "qapi/qmp/qobject.h"
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
QNUM_I64,
|
||||||
|
QNUM_DOUBLE
|
||||||
|
} QNumKind;
|
||||||
|
|
||||||
|
typedef struct QNum {
|
||||||
|
QObject base;
|
||||||
|
QNumKind kind;
|
||||||
|
union {
|
||||||
|
int64_t i64;
|
||||||
|
double dbl;
|
||||||
|
} u;
|
||||||
|
} QNum;
|
||||||
|
|
||||||
|
QNum *qnum_from_int(int64_t value);
|
||||||
|
QNum *qnum_from_double(double value);
|
||||||
|
|
||||||
|
bool qnum_get_try_int(const QNum *qn, int64_t *val);
|
||||||
|
int64_t qnum_get_int(const QNum *qn);
|
||||||
|
double qnum_get_double(QNum *qn);
|
||||||
|
|
||||||
|
char *qnum_to_string(QNum *qn);
|
||||||
|
|
||||||
|
QNum *qobject_to_qnum(const QObject *obj);
|
||||||
|
void qnum_destroy_obj(QObject *obj);
|
||||||
|
|
||||||
|
#endif /* QNUM_H */
|
|
@ -14,8 +14,7 @@
|
||||||
#define QAPI_QMP_TYPES_H
|
#define QAPI_QMP_TYPES_H
|
||||||
|
|
||||||
#include "qapi/qmp/qobject.h"
|
#include "qapi/qmp/qobject.h"
|
||||||
#include "qapi/qmp/qint.h"
|
#include "qapi/qmp/qnum.h"
|
||||||
#include "qapi/qmp/qfloat.h"
|
|
||||||
#include "qapi/qmp/qbool.h"
|
#include "qapi/qmp/qbool.h"
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
#include "qapi/qmp/qdict.h"
|
#include "qapi/qmp/qdict.h"
|
||||||
|
|
|
@ -30,9 +30,9 @@ typedef struct QObjectInputVisitor QObjectInputVisitor;
|
||||||
* visit_type_FOO() creates an instance of QAPI type FOO. The visited
|
* visit_type_FOO() creates an instance of QAPI type FOO. The visited
|
||||||
* QObject must match FOO. QDict matches struct/union types, QList
|
* QObject must match FOO. QDict matches struct/union types, QList
|
||||||
* matches list types, QString matches type 'str' and enumeration
|
* matches list types, QString matches type 'str' and enumeration
|
||||||
* types, QInt matches integer types, QFloat matches type 'number',
|
* types, QNum matches integer and float types, QBool matches type
|
||||||
* QBool matches type 'bool'. Type 'any' is matched by QObject. A
|
* 'bool'. Type 'any' is matched by QObject. A QAPI alternate type
|
||||||
* QAPI alternate type is matched when one of its member types is.
|
* is matched when one of its member types is.
|
||||||
*
|
*
|
||||||
* visit_start_struct() ... visit_end_struct() visits a QDict and
|
* visit_start_struct() ... visit_end_struct() visits a QDict and
|
||||||
* creates a QAPI struct/union. Visits in between visit the
|
* creates a QAPI struct/union. Visits in between visit the
|
||||||
|
|
|
@ -28,10 +28,10 @@ typedef struct QObjectOutputVisitor QObjectOutputVisitor;
|
||||||
*
|
*
|
||||||
* visit_type_FOO() creates a QObject for QAPI type FOO. It creates a
|
* visit_type_FOO() creates a QObject for QAPI type FOO. It creates a
|
||||||
* QDict for struct/union types, a QList for list types, QString for
|
* QDict for struct/union types, a QList for list types, QString for
|
||||||
* type 'str' and enumeration types, QInt for integer types, QFloat
|
* type 'str' and enumeration types, QNum for integer and float
|
||||||
* for type 'number', QBool for type 'bool'. For type 'any', it
|
* types, QBool for type 'bool'. For type 'any', it increments the
|
||||||
* increments the QObject's reference count. For QAPI alternate
|
* QObject's reference count. For QAPI alternate types, it creates
|
||||||
* types, it creates the QObject for the member that is in use.
|
* the QObject for the member that is in use.
|
||||||
*
|
*
|
||||||
* visit_start_struct() ... visit_end_struct() visits a QAPI
|
* visit_start_struct() ... visit_end_struct() visits a QAPI
|
||||||
* struct/union and creates a QDict. Visits in between visit the
|
* struct/union and creates a QDict. Visits in between visit the
|
||||||
|
|
|
@ -2974,7 +2974,7 @@ static QDict *monitor_parse_arguments(Monitor *mon,
|
||||||
monitor_printf(mon, "Unknown unit suffix\n");
|
monitor_printf(mon, "Unknown unit suffix\n");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
qdict_put(qdict, key, qfloat_from_double(val));
|
qdict_put(qdict, key, qnum_from_double(val));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'b':
|
case 'b':
|
||||||
|
|
|
@ -378,9 +378,6 @@ static void qobject_input_start_alternate(Visitor *v, const char *name,
|
||||||
}
|
}
|
||||||
*obj = g_malloc0(size);
|
*obj = g_malloc0(size);
|
||||||
(*obj)->type = qobject_type(qobj);
|
(*obj)->type = qobject_type(qobj);
|
||||||
if (promote_int && (*obj)->type == QTYPE_QINT) {
|
|
||||||
(*obj)->type = QTYPE_QFLOAT;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qobject_input_type_int64(Visitor *v, const char *name, int64_t *obj,
|
static void qobject_input_type_int64(Visitor *v, const char *name, int64_t *obj,
|
||||||
|
@ -388,22 +385,18 @@ static void qobject_input_type_int64(Visitor *v, const char *name, int64_t *obj,
|
||||||
{
|
{
|
||||||
QObjectInputVisitor *qiv = to_qiv(v);
|
QObjectInputVisitor *qiv = to_qiv(v);
|
||||||
QObject *qobj = qobject_input_get_object(qiv, name, true, errp);
|
QObject *qobj = qobject_input_get_object(qiv, name, true, errp);
|
||||||
QInt *qint;
|
QNum *qnum;
|
||||||
|
|
||||||
if (!qobj) {
|
if (!qobj) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
qint = qobject_to_qint(qobj);
|
qnum = qobject_to_qnum(qobj);
|
||||||
if (!qint) {
|
if (!qnum || !qnum_get_try_int(qnum, obj)) {
|
||||||
error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
|
error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
|
||||||
full_name(qiv, name), "integer");
|
full_name(qiv, name), "integer");
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*obj = qint_get_int(qint);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void qobject_input_type_int64_keyval(Visitor *v, const char *name,
|
static void qobject_input_type_int64_keyval(Visitor *v, const char *name,
|
||||||
int64_t *obj, Error **errp)
|
int64_t *obj, Error **errp)
|
||||||
{
|
{
|
||||||
|
@ -424,22 +417,21 @@ static void qobject_input_type_int64_keyval(Visitor *v, const char *name,
|
||||||
static void qobject_input_type_uint64(Visitor *v, const char *name,
|
static void qobject_input_type_uint64(Visitor *v, const char *name,
|
||||||
uint64_t *obj, Error **errp)
|
uint64_t *obj, Error **errp)
|
||||||
{
|
{
|
||||||
/* FIXME: qobject_to_qint mishandles values over INT64_MAX */
|
/* FIXME: qobject_to_qnum mishandles values over INT64_MAX */
|
||||||
QObjectInputVisitor *qiv = to_qiv(v);
|
QObjectInputVisitor *qiv = to_qiv(v);
|
||||||
QObject *qobj = qobject_input_get_object(qiv, name, true, errp);
|
QObject *qobj = qobject_input_get_object(qiv, name, true, errp);
|
||||||
QInt *qint;
|
QNum *qnum;
|
||||||
|
int64_t val;
|
||||||
|
|
||||||
if (!qobj) {
|
if (!qobj) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
qint = qobject_to_qint(qobj);
|
qnum = qobject_to_qnum(qobj);
|
||||||
if (!qint) {
|
if (!qnum || !qnum_get_try_int(qnum, &val)) {
|
||||||
error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
|
error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
|
||||||
full_name(qiv, name), "integer");
|
full_name(qiv, name), "integer");
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
*obj = val;
|
||||||
*obj = qint_get_int(qint);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qobject_input_type_uint64_keyval(Visitor *v, const char *name,
|
static void qobject_input_type_uint64_keyval(Visitor *v, const char *name,
|
||||||
|
@ -534,26 +526,19 @@ static void qobject_input_type_number(Visitor *v, const char *name, double *obj,
|
||||||
{
|
{
|
||||||
QObjectInputVisitor *qiv = to_qiv(v);
|
QObjectInputVisitor *qiv = to_qiv(v);
|
||||||
QObject *qobj = qobject_input_get_object(qiv, name, true, errp);
|
QObject *qobj = qobject_input_get_object(qiv, name, true, errp);
|
||||||
QInt *qint;
|
QNum *qnum;
|
||||||
QFloat *qfloat;
|
|
||||||
|
|
||||||
if (!qobj) {
|
if (!qobj) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
qint = qobject_to_qint(qobj);
|
qnum = qobject_to_qnum(qobj);
|
||||||
if (qint) {
|
if (!qnum) {
|
||||||
*obj = qint_get_int(qobject_to_qint(qobj));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
qfloat = qobject_to_qfloat(qobj);
|
|
||||||
if (!qfloat) {
|
|
||||||
error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
|
error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
|
||||||
full_name(qiv, name), "number");
|
full_name(qiv, name), "number");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
*obj = qfloat_get_double(qobject_to_qfloat(qobj));
|
*obj = qnum_get_double(qnum);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qobject_input_type_number_keyval(Visitor *v, const char *name,
|
static void qobject_input_type_number_keyval(Visitor *v, const char *name,
|
||||||
|
|
|
@ -144,7 +144,7 @@ static void qobject_output_type_int64(Visitor *v, const char *name,
|
||||||
int64_t *obj, Error **errp)
|
int64_t *obj, Error **errp)
|
||||||
{
|
{
|
||||||
QObjectOutputVisitor *qov = to_qov(v);
|
QObjectOutputVisitor *qov = to_qov(v);
|
||||||
qobject_output_add(qov, name, qint_from_int(*obj));
|
qobject_output_add(qov, name, qnum_from_int(*obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qobject_output_type_uint64(Visitor *v, const char *name,
|
static void qobject_output_type_uint64(Visitor *v, const char *name,
|
||||||
|
@ -152,7 +152,7 @@ static void qobject_output_type_uint64(Visitor *v, const char *name,
|
||||||
{
|
{
|
||||||
/* FIXME values larger than INT64_MAX become negative */
|
/* FIXME values larger than INT64_MAX become negative */
|
||||||
QObjectOutputVisitor *qov = to_qov(v);
|
QObjectOutputVisitor *qov = to_qov(v);
|
||||||
qobject_output_add(qov, name, qint_from_int(*obj));
|
qobject_output_add(qov, name, qnum_from_int(*obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qobject_output_type_bool(Visitor *v, const char *name, bool *obj,
|
static void qobject_output_type_bool(Visitor *v, const char *name, bool *obj,
|
||||||
|
@ -177,7 +177,7 @@ static void qobject_output_type_number(Visitor *v, const char *name,
|
||||||
double *obj, Error **errp)
|
double *obj, Error **errp)
|
||||||
{
|
{
|
||||||
QObjectOutputVisitor *qov = to_qov(v);
|
QObjectOutputVisitor *qov = to_qov(v);
|
||||||
qobject_output_add(qov, name, qfloat_from_double(*obj));
|
qobject_output_add(qov, name, qnum_from_double(*obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qobject_output_type_any(Visitor *v, const char *name,
|
static void qobject_output_type_any(Visitor *v, const char *name,
|
||||||
|
|
|
@ -485,7 +485,7 @@ int ga_parse_whence(GuestFileWhence *whence, Error **errp)
|
||||||
{
|
{
|
||||||
/* Exploit the fact that we picked values to match QGA_SEEK_*. */
|
/* Exploit the fact that we picked values to match QGA_SEEK_*. */
|
||||||
if (whence->type == QTYPE_QSTRING) {
|
if (whence->type == QTYPE_QSTRING) {
|
||||||
whence->type = QTYPE_QINT;
|
whence->type = QTYPE_QNUM;
|
||||||
whence->u.value = whence->u.name;
|
whence->u.value = whence->u.name;
|
||||||
}
|
}
|
||||||
switch (whence->u.value) {
|
switch (whence->u.value) {
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
#endif
|
#endif
|
||||||
#include "qapi/qmp/json-streamer.h"
|
#include "qapi/qmp/json-streamer.h"
|
||||||
#include "qapi/qmp/json-parser.h"
|
#include "qapi/qmp/json-parser.h"
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qmp/qjson.h"
|
#include "qapi/qmp/qjson.h"
|
||||||
#include "qga/guest-agent-core.h"
|
#include "qga/guest-agent-core.h"
|
||||||
#include "qemu/module.h"
|
#include "qemu/module.h"
|
||||||
|
|
|
@ -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
|
util-obj-y += qjson.o qobject.o json-lexer.o json-streamer.o json-parser.o
|
||||||
|
|
|
@ -466,16 +466,16 @@ static QObject *parse_escape(JSONParserContext *ctxt, va_list *ap)
|
||||||
} else if (!strcmp(token->str, "%i")) {
|
} else if (!strcmp(token->str, "%i")) {
|
||||||
return QOBJECT(qbool_from_bool(va_arg(*ap, int)));
|
return QOBJECT(qbool_from_bool(va_arg(*ap, int)));
|
||||||
} else if (!strcmp(token->str, "%d")) {
|
} else if (!strcmp(token->str, "%d")) {
|
||||||
return QOBJECT(qint_from_int(va_arg(*ap, int)));
|
return QOBJECT(qnum_from_int(va_arg(*ap, int)));
|
||||||
} else if (!strcmp(token->str, "%ld")) {
|
} else if (!strcmp(token->str, "%ld")) {
|
||||||
return QOBJECT(qint_from_int(va_arg(*ap, long)));
|
return QOBJECT(qnum_from_int(va_arg(*ap, long)));
|
||||||
} else if (!strcmp(token->str, "%lld") ||
|
} else if (!strcmp(token->str, "%lld") ||
|
||||||
!strcmp(token->str, "%I64d")) {
|
!strcmp(token->str, "%I64d")) {
|
||||||
return QOBJECT(qint_from_int(va_arg(*ap, long long)));
|
return QOBJECT(qnum_from_int(va_arg(*ap, long long)));
|
||||||
} else if (!strcmp(token->str, "%s")) {
|
} else if (!strcmp(token->str, "%s")) {
|
||||||
return QOBJECT(qstring_from_str(va_arg(*ap, const char *)));
|
return QOBJECT(qstring_from_str(va_arg(*ap, const char *)));
|
||||||
} else if (!strcmp(token->str, "%f")) {
|
} else if (!strcmp(token->str, "%f")) {
|
||||||
return QOBJECT(qfloat_from_double(va_arg(*ap, double)));
|
return QOBJECT(qnum_from_double(va_arg(*ap, double)));
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -491,24 +491,22 @@ static QObject *parse_literal(JSONParserContext *ctxt)
|
||||||
case JSON_STRING:
|
case JSON_STRING:
|
||||||
return QOBJECT(qstring_from_escaped_str(ctxt, token));
|
return QOBJECT(qstring_from_escaped_str(ctxt, token));
|
||||||
case JSON_INTEGER: {
|
case JSON_INTEGER: {
|
||||||
/* A possibility exists that this is a whole-valued float where the
|
/*
|
||||||
* fractional part was left out due to being 0 (.0). It's not a big
|
* Represent JSON_INTEGER as QNUM_I64 if possible, else as
|
||||||
* deal to treat these as ints in the parser, so long as users of the
|
* QNUM_DOUBLE. Note that strtoll() fails with ERANGE when
|
||||||
* resulting QObject know to expect a QInt in place of a QFloat in
|
* it's not possible.
|
||||||
* cases like these.
|
|
||||||
*
|
*
|
||||||
* However, in some cases these values will overflow/underflow a
|
* qnum_get_int() will then work for any signed 64-bit
|
||||||
* QInt/int64 container, thus we should assume these are to be handled
|
* JSON_INTEGER, and qnum_get_double() both for any
|
||||||
* as QFloats/doubles rather than silently changing their values.
|
* JSON_INTEGER and any JSON_FLOAT (with precision loss for
|
||||||
*
|
* integers beyond 53 bits)
|
||||||
* strtoll() indicates these instances by setting errno to ERANGE
|
|
||||||
*/
|
*/
|
||||||
int64_t value;
|
int64_t value;
|
||||||
|
|
||||||
errno = 0; /* strtoll doesn't set errno on success */
|
errno = 0; /* strtoll doesn't set errno on success */
|
||||||
value = strtoll(token->str, NULL, 10);
|
value = strtoll(token->str, NULL, 10);
|
||||||
if (errno != ERANGE) {
|
if (errno != ERANGE) {
|
||||||
return QOBJECT(qint_from_int(value));
|
return QOBJECT(qnum_from_int(value));
|
||||||
}
|
}
|
||||||
/* fall through to JSON_FLOAT */
|
/* fall through to JSON_FLOAT */
|
||||||
}
|
}
|
||||||
|
@ -516,7 +514,7 @@ static QObject *parse_literal(JSONParserContext *ctxt)
|
||||||
/* FIXME dependent on locale; a pervasive issue in QEMU */
|
/* FIXME dependent on locale; a pervasive issue in QEMU */
|
||||||
/* FIXME our lexer matches RFC 7159 in forbidding Inf or NaN,
|
/* FIXME our lexer matches RFC 7159 in forbidding Inf or NaN,
|
||||||
* but those might be useful extensions beyond JSON */
|
* but those might be useful extensions beyond JSON */
|
||||||
return QOBJECT(qfloat_from_double(strtod(token->str, NULL)));
|
return QOBJECT(qnum_from_double(strtod(token->str, NULL)));
|
||||||
default:
|
default:
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,8 +11,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "qapi/qmp/qint.h"
|
#include "qapi/qmp/qnum.h"
|
||||||
#include "qapi/qmp/qfloat.h"
|
|
||||||
#include "qapi/qmp/qdict.h"
|
#include "qapi/qmp/qdict.h"
|
||||||
#include "qapi/qmp/qbool.h"
|
#include "qapi/qmp/qbool.h"
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
|
@ -180,37 +179,26 @@ size_t qdict_size(const QDict *qdict)
|
||||||
/**
|
/**
|
||||||
* qdict_get_double(): Get an number mapped by 'key'
|
* qdict_get_double(): Get an number mapped by 'key'
|
||||||
*
|
*
|
||||||
* This function assumes that 'key' exists and it stores a
|
* This function assumes that 'key' exists and it stores a QNum.
|
||||||
* QFloat or QInt object.
|
|
||||||
*
|
*
|
||||||
* Return number mapped by 'key'.
|
* Return number mapped by 'key'.
|
||||||
*/
|
*/
|
||||||
double qdict_get_double(const QDict *qdict, const char *key)
|
double qdict_get_double(const QDict *qdict, const char *key)
|
||||||
{
|
{
|
||||||
QObject *obj = qdict_get(qdict, key);
|
return qnum_get_double(qobject_to_qnum(qdict_get(qdict, key)));
|
||||||
|
|
||||||
assert(obj);
|
|
||||||
switch (qobject_type(obj)) {
|
|
||||||
case QTYPE_QFLOAT:
|
|
||||||
return qfloat_get_double(qobject_to_qfloat(obj));
|
|
||||||
case QTYPE_QINT:
|
|
||||||
return qint_get_int(qobject_to_qint(obj));
|
|
||||||
default:
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* qdict_get_int(): Get an integer mapped by 'key'
|
* qdict_get_int(): Get an integer mapped by 'key'
|
||||||
*
|
*
|
||||||
* This function assumes that 'key' exists and it stores a
|
* This function assumes that 'key' exists and it stores a
|
||||||
* QInt object.
|
* QNum representable as int.
|
||||||
*
|
*
|
||||||
* Return integer mapped by 'key'.
|
* Return integer mapped by 'key'.
|
||||||
*/
|
*/
|
||||||
int64_t qdict_get_int(const QDict *qdict, const char *key)
|
int64_t qdict_get_int(const QDict *qdict, const char *key)
|
||||||
{
|
{
|
||||||
return qint_get_int(qobject_to_qint(qdict_get(qdict, key)));
|
return qnum_get_int(qobject_to_qnum(qdict_get(qdict, key)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -259,16 +247,21 @@ const char *qdict_get_str(const QDict *qdict, const char *key)
|
||||||
/**
|
/**
|
||||||
* qdict_get_try_int(): Try to get integer mapped by 'key'
|
* qdict_get_try_int(): Try to get integer mapped by 'key'
|
||||||
*
|
*
|
||||||
* Return integer mapped by 'key', if it is not present in
|
* Return integer mapped by 'key', if it is not present in the
|
||||||
* the dictionary or if the stored object is not of QInt type
|
* dictionary or if the stored object is not a QNum representing an
|
||||||
* 'def_value' will be returned.
|
* integer, 'def_value' will be returned.
|
||||||
*/
|
*/
|
||||||
int64_t qdict_get_try_int(const QDict *qdict, const char *key,
|
int64_t qdict_get_try_int(const QDict *qdict, const char *key,
|
||||||
int64_t def_value)
|
int64_t def_value)
|
||||||
{
|
{
|
||||||
QInt *qint = qobject_to_qint(qdict_get(qdict, key));
|
QNum *qnum = qobject_to_qnum(qdict_get(qdict, key));
|
||||||
|
int64_t val;
|
||||||
|
|
||||||
return qint ? qint_get_int(qint) : def_value;
|
if (!qnum || !qnum_get_try_int(qnum, &val)) {
|
||||||
|
return def_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,62 +0,0 @@
|
||||||
/*
|
|
||||||
* QFloat Module
|
|
||||||
*
|
|
||||||
* 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 "qapi/qmp/qobject.h"
|
|
||||||
#include "qemu-common.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* qfloat_from_int(): Create a new QFloat from a float
|
|
||||||
*
|
|
||||||
* Return strong reference.
|
|
||||||
*/
|
|
||||||
QFloat *qfloat_from_double(double value)
|
|
||||||
{
|
|
||||||
QFloat *qf;
|
|
||||||
|
|
||||||
qf = g_malloc(sizeof(*qf));
|
|
||||||
qobject_init(QOBJECT(qf), QTYPE_QFLOAT);
|
|
||||||
qf->value = value;
|
|
||||||
|
|
||||||
return qf;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* qfloat_get_double(): Get the stored float
|
|
||||||
*/
|
|
||||||
double qfloat_get_double(const QFloat *qf)
|
|
||||||
{
|
|
||||||
return qf->value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* qobject_to_qfloat(): Convert a QObject into a QFloat
|
|
||||||
*/
|
|
||||||
QFloat *qobject_to_qfloat(const QObject *obj)
|
|
||||||
{
|
|
||||||
if (!obj || qobject_type(obj) != QTYPE_QFLOAT) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return container_of(obj, QFloat, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* qfloat_destroy_obj(): Free all memory allocated by a
|
|
||||||
* QFloat object
|
|
||||||
*/
|
|
||||||
void qfloat_destroy_obj(QObject *obj)
|
|
||||||
{
|
|
||||||
assert(obj != NULL);
|
|
||||||
g_free(qobject_to_qfloat(obj));
|
|
||||||
}
|
|
|
@ -1,61 +0,0 @@
|
||||||
/*
|
|
||||||
* QInt Module
|
|
||||||
*
|
|
||||||
* 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 "qapi/qmp/qobject.h"
|
|
||||||
#include "qemu-common.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* qint_from_int(): Create a new QInt from an int64_t
|
|
||||||
*
|
|
||||||
* Return strong reference.
|
|
||||||
*/
|
|
||||||
QInt *qint_from_int(int64_t value)
|
|
||||||
{
|
|
||||||
QInt *qi;
|
|
||||||
|
|
||||||
qi = g_malloc(sizeof(*qi));
|
|
||||||
qobject_init(QOBJECT(qi), QTYPE_QINT);
|
|
||||||
qi->value = value;
|
|
||||||
|
|
||||||
return qi;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* qint_get_int(): Get the stored integer
|
|
||||||
*/
|
|
||||||
int64_t qint_get_int(const QInt *qi)
|
|
||||||
{
|
|
||||||
return qi->value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* qobject_to_qint(): Convert a QObject into a QInt
|
|
||||||
*/
|
|
||||||
QInt *qobject_to_qint(const QObject *obj)
|
|
||||||
{
|
|
||||||
if (!obj || qobject_type(obj) != QTYPE_QINT) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return container_of(obj, QInt, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* qint_destroy_obj(): Free all memory allocated by a
|
|
||||||
* QInt object
|
|
||||||
*/
|
|
||||||
void qint_destroy_obj(QObject *obj)
|
|
||||||
{
|
|
||||||
assert(obj != NULL);
|
|
||||||
g_free(qobject_to_qint(obj));
|
|
||||||
}
|
|
|
@ -132,12 +132,11 @@ static void to_json(const QObject *obj, QString *str, int pretty, int indent)
|
||||||
case QTYPE_QNULL:
|
case QTYPE_QNULL:
|
||||||
qstring_append(str, "null");
|
qstring_append(str, "null");
|
||||||
break;
|
break;
|
||||||
case QTYPE_QINT: {
|
case QTYPE_QNUM: {
|
||||||
QInt *val = qobject_to_qint(obj);
|
QNum *val = qobject_to_qnum(obj);
|
||||||
char buffer[1024];
|
char *buffer = qnum_to_string(val);
|
||||||
|
|
||||||
snprintf(buffer, sizeof(buffer), "%" PRId64, qint_get_int(val));
|
|
||||||
qstring_append(str, buffer);
|
qstring_append(str, buffer);
|
||||||
|
g_free(buffer);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case QTYPE_QSTRING: {
|
case QTYPE_QSTRING: {
|
||||||
|
@ -234,34 +233,6 @@ static void to_json(const QObject *obj, QString *str, int pretty, int indent)
|
||||||
qstring_append(str, "]");
|
qstring_append(str, "]");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case QTYPE_QFLOAT: {
|
|
||||||
QFloat *val = qobject_to_qfloat(obj);
|
|
||||||
char buffer[1024];
|
|
||||||
int len;
|
|
||||||
|
|
||||||
/* FIXME: snprintf() is locale dependent; but JSON requires
|
|
||||||
* numbers to be formatted as if in the C locale. Dependence
|
|
||||||
* on C locale is a pervasive issue in QEMU. */
|
|
||||||
/* FIXME: This risks printing Inf or NaN, which are not valid
|
|
||||||
* JSON values. */
|
|
||||||
/* FIXME: the default precision of 6 for %f often causes
|
|
||||||
* rounding errors; we should be using DBL_DECIMAL_DIG (17),
|
|
||||||
* and only rounding to a shorter number if the result would
|
|
||||||
* still produce the same floating point value. */
|
|
||||||
len = snprintf(buffer, sizeof(buffer), "%f", qfloat_get_double(val));
|
|
||||||
while (len > 0 && buffer[len - 1] == '0') {
|
|
||||||
len--;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (len && buffer[len - 1] == '.') {
|
|
||||||
buffer[len - 1] = 0;
|
|
||||||
} else {
|
|
||||||
buffer[len] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
qstring_append(str, buffer);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case QTYPE_QBOOL: {
|
case QTYPE_QBOOL: {
|
||||||
QBool *val = qobject_to_qbool(obj);
|
QBool *val = qobject_to_qbool(obj);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,159 @@
|
||||||
|
/*
|
||||||
|
* QNum Module
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Red Hat Inc.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Luiz Capitulino <lcapitulino@redhat.com>
|
||||||
|
* Anthony Liguori <aliguori@us.ibm.com>
|
||||||
|
* Marc-André Lureau <marcandre.lureau@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/error.h"
|
||||||
|
#include "qapi/qmp/qnum.h"
|
||||||
|
#include "qapi/qmp/qobject.h"
|
||||||
|
#include "qemu-common.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qnum_from_int(): Create a new QNum from an int64_t
|
||||||
|
*
|
||||||
|
* Return strong reference.
|
||||||
|
*/
|
||||||
|
QNum *qnum_from_int(int64_t value)
|
||||||
|
{
|
||||||
|
QNum *qn = g_new(QNum, 1);
|
||||||
|
|
||||||
|
qobject_init(QOBJECT(qn), QTYPE_QNUM);
|
||||||
|
qn->kind = QNUM_I64;
|
||||||
|
qn->u.i64 = value;
|
||||||
|
|
||||||
|
return qn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qnum_from_double(): Create a new QNum from a double
|
||||||
|
*
|
||||||
|
* Return strong reference.
|
||||||
|
*/
|
||||||
|
QNum *qnum_from_double(double value)
|
||||||
|
{
|
||||||
|
QNum *qn = g_new(QNum, 1);
|
||||||
|
|
||||||
|
qobject_init(QOBJECT(qn), QTYPE_QNUM);
|
||||||
|
qn->kind = QNUM_DOUBLE;
|
||||||
|
qn->u.dbl = value;
|
||||||
|
|
||||||
|
return qn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qnum_get_try_int(): Get an integer representation of the number
|
||||||
|
*
|
||||||
|
* Return true on success.
|
||||||
|
*/
|
||||||
|
bool qnum_get_try_int(const QNum *qn, int64_t *val)
|
||||||
|
{
|
||||||
|
switch (qn->kind) {
|
||||||
|
case QNUM_I64:
|
||||||
|
*val = qn->u.i64;
|
||||||
|
return true;
|
||||||
|
case QNUM_DOUBLE:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(0);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qnum_get_int(): Get an integer representation of the number
|
||||||
|
*
|
||||||
|
* assert() on failure.
|
||||||
|
*/
|
||||||
|
int64_t qnum_get_int(const QNum *qn)
|
||||||
|
{
|
||||||
|
int64_t val;
|
||||||
|
bool success = qnum_get_try_int(qn, &val);
|
||||||
|
assert(success);
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qnum_get_double(): Get a float representation of the number
|
||||||
|
*
|
||||||
|
* qnum_get_double() loses precision for integers beyond 53 bits.
|
||||||
|
*/
|
||||||
|
double qnum_get_double(QNum *qn)
|
||||||
|
{
|
||||||
|
switch (qn->kind) {
|
||||||
|
case QNUM_I64:
|
||||||
|
return qn->u.i64;
|
||||||
|
case QNUM_DOUBLE:
|
||||||
|
return qn->u.dbl;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(0);
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *qnum_to_string(QNum *qn)
|
||||||
|
{
|
||||||
|
char *buffer;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
switch (qn->kind) {
|
||||||
|
case QNUM_I64:
|
||||||
|
return g_strdup_printf("%" PRId64, qn->u.i64);
|
||||||
|
case QNUM_DOUBLE:
|
||||||
|
/* FIXME: snprintf() is locale dependent; but JSON requires
|
||||||
|
* numbers to be formatted as if in the C locale. Dependence
|
||||||
|
* on C locale is a pervasive issue in QEMU. */
|
||||||
|
/* FIXME: This risks printing Inf or NaN, which are not valid
|
||||||
|
* JSON values. */
|
||||||
|
/* FIXME: the default precision of 6 for %f often causes
|
||||||
|
* rounding errors; we should be using DBL_DECIMAL_DIG (17),
|
||||||
|
* and only rounding to a shorter number if the result would
|
||||||
|
* still produce the same floating point value. */
|
||||||
|
buffer = g_strdup_printf("%f" , qn->u.dbl);
|
||||||
|
len = strlen(buffer);
|
||||||
|
while (len > 0 && buffer[len - 1] == '0') {
|
||||||
|
len--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len && buffer[len - 1] == '.') {
|
||||||
|
buffer[len - 1] = 0;
|
||||||
|
} else {
|
||||||
|
buffer[len] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qobject_to_qnum(): Convert a QObject into a QNum
|
||||||
|
*/
|
||||||
|
QNum *qobject_to_qnum(const QObject *obj)
|
||||||
|
{
|
||||||
|
if (!obj || qobject_type(obj) != QTYPE_QNUM) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return container_of(obj, QNum, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qnum_destroy_obj(): Free all memory allocated by a
|
||||||
|
* QNum object
|
||||||
|
*/
|
||||||
|
void qnum_destroy_obj(QObject *obj)
|
||||||
|
{
|
||||||
|
assert(obj != NULL);
|
||||||
|
g_free(qobject_to_qnum(obj));
|
||||||
|
}
|
|
@ -14,11 +14,10 @@
|
||||||
static void (*qdestroy[QTYPE__MAX])(QObject *) = {
|
static void (*qdestroy[QTYPE__MAX])(QObject *) = {
|
||||||
[QTYPE_NONE] = NULL, /* No such object exists */
|
[QTYPE_NONE] = NULL, /* No such object exists */
|
||||||
[QTYPE_QNULL] = NULL, /* qnull_ is indestructible */
|
[QTYPE_QNULL] = NULL, /* qnull_ is indestructible */
|
||||||
[QTYPE_QINT] = qint_destroy_obj,
|
[QTYPE_QNUM] = qnum_destroy_obj,
|
||||||
[QTYPE_QSTRING] = qstring_destroy_obj,
|
[QTYPE_QSTRING] = qstring_destroy_obj,
|
||||||
[QTYPE_QDICT] = qdict_destroy_obj,
|
[QTYPE_QDICT] = qdict_destroy_obj,
|
||||||
[QTYPE_QLIST] = qlist_destroy_obj,
|
[QTYPE_QLIST] = qlist_destroy_obj,
|
||||||
[QTYPE_QFLOAT] = qfloat_destroy_obj,
|
|
||||||
[QTYPE_QBOOL] = qbool_destroy_obj,
|
[QTYPE_QBOOL] = qbool_destroy_obj,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
16
qom/object.c
16
qom/object.c
|
@ -27,7 +27,6 @@
|
||||||
#include "qom/qom-qobject.h"
|
#include "qom/qom-qobject.h"
|
||||||
#include "qapi/qmp/qobject.h"
|
#include "qapi/qmp/qobject.h"
|
||||||
#include "qapi/qmp/qbool.h"
|
#include "qapi/qmp/qbool.h"
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
|
|
||||||
#define MAX_INTERFACES 32
|
#define MAX_INTERFACES 32
|
||||||
|
@ -1190,28 +1189,27 @@ bool object_property_get_bool(Object *obj, const char *name,
|
||||||
void object_property_set_int(Object *obj, int64_t value,
|
void object_property_set_int(Object *obj, int64_t value,
|
||||||
const char *name, Error **errp)
|
const char *name, Error **errp)
|
||||||
{
|
{
|
||||||
QInt *qint = qint_from_int(value);
|
QNum *qnum = qnum_from_int(value);
|
||||||
object_property_set_qobject(obj, QOBJECT(qint), name, errp);
|
object_property_set_qobject(obj, QOBJECT(qnum), name, errp);
|
||||||
|
|
||||||
QDECREF(qint);
|
QDECREF(qnum);
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t object_property_get_int(Object *obj, const char *name,
|
int64_t object_property_get_int(Object *obj, const char *name,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
QObject *ret = object_property_get_qobject(obj, name, errp);
|
QObject *ret = object_property_get_qobject(obj, name, errp);
|
||||||
QInt *qint;
|
QNum *qnum;
|
||||||
int64_t retval;
|
int64_t retval;
|
||||||
|
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
qint = qobject_to_qint(ret);
|
|
||||||
if (!qint) {
|
qnum = qobject_to_qnum(ret);
|
||||||
|
if (!qnum || !qnum_get_try_int(qnum, &retval)) {
|
||||||
error_setg(errp, QERR_INVALID_PARAMETER_TYPE, name, "int");
|
error_setg(errp, QERR_INVALID_PARAMETER_TYPE, name, "int");
|
||||||
retval = -1;
|
retval = -1;
|
||||||
} else {
|
|
||||||
retval = qint_get_int(qint);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
qobject_decref(ret);
|
qobject_decref(ret);
|
||||||
|
|
|
@ -6,7 +6,7 @@ expression Obj, Key, E;
|
||||||
- qdict_put_obj(Obj, Key, QOBJECT(E));
|
- qdict_put_obj(Obj, Key, QOBJECT(E));
|
||||||
+ qdict_put(Obj, Key, 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_int(Obj, Key, E);
|
||||||
|
|
|
|
||||||
- qdict_put(Obj, Key, qbool_from_bool(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(Obj, QOBJECT(E));
|
||||||
+ qlist_append(Obj, 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_int(Obj, E);
|
||||||
|
|
|
|
||||||
- qlist_append(Obj, qbool_from_bool(E));
|
- qlist_append(Obj, qbool_from_bool(E));
|
||||||
|
|
|
@ -164,7 +164,7 @@ def gen_visit_alternate(name, variants):
|
||||||
promote_int = 'true'
|
promote_int = 'true'
|
||||||
ret = ''
|
ret = ''
|
||||||
for var in variants.variants:
|
for var in variants.variants:
|
||||||
if var.type.alternate_qtype() == 'QTYPE_QINT':
|
if var.type.alternate_qtype() == 'QTYPE_QNUM':
|
||||||
promote_int = 'false'
|
promote_int = 'false'
|
||||||
|
|
||||||
ret += mcgen('''
|
ret += mcgen('''
|
||||||
|
|
|
@ -21,18 +21,18 @@ from ordereddict import OrderedDict
|
||||||
|
|
||||||
builtin_types = {
|
builtin_types = {
|
||||||
'str': 'QTYPE_QSTRING',
|
'str': 'QTYPE_QSTRING',
|
||||||
'int': 'QTYPE_QINT',
|
'int': 'QTYPE_QNUM',
|
||||||
'number': 'QTYPE_QFLOAT',
|
'number': 'QTYPE_QNUM',
|
||||||
'bool': 'QTYPE_QBOOL',
|
'bool': 'QTYPE_QBOOL',
|
||||||
'int8': 'QTYPE_QINT',
|
'int8': 'QTYPE_QNUM',
|
||||||
'int16': 'QTYPE_QINT',
|
'int16': 'QTYPE_QNUM',
|
||||||
'int32': 'QTYPE_QINT',
|
'int32': 'QTYPE_QNUM',
|
||||||
'int64': 'QTYPE_QINT',
|
'int64': 'QTYPE_QNUM',
|
||||||
'uint8': 'QTYPE_QINT',
|
'uint8': 'QTYPE_QNUM',
|
||||||
'uint16': 'QTYPE_QINT',
|
'uint16': 'QTYPE_QNUM',
|
||||||
'uint32': 'QTYPE_QINT',
|
'uint32': 'QTYPE_QNUM',
|
||||||
'uint64': 'QTYPE_QINT',
|
'uint64': 'QTYPE_QNUM',
|
||||||
'size': 'QTYPE_QINT',
|
'size': 'QTYPE_QNUM',
|
||||||
'any': None, # any QType possible, actually
|
'any': None, # any QType possible, actually
|
||||||
'QType': 'QTYPE_QSTRING',
|
'QType': 'QTYPE_QSTRING',
|
||||||
}
|
}
|
||||||
|
@ -820,11 +820,9 @@ def check_alternate(expr, info):
|
||||||
if v in ['on', 'off']:
|
if v in ['on', 'off']:
|
||||||
conflicting.add('QTYPE_QBOOL')
|
conflicting.add('QTYPE_QBOOL')
|
||||||
if re.match(r'[-+0-9.]', v): # lazy, could be tightened
|
if re.match(r'[-+0-9.]', v): # lazy, could be tightened
|
||||||
conflicting.add('QTYPE_QINT')
|
conflicting.add('QTYPE_QNUM')
|
||||||
conflicting.add('QTYPE_QFLOAT')
|
|
||||||
else:
|
else:
|
||||||
conflicting.add('QTYPE_QINT')
|
conflicting.add('QTYPE_QNUM')
|
||||||
conflicting.add('QTYPE_QFLOAT')
|
|
||||||
conflicting.add('QTYPE_QBOOL')
|
conflicting.add('QTYPE_QBOOL')
|
||||||
if conflicting & set(types_seen):
|
if conflicting & set(types_seen):
|
||||||
raise QAPISemError(info, "Alternate '%s' member '%s' can't "
|
raise QAPISemError(info, "Alternate '%s' member '%s' can't "
|
||||||
|
@ -1059,8 +1057,8 @@ class QAPISchemaType(QAPISchemaEntity):
|
||||||
def alternate_qtype(self):
|
def alternate_qtype(self):
|
||||||
json2qtype = {
|
json2qtype = {
|
||||||
'string': 'QTYPE_QSTRING',
|
'string': 'QTYPE_QSTRING',
|
||||||
'number': 'QTYPE_QFLOAT',
|
'number': 'QTYPE_QNUM',
|
||||||
'int': 'QTYPE_QINT',
|
'int': 'QTYPE_QNUM',
|
||||||
'boolean': 'QTYPE_QBOOL',
|
'boolean': 'QTYPE_QBOOL',
|
||||||
'object': 'QTYPE_QDICT'
|
'object': 'QTYPE_QDICT'
|
||||||
}
|
}
|
||||||
|
@ -1522,9 +1520,9 @@ class QAPISchema(object):
|
||||||
self.the_empty_object_type = QAPISchemaObjectType(
|
self.the_empty_object_type = QAPISchemaObjectType(
|
||||||
'q_empty', None, None, None, [], None)
|
'q_empty', None, None, None, [], None)
|
||||||
self._def_entity(self.the_empty_object_type)
|
self._def_entity(self.the_empty_object_type)
|
||||||
qtype_values = self._make_enum_members(['none', 'qnull', 'qint',
|
qtype_values = self._make_enum_members(['none', 'qnull', 'qnum',
|
||||||
'qstring', 'qdict', 'qlist',
|
'qstring', 'qdict', 'qlist',
|
||||||
'qfloat', 'qbool'])
|
'qbool'])
|
||||||
self._def_entity(QAPISchemaEnumType('QType', None, None,
|
self._def_entity(QAPISchemaEnumType('QType', None, None,
|
||||||
qtype_values, 'QTYPE'))
|
qtype_values, 'QTYPE'))
|
||||||
|
|
||||||
|
|
|
@ -29,11 +29,7 @@
|
||||||
#include "qemu/option.h"
|
#include "qemu/option.h"
|
||||||
#include "qemu/config-file.h"
|
#include "qemu/config-file.h"
|
||||||
#include "qapi/qmp/qerror.h"
|
#include "qapi/qmp/qerror.h"
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/types.h"
|
||||||
#include "qapi/qmp/qdict.h"
|
|
||||||
#include "qapi/qmp/qbool.h"
|
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qmp/qfloat.h"
|
|
||||||
|
|
||||||
#include "qapi-types.h"
|
#include "qapi-types.h"
|
||||||
#include "qapi-visit.h"
|
#include "qapi-visit.h"
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
atomic_add-bench
|
atomic_add-bench
|
||||||
check-qdict
|
check-qdict
|
||||||
check-qfloat
|
check-qnum
|
||||||
check-qint
|
|
||||||
check-qjson
|
check-qjson
|
||||||
check-qlist
|
check-qlist
|
||||||
check-qnull
|
check-qnull
|
||||||
|
|
|
@ -10,10 +10,8 @@ check-unit-y = tests/check-qdict$(EXESUF)
|
||||||
gcov-files-check-qdict-y = qobject/qdict.c
|
gcov-files-check-qdict-y = qobject/qdict.c
|
||||||
check-unit-y += tests/test-char$(EXESUF)
|
check-unit-y += tests/test-char$(EXESUF)
|
||||||
gcov-files-check-qdict-y = chardev/char.c
|
gcov-files-check-qdict-y = chardev/char.c
|
||||||
check-unit-y += tests/check-qfloat$(EXESUF)
|
check-unit-y += tests/check-qnum$(EXESUF)
|
||||||
gcov-files-check-qfloat-y = qobject/qfloat.c
|
gcov-files-check-qnum-y = qobject/qnum.c
|
||||||
check-unit-y += tests/check-qint$(EXESUF)
|
|
||||||
gcov-files-check-qint-y = qobject/qint.c
|
|
||||||
check-unit-y += tests/check-qstring$(EXESUF)
|
check-unit-y += tests/check-qstring$(EXESUF)
|
||||||
gcov-files-check-qstring-y = qobject/qstring.c
|
gcov-files-check-qstring-y = qobject/qstring.c
|
||||||
check-unit-y += tests/check-qlist$(EXESUF)
|
check-unit-y += tests/check-qlist$(EXESUF)
|
||||||
|
@ -506,8 +504,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-commands.h tests/test-qapi-event.h \
|
||||||
tests/test-qmp-introspect.h
|
tests/test-qmp-introspect.h
|
||||||
|
|
||||||
test-obj-y = tests/check-qint.o tests/check-qstring.o tests/check-qdict.o \
|
test-obj-y = tests/check-qnum.o tests/check-qstring.o tests/check-qdict.o \
|
||||||
tests/check-qlist.o tests/check-qfloat.o tests/check-qnull.o \
|
tests/check-qlist.o tests/check-qnull.o \
|
||||||
tests/check-qjson.o \
|
tests/check-qjson.o \
|
||||||
tests/test-coroutine.o tests/test-string-output-visitor.o \
|
tests/test-coroutine.o tests/test-string-output-visitor.o \
|
||||||
tests/test-string-input-visitor.o tests/test-qobject-output-visitor.o \
|
tests/test-string-input-visitor.o tests/test-qobject-output-visitor.o \
|
||||||
|
@ -535,11 +533,10 @@ test-crypto-obj-y = $(crypto-obj-y) $(test-qom-obj-y)
|
||||||
test-io-obj-y = $(io-obj-y) $(test-crypto-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
|
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-qstring$(EXESUF): tests/check-qstring.o $(test-util-obj-y)
|
||||||
tests/check-qdict$(EXESUF): tests/check-qdict.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-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-qnull$(EXESUF): tests/check-qnull.o $(test-util-obj-y)
|
||||||
tests/check-qjson$(EXESUF): tests/check-qjson.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)
|
tests/check-qom-interface$(EXESUF): tests/check-qom-interface.o $(test-qom-obj-y)
|
||||||
|
|
|
@ -11,7 +11,6 @@
|
||||||
*/
|
*/
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qmp/qdict.h"
|
#include "qapi/qmp/qdict.h"
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
|
@ -39,7 +38,7 @@ static void qdict_new_test(void)
|
||||||
|
|
||||||
static void qdict_put_obj_test(void)
|
static void qdict_put_obj_test(void)
|
||||||
{
|
{
|
||||||
QInt *qi;
|
QNum *qn;
|
||||||
QDict *qdict;
|
QDict *qdict;
|
||||||
QDictEntry *ent;
|
QDictEntry *ent;
|
||||||
const int num = 42;
|
const int num = 42;
|
||||||
|
@ -51,11 +50,11 @@ static void qdict_put_obj_test(void)
|
||||||
|
|
||||||
g_assert(qdict_size(qdict) == 1);
|
g_assert(qdict_size(qdict) == 1);
|
||||||
ent = QLIST_FIRST(&qdict->table[12345 % QDICT_BUCKET_MAX]);
|
ent = QLIST_FIRST(&qdict->table[12345 % QDICT_BUCKET_MAX]);
|
||||||
qi = qobject_to_qint(ent->value);
|
qn = qobject_to_qnum(ent->value);
|
||||||
g_assert(qint_get_int(qi) == num);
|
g_assert_cmpint(qnum_get_int(qn), ==, num);
|
||||||
|
|
||||||
// destroy doesn't exit yet
|
// destroy doesn't exit yet
|
||||||
QDECREF(qi);
|
QDECREF(qn);
|
||||||
g_free(ent->key);
|
g_free(ent->key);
|
||||||
g_free(ent);
|
g_free(ent);
|
||||||
g_free(qdict);
|
g_free(qdict);
|
||||||
|
@ -74,7 +73,7 @@ static void qdict_destroy_simple_test(void)
|
||||||
|
|
||||||
static void qdict_get_test(void)
|
static void qdict_get_test(void)
|
||||||
{
|
{
|
||||||
QInt *qi;
|
QNum *qn;
|
||||||
QObject *obj;
|
QObject *obj;
|
||||||
const int value = -42;
|
const int value = -42;
|
||||||
const char *key = "test";
|
const char *key = "test";
|
||||||
|
@ -85,8 +84,8 @@ static void qdict_get_test(void)
|
||||||
obj = qdict_get(tests_dict, key);
|
obj = qdict_get(tests_dict, key);
|
||||||
g_assert(obj != NULL);
|
g_assert(obj != NULL);
|
||||||
|
|
||||||
qi = qobject_to_qint(obj);
|
qn = qobject_to_qnum(obj);
|
||||||
g_assert(qint_get_int(qi) == value);
|
g_assert_cmpint(qnum_get_int(qn), ==, value);
|
||||||
|
|
||||||
QDECREF(tests_dict);
|
QDECREF(tests_dict);
|
||||||
}
|
}
|
||||||
|
@ -329,7 +328,7 @@ static void qdict_array_split_test(void)
|
||||||
{
|
{
|
||||||
QDict *test_dict = qdict_new();
|
QDict *test_dict = qdict_new();
|
||||||
QDict *dict1, *dict2;
|
QDict *dict1, *dict2;
|
||||||
QInt *int1;
|
QNum *int1;
|
||||||
QList *test_list;
|
QList *test_list;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -380,7 +379,7 @@ static void qdict_array_split_test(void)
|
||||||
|
|
||||||
dict1 = qobject_to_qdict(qlist_pop(test_list));
|
dict1 = qobject_to_qdict(qlist_pop(test_list));
|
||||||
dict2 = 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(dict1);
|
||||||
g_assert(dict2);
|
g_assert(dict2);
|
||||||
|
@ -402,7 +401,7 @@ static void qdict_array_split_test(void)
|
||||||
|
|
||||||
QDECREF(dict2);
|
QDECREF(dict2);
|
||||||
|
|
||||||
g_assert(qint_get_int(int1) == 66);
|
g_assert_cmpint(qnum_get_int(int1), ==, 66);
|
||||||
|
|
||||||
QDECREF(int1);
|
QDECREF(int1);
|
||||||
|
|
||||||
|
@ -447,14 +446,14 @@ static void qdict_array_split_test(void)
|
||||||
|
|
||||||
qdict_array_split(test_dict, &test_list);
|
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(int1);
|
||||||
g_assert(qlist_empty(test_list));
|
g_assert(qlist_empty(test_list));
|
||||||
|
|
||||||
QDECREF(test_list);
|
QDECREF(test_list);
|
||||||
|
|
||||||
g_assert(qint_get_int(int1) == 42);
|
g_assert_cmpint(qnum_get_int(int1), ==, 42);
|
||||||
|
|
||||||
QDECREF(int1);
|
QDECREF(int1);
|
||||||
|
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
|
|
@ -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();
|
|
||||||
}
|
|
|
@ -886,21 +886,23 @@ static void simple_number(void)
|
||||||
};
|
};
|
||||||
|
|
||||||
for (i = 0; test_cases[i].encoded; i++) {
|
for (i = 0; test_cases[i].encoded; i++) {
|
||||||
QInt *qint;
|
QNum *qnum;
|
||||||
|
int64_t val;
|
||||||
|
|
||||||
qint = qobject_to_qint(qobject_from_json(test_cases[i].encoded,
|
qnum = qobject_to_qnum(qobject_from_json(test_cases[i].encoded,
|
||||||
&error_abort));
|
&error_abort));
|
||||||
g_assert(qint);
|
g_assert(qnum);
|
||||||
g_assert(qint_get_int(qint) == test_cases[i].decoded);
|
g_assert(qnum_get_try_int(qnum, &val));
|
||||||
|
g_assert_cmpint(val, ==, test_cases[i].decoded);
|
||||||
if (test_cases[i].skip == 0) {
|
if (test_cases[i].skip == 0) {
|
||||||
QString *str;
|
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);
|
g_assert(strcmp(qstring_get_str(str), test_cases[i].encoded) == 0);
|
||||||
QDECREF(str);
|
QDECREF(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
QDECREF(qint);
|
QDECREF(qnum);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -921,12 +923,12 @@ static void float_number(void)
|
||||||
|
|
||||||
for (i = 0; test_cases[i].encoded; i++) {
|
for (i = 0; test_cases[i].encoded; i++) {
|
||||||
QObject *obj;
|
QObject *obj;
|
||||||
QFloat *qfloat;
|
QNum *qnum;
|
||||||
|
|
||||||
obj = qobject_from_json(test_cases[i].encoded, &error_abort);
|
obj = qobject_from_json(test_cases[i].encoded, &error_abort);
|
||||||
qfloat = qobject_to_qfloat(obj);
|
qnum = qobject_to_qnum(obj);
|
||||||
g_assert(qfloat);
|
g_assert(qnum);
|
||||||
g_assert(qfloat_get_double(qfloat) == test_cases[i].decoded);
|
g_assert(qnum_get_double(qnum) == test_cases[i].decoded);
|
||||||
|
|
||||||
if (test_cases[i].skip == 0) {
|
if (test_cases[i].skip == 0) {
|
||||||
QString *str;
|
QString *str;
|
||||||
|
@ -936,29 +938,31 @@ static void float_number(void)
|
||||||
QDECREF(str);
|
QDECREF(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
QDECREF(qfloat);
|
QDECREF(qnum);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vararg_number(void)
|
static void vararg_number(void)
|
||||||
{
|
{
|
||||||
QInt *qint;
|
QNum *qnum;
|
||||||
QFloat *qfloat;
|
|
||||||
int value = 0x2342;
|
int value = 0x2342;
|
||||||
long long value_ll = 0x2342342343LL;
|
long long value_ll = 0x2342342343LL;
|
||||||
double valuef = 2.323423423;
|
double valuef = 2.323423423;
|
||||||
|
int64_t val;
|
||||||
|
|
||||||
qint = qobject_to_qint(qobject_from_jsonf("%d", value));
|
qnum = qobject_to_qnum(qobject_from_jsonf("%d", value));
|
||||||
g_assert(qint_get_int(qint) == value);
|
g_assert(qnum_get_try_int(qnum, &val));
|
||||||
QDECREF(qint);
|
g_assert_cmpint(val, ==, value);
|
||||||
|
QDECREF(qnum);
|
||||||
|
|
||||||
qint = qobject_to_qint(qobject_from_jsonf("%lld", value_ll));
|
qnum = qobject_to_qnum(qobject_from_jsonf("%lld", value_ll));
|
||||||
g_assert(qint_get_int(qint) == value_ll);
|
g_assert(qnum_get_try_int(qnum, &val));
|
||||||
QDECREF(qint);
|
g_assert_cmpint(val, ==, value_ll);
|
||||||
|
QDECREF(qnum);
|
||||||
|
|
||||||
qfloat = qobject_to_qfloat(qobject_from_jsonf("%f", valuef));
|
qnum = qobject_to_qnum(qobject_from_jsonf("%f", valuef));
|
||||||
g_assert(qfloat_get_double(qfloat) == valuef);
|
g_assert(qnum_get_double(qnum) == valuef);
|
||||||
QDECREF(qfloat);
|
QDECREF(qnum);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void keyword_literal(void)
|
static void keyword_literal(void)
|
||||||
|
@ -1019,7 +1023,7 @@ struct LiteralQObject
|
||||||
{
|
{
|
||||||
int type;
|
int type;
|
||||||
union {
|
union {
|
||||||
int64_t qint;
|
int64_t qnum;
|
||||||
const char *qstr;
|
const char *qstr;
|
||||||
LiteralQDictEntry *qdict;
|
LiteralQDictEntry *qdict;
|
||||||
LiteralQObject *qlist;
|
LiteralQObject *qlist;
|
||||||
|
@ -1032,7 +1036,7 @@ struct LiteralQDictEntry
|
||||||
LiteralQObject value;
|
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_QSTR(val) (LiteralQObject){.type = QTYPE_QSTRING, .value.qstr = (val)}
|
||||||
#define QLIT_QDICT(val) (LiteralQObject){.type = QTYPE_QDICT, .value.qdict = (val)}
|
#define QLIT_QDICT(val) (LiteralQObject){.type = QTYPE_QDICT, .value.qdict = (val)}
|
||||||
#define QLIT_QLIST(val) (LiteralQObject){.type = QTYPE_QLIST, .value.qlist = (val)}
|
#define QLIT_QLIST(val) (LiteralQObject){.type = QTYPE_QLIST, .value.qlist = (val)}
|
||||||
|
@ -1064,13 +1068,16 @@ static void compare_helper(QObject *obj, void *opaque)
|
||||||
|
|
||||||
static int compare_litqobj_to_qobj(LiteralQObject *lhs, QObject *rhs)
|
static int compare_litqobj_to_qobj(LiteralQObject *lhs, QObject *rhs)
|
||||||
{
|
{
|
||||||
|
int64_t val;
|
||||||
|
|
||||||
if (!rhs || lhs->type != qobject_type(rhs)) {
|
if (!rhs || lhs->type != qobject_type(rhs)) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (lhs->type) {
|
switch (lhs->type) {
|
||||||
case QTYPE_QINT:
|
case QTYPE_QNUM:
|
||||||
return lhs->value.qint == qint_get_int(qobject_to_qint(rhs));
|
g_assert(qnum_get_try_int(qobject_to_qnum(rhs), &val));
|
||||||
|
return lhs->value.qnum == val;
|
||||||
case QTYPE_QSTRING:
|
case QTYPE_QSTRING:
|
||||||
return (strcmp(lhs->value.qstr, qstring_get_str(qobject_to_qstring(rhs))) == 0);
|
return (strcmp(lhs->value.qstr, qstring_get_str(qobject_to_qstring(rhs))) == 0);
|
||||||
case QTYPE_QDICT: {
|
case QTYPE_QDICT: {
|
||||||
|
@ -1114,7 +1121,7 @@ static void simple_dict(void)
|
||||||
{
|
{
|
||||||
.encoded = "{\"foo\": 42, \"bar\": \"hello world\"}",
|
.encoded = "{\"foo\": 42, \"bar\": \"hello world\"}",
|
||||||
.decoded = QLIT_QDICT(((LiteralQDictEntry[]){
|
.decoded = QLIT_QDICT(((LiteralQDictEntry[]){
|
||||||
{ "foo", QLIT_QINT(42) },
|
{ "foo", QLIT_QNUM(42) },
|
||||||
{ "bar", QLIT_QSTR("hello world") },
|
{ "bar", QLIT_QSTR("hello world") },
|
||||||
{ }
|
{ }
|
||||||
})),
|
})),
|
||||||
|
@ -1126,7 +1133,7 @@ static void simple_dict(void)
|
||||||
}, {
|
}, {
|
||||||
.encoded = "{\"foo\": 43}",
|
.encoded = "{\"foo\": 43}",
|
||||||
.decoded = QLIT_QDICT(((LiteralQDictEntry[]){
|
.decoded = QLIT_QDICT(((LiteralQDictEntry[]){
|
||||||
{ "foo", QLIT_QINT(43) },
|
{ "foo", QLIT_QNUM(43) },
|
||||||
{ }
|
{ }
|
||||||
})),
|
})),
|
||||||
},
|
},
|
||||||
|
@ -1212,15 +1219,15 @@ static void simple_list(void)
|
||||||
{
|
{
|
||||||
.encoded = "[43,42]",
|
.encoded = "[43,42]",
|
||||||
.decoded = QLIT_QLIST(((LiteralQObject[]){
|
.decoded = QLIT_QLIST(((LiteralQObject[]){
|
||||||
QLIT_QINT(43),
|
QLIT_QNUM(43),
|
||||||
QLIT_QINT(42),
|
QLIT_QNUM(42),
|
||||||
{ }
|
{ }
|
||||||
})),
|
})),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.encoded = "[43]",
|
.encoded = "[43]",
|
||||||
.decoded = QLIT_QLIST(((LiteralQObject[]){
|
.decoded = QLIT_QLIST(((LiteralQObject[]){
|
||||||
QLIT_QINT(43),
|
QLIT_QNUM(43),
|
||||||
{ }
|
{ }
|
||||||
})),
|
})),
|
||||||
},
|
},
|
||||||
|
@ -1269,35 +1276,35 @@ static void simple_whitespace(void)
|
||||||
{
|
{
|
||||||
.encoded = " [ 43 , 42 ]",
|
.encoded = " [ 43 , 42 ]",
|
||||||
.decoded = QLIT_QLIST(((LiteralQObject[]){
|
.decoded = QLIT_QLIST(((LiteralQObject[]){
|
||||||
QLIT_QINT(43),
|
QLIT_QNUM(43),
|
||||||
QLIT_QINT(42),
|
QLIT_QNUM(42),
|
||||||
{ }
|
{ }
|
||||||
})),
|
})),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.encoded = " [ 43 , { 'h' : 'b' }, [ ], 42 ]",
|
.encoded = " [ 43 , { 'h' : 'b' }, [ ], 42 ]",
|
||||||
.decoded = QLIT_QLIST(((LiteralQObject[]){
|
.decoded = QLIT_QLIST(((LiteralQObject[]){
|
||||||
QLIT_QINT(43),
|
QLIT_QNUM(43),
|
||||||
QLIT_QDICT(((LiteralQDictEntry[]){
|
QLIT_QDICT(((LiteralQDictEntry[]){
|
||||||
{ "h", QLIT_QSTR("b") },
|
{ "h", QLIT_QSTR("b") },
|
||||||
{ }})),
|
{ }})),
|
||||||
QLIT_QLIST(((LiteralQObject[]){
|
QLIT_QLIST(((LiteralQObject[]){
|
||||||
{ }})),
|
{ }})),
|
||||||
QLIT_QINT(42),
|
QLIT_QNUM(42),
|
||||||
{ }
|
{ }
|
||||||
})),
|
})),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.encoded = " [ 43 , { 'h' : 'b' , 'a' : 32 }, [ ], 42 ]",
|
.encoded = " [ 43 , { 'h' : 'b' , 'a' : 32 }, [ ], 42 ]",
|
||||||
.decoded = QLIT_QLIST(((LiteralQObject[]){
|
.decoded = QLIT_QLIST(((LiteralQObject[]){
|
||||||
QLIT_QINT(43),
|
QLIT_QNUM(43),
|
||||||
QLIT_QDICT(((LiteralQDictEntry[]){
|
QLIT_QDICT(((LiteralQDictEntry[]){
|
||||||
{ "h", QLIT_QSTR("b") },
|
{ "h", QLIT_QSTR("b") },
|
||||||
{ "a", QLIT_QINT(32) },
|
{ "a", QLIT_QNUM(32) },
|
||||||
{ }})),
|
{ }})),
|
||||||
QLIT_QLIST(((LiteralQObject[]){
|
QLIT_QLIST(((LiteralQObject[]){
|
||||||
{ }})),
|
{ }})),
|
||||||
QLIT_QINT(42),
|
QLIT_QNUM(42),
|
||||||
{ }
|
{ }
|
||||||
})),
|
})),
|
||||||
},
|
},
|
||||||
|
@ -1327,11 +1334,11 @@ static void simple_varargs(void)
|
||||||
QObject *embedded_obj;
|
QObject *embedded_obj;
|
||||||
QObject *obj;
|
QObject *obj;
|
||||||
LiteralQObject decoded = QLIT_QLIST(((LiteralQObject[]){
|
LiteralQObject decoded = QLIT_QLIST(((LiteralQObject[]){
|
||||||
QLIT_QINT(1),
|
QLIT_QNUM(1),
|
||||||
QLIT_QINT(2),
|
QLIT_QNUM(2),
|
||||||
QLIT_QLIST(((LiteralQObject[]){
|
QLIT_QLIST(((LiteralQObject[]){
|
||||||
QLIT_QINT(32),
|
QLIT_QNUM(32),
|
||||||
QLIT_QINT(42),
|
QLIT_QNUM(42),
|
||||||
{}})),
|
{}})),
|
||||||
{}}));
|
{}}));
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,8 @@
|
||||||
*/
|
*/
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
|
||||||
#include "qapi/qmp/qint.h"
|
#include "qapi/error.h"
|
||||||
|
#include "qapi/qmp/qnum.h"
|
||||||
#include "qapi/qmp/qlist.h"
|
#include "qapi/qmp/qlist.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -35,11 +36,11 @@ static void qlist_new_test(void)
|
||||||
|
|
||||||
static void qlist_append_test(void)
|
static void qlist_append_test(void)
|
||||||
{
|
{
|
||||||
QInt *qi;
|
QNum *qi;
|
||||||
QList *qlist;
|
QList *qlist;
|
||||||
QListEntry *entry;
|
QListEntry *entry;
|
||||||
|
|
||||||
qi = qint_from_int(42);
|
qi = qnum_from_int(42);
|
||||||
|
|
||||||
qlist = qlist_new();
|
qlist = qlist_new();
|
||||||
qlist_append(qlist, qi);
|
qlist_append(qlist, qi);
|
||||||
|
@ -84,13 +85,17 @@ static const int iter_max = 42;
|
||||||
|
|
||||||
static void iter_func(QObject *obj, void *opaque)
|
static void iter_func(QObject *obj, void *opaque)
|
||||||
{
|
{
|
||||||
QInt *qi;
|
QNum *qi;
|
||||||
|
int64_t val;
|
||||||
|
|
||||||
g_assert(opaque == NULL);
|
g_assert(opaque == NULL);
|
||||||
|
|
||||||
qi = qobject_to_qint(obj);
|
qi = qobject_to_qnum(obj);
|
||||||
g_assert(qi != NULL);
|
g_assert(qi != NULL);
|
||||||
g_assert((qint_get_int(qi) >= 0) && (qint_get_int(qi) <= iter_max));
|
|
||||||
|
g_assert(qnum_get_try_int(qi, &val));
|
||||||
|
g_assert_cmpint(val, >=, 0);
|
||||||
|
g_assert_cmpint(val, <=, iter_max);
|
||||||
|
|
||||||
iter_called++;
|
iter_called++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,136 @@
|
||||||
|
/*
|
||||||
|
* QNum unit-tests.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Red Hat Inc.
|
||||||
|
* Copyright IBM, Corp. 2009
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Luiz Capitulino <lcapitulino@redhat.com>
|
||||||
|
* 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/qnum.h"
|
||||||
|
#include "qapi/error.h"
|
||||||
|
#include "qemu-common.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Public Interface test-cases
|
||||||
|
*
|
||||||
|
* (with some violations to access 'private' data)
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void qnum_from_int_test(void)
|
||||||
|
{
|
||||||
|
QNum *qn;
|
||||||
|
const int value = -42;
|
||||||
|
|
||||||
|
qn = qnum_from_int(value);
|
||||||
|
g_assert(qn != NULL);
|
||||||
|
g_assert_cmpint(qn->kind, ==, QNUM_I64);
|
||||||
|
g_assert_cmpint(qn->u.i64, ==, value);
|
||||||
|
g_assert_cmpint(qn->base.refcnt, ==, 1);
|
||||||
|
g_assert_cmpint(qobject_type(QOBJECT(qn)), ==, QTYPE_QNUM);
|
||||||
|
|
||||||
|
// destroy doesn't exit yet
|
||||||
|
g_free(qn);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void qnum_from_double_test(void)
|
||||||
|
{
|
||||||
|
QNum *qn;
|
||||||
|
const double value = -42.23423;
|
||||||
|
|
||||||
|
qn = qnum_from_double(value);
|
||||||
|
g_assert(qn != NULL);
|
||||||
|
g_assert_cmpint(qn->kind, ==, QNUM_DOUBLE);
|
||||||
|
g_assert_cmpfloat(qn->u.dbl, ==, value);
|
||||||
|
g_assert_cmpint(qn->base.refcnt, ==, 1);
|
||||||
|
g_assert_cmpint(qobject_type(QOBJECT(qn)), ==, QTYPE_QNUM);
|
||||||
|
|
||||||
|
// destroy doesn't exit yet
|
||||||
|
g_free(qn);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void qnum_from_int64_test(void)
|
||||||
|
{
|
||||||
|
QNum *qn;
|
||||||
|
const int64_t value = 0x1234567890abcdefLL;
|
||||||
|
|
||||||
|
qn = qnum_from_int(value);
|
||||||
|
g_assert_cmpint((int64_t) qn->u.i64, ==, value);
|
||||||
|
|
||||||
|
QDECREF(qn);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void qnum_get_int_test(void)
|
||||||
|
{
|
||||||
|
QNum *qn;
|
||||||
|
const int value = 123456;
|
||||||
|
|
||||||
|
qn = qnum_from_int(value);
|
||||||
|
g_assert_cmpint(qnum_get_int(qn), ==, value);
|
||||||
|
|
||||||
|
QDECREF(qn);
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
|
@ -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
|
prefix QTYPE
|
||||||
enum Status ['good', 'bad', 'ugly']
|
enum Status ['good', 'bad', 'ugly']
|
||||||
object q_empty
|
object q_empty
|
||||||
|
|
|
@ -6,7 +6,7 @@ object Object
|
||||||
tag base1
|
tag base1
|
||||||
case one: Variant1
|
case one: Variant1
|
||||||
case two: Variant2
|
case two: Variant2
|
||||||
enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool']
|
enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
|
||||||
prefix QTYPE
|
prefix QTYPE
|
||||||
object SugaredUnion
|
object SugaredUnion
|
||||||
member type: SugaredUnionKind optional=False
|
member type: SugaredUnionKind optional=False
|
||||||
|
|
|
@ -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
|
prefix QTYPE
|
||||||
object q_empty
|
object q_empty
|
||||||
|
|
|
@ -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
|
prefix QTYPE
|
||||||
event oops None
|
event oops None
|
||||||
boxed=False
|
boxed=False
|
||||||
|
|
|
@ -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
|
prefix QTYPE
|
||||||
command fooA q_obj_fooA-arg -> None
|
command fooA q_obj_fooA-arg -> None
|
||||||
gen=True success_response=True boxed=False
|
gen=True success_response=True boxed=False
|
||||||
|
|
|
@ -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
|
prefix QTYPE
|
||||||
enum Status ['good', 'bad', 'ugly']
|
enum Status ['good', 'bad', 'ugly']
|
||||||
object q_empty
|
object q_empty
|
||||||
|
|
|
@ -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
|
prefix QTYPE
|
||||||
enum Status ['good', 'bad', 'ugly']
|
enum Status ['good', 'bad', 'ugly']
|
||||||
object q_empty
|
object q_empty
|
||||||
|
|
|
@ -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
|
prefix QTYPE
|
||||||
enum Status ['good', 'bad', 'ugly']
|
enum Status ['good', 'bad', 'ugly']
|
||||||
object q_empty
|
object q_empty
|
||||||
|
|
|
@ -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
|
prefix QTYPE
|
||||||
command eins None -> None
|
command eins None -> None
|
||||||
gen=True success_response=True boxed=False
|
gen=True success_response=True boxed=False
|
||||||
|
|
|
@ -50,7 +50,7 @@ object NestedEnumsOne
|
||||||
member enum4: EnumOne optional=True
|
member enum4: EnumOne optional=True
|
||||||
enum QEnumTwo ['value1', 'value2']
|
enum QEnumTwo ['value1', 'value2']
|
||||||
prefix QENUM_TWO
|
prefix QENUM_TWO
|
||||||
enum QType ['none', 'qnull', 'qint', 'qstring', 'qdict', 'qlist', 'qfloat', 'qbool']
|
enum QType ['none', 'qnull', 'qnum', 'qstring', 'qdict', 'qlist', 'qbool']
|
||||||
prefix QTYPE
|
prefix QTYPE
|
||||||
object TestStruct
|
object TestStruct
|
||||||
member integer: int optional=False
|
member integer: int optional=False
|
||||||
|
|
|
@ -162,7 +162,8 @@ static void test_dispatch_cmd_io(void)
|
||||||
QDict *ud1b = qdict_new();
|
QDict *ud1b = qdict_new();
|
||||||
QDict *ret, *ret_dict, *ret_dict_dict, *ret_dict_dict_userdef;
|
QDict *ret, *ret_dict, *ret_dict_dict, *ret_dict_dict_userdef;
|
||||||
QDict *ret_dict_dict2, *ret_dict_dict2_userdef;
|
QDict *ret_dict_dict2, *ret_dict_dict2_userdef;
|
||||||
QInt *ret3;
|
QNum *ret3;
|
||||||
|
int64_t val;
|
||||||
|
|
||||||
qdict_put_int(ud1a, "integer", 42);
|
qdict_put_int(ud1a, "integer", 42);
|
||||||
qdict_put_str(ud1a, "string", "hello");
|
qdict_put_str(ud1a, "string", "hello");
|
||||||
|
@ -194,8 +195,9 @@ static void test_dispatch_cmd_io(void)
|
||||||
qdict_put(req, "arguments", args3);
|
qdict_put(req, "arguments", args3);
|
||||||
qdict_put_str(req, "execute", "guest-get-time");
|
qdict_put_str(req, "execute", "guest-get-time");
|
||||||
|
|
||||||
ret3 = qobject_to_qint(test_qmp_dispatch(req));
|
ret3 = qobject_to_qnum(test_qmp_dispatch(req));
|
||||||
assert(qint_get_int(ret3) == 66);
|
g_assert(qnum_get_try_int(ret3, &val));
|
||||||
|
g_assert_cmpint(val, ==, 66);
|
||||||
QDECREF(ret3);
|
QDECREF(ret3);
|
||||||
|
|
||||||
QDECREF(req);
|
QDECREF(req);
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
#include "test-qapi-visit.h"
|
#include "test-qapi-visit.h"
|
||||||
#include "test-qapi-event.h"
|
#include "test-qapi-event.h"
|
||||||
#include "qapi/qmp/types.h"
|
#include "qapi/qmp/types.h"
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qmp/qobject.h"
|
#include "qapi/qmp/qobject.h"
|
||||||
#include "qapi/qmp-event.h"
|
#include "qapi/qmp-event.h"
|
||||||
|
|
||||||
|
@ -41,6 +40,7 @@ void qdict_cmp_do_simple(const char *key, QObject *obj1, void *opaque)
|
||||||
{
|
{
|
||||||
QObject *obj2;
|
QObject *obj2;
|
||||||
QDictCmpData d_new, *d = opaque;
|
QDictCmpData d_new, *d = opaque;
|
||||||
|
int64_t val1, val2;
|
||||||
|
|
||||||
if (!d->result) {
|
if (!d->result) {
|
||||||
return;
|
return;
|
||||||
|
@ -62,9 +62,10 @@ void qdict_cmp_do_simple(const char *key, QObject *obj1, void *opaque)
|
||||||
d->result = (qbool_get_bool(qobject_to_qbool(obj1)) ==
|
d->result = (qbool_get_bool(qobject_to_qbool(obj1)) ==
|
||||||
qbool_get_bool(qobject_to_qbool(obj2)));
|
qbool_get_bool(qobject_to_qbool(obj2)));
|
||||||
return;
|
return;
|
||||||
case QTYPE_QINT:
|
case QTYPE_QNUM:
|
||||||
d->result = (qint_get_int(qobject_to_qint(obj1)) ==
|
g_assert(qnum_get_try_int(qobject_to_qnum(obj1), &val1));
|
||||||
qint_get_int(qobject_to_qint(obj2)));
|
g_assert(qnum_get_try_int(qobject_to_qnum(obj2), &val2));
|
||||||
|
d->result = val1 == val2;
|
||||||
return;
|
return;
|
||||||
case QTYPE_QSTRING:
|
case QTYPE_QSTRING:
|
||||||
d->result = g_strcmp0(qstring_get_str(qobject_to_qstring(obj1)),
|
d->result = g_strcmp0(qstring_get_str(qobject_to_qstring(obj1)),
|
||||||
|
|
|
@ -165,9 +165,10 @@ static void test_visitor_in_int_overflow(TestInputVisitorData *data,
|
||||||
Error *err = NULL;
|
Error *err = NULL;
|
||||||
Visitor *v;
|
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
|
* This will overflow a QNUM_I64, so should be deserialized into a
|
||||||
* to visit_type_int. confirm this.
|
* QNUM_DOUBLE field instead, leading to an error if we pass it to
|
||||||
|
* visit_type_int(). Confirm this.
|
||||||
*/
|
*/
|
||||||
v = visitor_input_test_init(data, "%f", DBL_MAX);
|
v = visitor_input_test_init(data, "%f", DBL_MAX);
|
||||||
|
|
||||||
|
@ -469,17 +470,19 @@ static void test_visitor_in_any(TestInputVisitorData *data,
|
||||||
{
|
{
|
||||||
QObject *res = NULL;
|
QObject *res = NULL;
|
||||||
Visitor *v;
|
Visitor *v;
|
||||||
QInt *qint;
|
QNum *qnum;
|
||||||
QBool *qbool;
|
QBool *qbool;
|
||||||
QString *qstring;
|
QString *qstring;
|
||||||
QDict *qdict;
|
QDict *qdict;
|
||||||
QObject *qobj;
|
QObject *qobj;
|
||||||
|
int64_t val;
|
||||||
|
|
||||||
v = visitor_input_test_init(data, "-42");
|
v = visitor_input_test_init(data, "-42");
|
||||||
visit_type_any(v, NULL, &res, &error_abort);
|
visit_type_any(v, NULL, &res, &error_abort);
|
||||||
qint = qobject_to_qint(res);
|
qnum = qobject_to_qnum(res);
|
||||||
g_assert(qint);
|
g_assert(qnum);
|
||||||
g_assert_cmpint(qint_get_int(qint), ==, -42);
|
g_assert(qnum_get_try_int(qnum, &val));
|
||||||
|
g_assert_cmpint(val, ==, -42);
|
||||||
qobject_decref(res);
|
qobject_decref(res);
|
||||||
|
|
||||||
v = visitor_input_test_init(data, "{ 'integer': -42, 'boolean': true, 'string': 'foo' }");
|
v = visitor_input_test_init(data, "{ 'integer': -42, 'boolean': true, 'string': 'foo' }");
|
||||||
|
@ -488,9 +491,10 @@ static void test_visitor_in_any(TestInputVisitorData *data,
|
||||||
g_assert(qdict && qdict_size(qdict) == 3);
|
g_assert(qdict && qdict_size(qdict) == 3);
|
||||||
qobj = qdict_get(qdict, "integer");
|
qobj = qdict_get(qdict, "integer");
|
||||||
g_assert(qobj);
|
g_assert(qobj);
|
||||||
qint = qobject_to_qint(qobj);
|
qnum = qobject_to_qnum(qobj);
|
||||||
g_assert(qint);
|
g_assert(qnum);
|
||||||
g_assert_cmpint(qint_get_int(qint), ==, -42);
|
g_assert(qnum_get_try_int(qnum, &val));
|
||||||
|
g_assert_cmpint(val, ==, -42);
|
||||||
qobj = qdict_get(qdict, "boolean");
|
qobj = qdict_get(qdict, "boolean");
|
||||||
g_assert(qobj);
|
g_assert(qobj);
|
||||||
qbool = qobject_to_qbool(qobj);
|
qbool = qobject_to_qbool(qobj);
|
||||||
|
@ -568,7 +572,7 @@ static void test_visitor_in_alternate(TestInputVisitorData *data,
|
||||||
|
|
||||||
v = visitor_input_test_init(data, "42");
|
v = visitor_input_test_init(data, "42");
|
||||||
visit_type_UserDefAlternate(v, NULL, &tmp, &error_abort);
|
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);
|
g_assert_cmpint(tmp->u.i, ==, 42);
|
||||||
qapi_free_UserDefAlternate(tmp);
|
qapi_free_UserDefAlternate(tmp);
|
||||||
|
|
||||||
|
@ -596,7 +600,7 @@ static void test_visitor_in_alternate(TestInputVisitorData *data,
|
||||||
|
|
||||||
v = visitor_input_test_init(data, "{ 'alt': 42 }");
|
v = visitor_input_test_init(data, "{ 'alt': 42 }");
|
||||||
visit_type_WrapAlternate(v, NULL, &wrap, &error_abort);
|
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);
|
g_assert_cmpint(wrap->alt->u.i, ==, 42);
|
||||||
qapi_free_WrapAlternate(wrap);
|
qapi_free_WrapAlternate(wrap);
|
||||||
|
|
||||||
|
@ -637,19 +641,19 @@ static void test_visitor_in_alternate_number(TestInputVisitorData *data,
|
||||||
|
|
||||||
v = visitor_input_test_init(data, "42");
|
v = visitor_input_test_init(data, "42");
|
||||||
visit_type_AltEnumNum(v, NULL, &aen, &error_abort);
|
visit_type_AltEnumNum(v, NULL, &aen, &error_abort);
|
||||||
g_assert_cmpint(aen->type, ==, QTYPE_QFLOAT);
|
g_assert_cmpint(aen->type, ==, QTYPE_QNUM);
|
||||||
g_assert_cmpfloat(aen->u.n, ==, 42);
|
g_assert_cmpfloat(aen->u.n, ==, 42);
|
||||||
qapi_free_AltEnumNum(aen);
|
qapi_free_AltEnumNum(aen);
|
||||||
|
|
||||||
v = visitor_input_test_init(data, "42");
|
v = visitor_input_test_init(data, "42");
|
||||||
visit_type_AltNumEnum(v, NULL, &ans, &error_abort);
|
visit_type_AltNumEnum(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);
|
g_assert_cmpfloat(ans->u.n, ==, 42);
|
||||||
qapi_free_AltNumEnum(ans);
|
qapi_free_AltNumEnum(ans);
|
||||||
|
|
||||||
v = visitor_input_test_init(data, "42");
|
v = visitor_input_test_init(data, "42");
|
||||||
visit_type_AltEnumInt(v, NULL, &asi, &error_abort);
|
visit_type_AltEnumInt(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);
|
g_assert_cmpint(asi->u.i, ==, 42);
|
||||||
qapi_free_AltEnumInt(asi);
|
qapi_free_AltEnumInt(asi);
|
||||||
|
|
||||||
|
@ -662,13 +666,13 @@ static void test_visitor_in_alternate_number(TestInputVisitorData *data,
|
||||||
|
|
||||||
v = visitor_input_test_init(data, "42.5");
|
v = visitor_input_test_init(data, "42.5");
|
||||||
visit_type_AltEnumNum(v, NULL, &aen, &error_abort);
|
visit_type_AltEnumNum(v, NULL, &aen, &error_abort);
|
||||||
g_assert_cmpint(aen->type, ==, QTYPE_QFLOAT);
|
g_assert_cmpint(aen->type, ==, QTYPE_QNUM);
|
||||||
g_assert_cmpfloat(aen->u.n, ==, 42.5);
|
g_assert_cmpfloat(aen->u.n, ==, 42.5);
|
||||||
qapi_free_AltEnumNum(aen);
|
qapi_free_AltEnumNum(aen);
|
||||||
|
|
||||||
v = visitor_input_test_init(data, "42.5");
|
v = visitor_input_test_init(data, "42.5");
|
||||||
visit_type_AltNumEnum(v, NULL, &ans, &error_abort);
|
visit_type_AltNumEnum(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);
|
g_assert_cmpfloat(ans->u.n, ==, 42.5);
|
||||||
qapi_free_AltNumEnum(ans);
|
qapi_free_AltNumEnum(ans);
|
||||||
|
|
||||||
|
|
|
@ -58,13 +58,15 @@ static void test_visitor_out_int(TestOutputVisitorData *data,
|
||||||
const void *unused)
|
const void *unused)
|
||||||
{
|
{
|
||||||
int64_t value = -42;
|
int64_t value = -42;
|
||||||
QInt *qint;
|
int64_t val;
|
||||||
|
QNum *qnum;
|
||||||
|
|
||||||
visit_type_int(data->ov, NULL, &value, &error_abort);
|
visit_type_int(data->ov, NULL, &value, &error_abort);
|
||||||
|
|
||||||
qint = qobject_to_qint(visitor_get(data));
|
qnum = qobject_to_qnum(visitor_get(data));
|
||||||
g_assert(qint);
|
g_assert(qnum);
|
||||||
g_assert_cmpint(qint_get_int(qint), ==, value);
|
g_assert(qnum_get_try_int(qnum, &val));
|
||||||
|
g_assert_cmpint(val, ==, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_visitor_out_bool(TestOutputVisitorData *data,
|
static void test_visitor_out_bool(TestOutputVisitorData *data,
|
||||||
|
@ -84,13 +86,13 @@ static void test_visitor_out_number(TestOutputVisitorData *data,
|
||||||
const void *unused)
|
const void *unused)
|
||||||
{
|
{
|
||||||
double value = 3.14;
|
double value = 3.14;
|
||||||
QFloat *qfloat;
|
QNum *qnum;
|
||||||
|
|
||||||
visit_type_number(data->ov, NULL, &value, &error_abort);
|
visit_type_number(data->ov, NULL, &value, &error_abort);
|
||||||
|
|
||||||
qfloat = qobject_to_qfloat(visitor_get(data));
|
qnum = qobject_to_qnum(visitor_get(data));
|
||||||
g_assert(qfloat);
|
g_assert(qnum);
|
||||||
g_assert(qfloat_get_double(qfloat) == value);
|
g_assert(qnum_get_double(qnum) == value);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_visitor_out_string(TestOutputVisitorData *data,
|
static void test_visitor_out_string(TestOutputVisitorData *data,
|
||||||
|
@ -329,16 +331,18 @@ static void test_visitor_out_any(TestOutputVisitorData *data,
|
||||||
const void *unused)
|
const void *unused)
|
||||||
{
|
{
|
||||||
QObject *qobj;
|
QObject *qobj;
|
||||||
QInt *qint;
|
QNum *qnum;
|
||||||
QBool *qbool;
|
QBool *qbool;
|
||||||
QString *qstring;
|
QString *qstring;
|
||||||
QDict *qdict;
|
QDict *qdict;
|
||||||
|
int64_t val;
|
||||||
|
|
||||||
qobj = QOBJECT(qint_from_int(-42));
|
qobj = QOBJECT(qnum_from_int(-42));
|
||||||
visit_type_any(data->ov, NULL, &qobj, &error_abort);
|
visit_type_any(data->ov, NULL, &qobj, &error_abort);
|
||||||
qint = qobject_to_qint(visitor_get(data));
|
qnum = qobject_to_qnum(visitor_get(data));
|
||||||
g_assert(qint);
|
g_assert(qnum);
|
||||||
g_assert_cmpint(qint_get_int(qint), ==, -42);
|
g_assert(qnum_get_try_int(qnum, &val));
|
||||||
|
g_assert_cmpint(val, ==, -42);
|
||||||
qobject_decref(qobj);
|
qobject_decref(qobj);
|
||||||
|
|
||||||
visitor_reset(data);
|
visitor_reset(data);
|
||||||
|
@ -351,9 +355,10 @@ static void test_visitor_out_any(TestOutputVisitorData *data,
|
||||||
qobject_decref(qobj);
|
qobject_decref(qobj);
|
||||||
qdict = qobject_to_qdict(visitor_get(data));
|
qdict = qobject_to_qdict(visitor_get(data));
|
||||||
g_assert(qdict);
|
g_assert(qdict);
|
||||||
qint = qobject_to_qint(qdict_get(qdict, "integer"));
|
qnum = qobject_to_qnum(qdict_get(qdict, "integer"));
|
||||||
g_assert(qint);
|
g_assert(qnum);
|
||||||
g_assert_cmpint(qint_get_int(qint), ==, -42);
|
g_assert(qnum_get_try_int(qnum, &val));
|
||||||
|
g_assert_cmpint(val, ==, -42);
|
||||||
qbool = qobject_to_qbool(qdict_get(qdict, "boolean"));
|
qbool = qobject_to_qbool(qdict_get(qdict, "boolean"));
|
||||||
g_assert(qbool);
|
g_assert(qbool);
|
||||||
g_assert(qbool_get_bool(qbool) == true);
|
g_assert(qbool_get_bool(qbool) == true);
|
||||||
|
@ -388,18 +393,20 @@ static void test_visitor_out_alternate(TestOutputVisitorData *data,
|
||||||
const void *unused)
|
const void *unused)
|
||||||
{
|
{
|
||||||
UserDefAlternate *tmp;
|
UserDefAlternate *tmp;
|
||||||
QInt *qint;
|
QNum *qnum;
|
||||||
QString *qstr;
|
QString *qstr;
|
||||||
QDict *qdict;
|
QDict *qdict;
|
||||||
|
int64_t val;
|
||||||
|
|
||||||
tmp = g_new0(UserDefAlternate, 1);
|
tmp = g_new0(UserDefAlternate, 1);
|
||||||
tmp->type = QTYPE_QINT;
|
tmp->type = QTYPE_QNUM;
|
||||||
tmp->u.i = 42;
|
tmp->u.i = 42;
|
||||||
|
|
||||||
visit_type_UserDefAlternate(data->ov, NULL, &tmp, &error_abort);
|
visit_type_UserDefAlternate(data->ov, NULL, &tmp, &error_abort);
|
||||||
qint = qobject_to_qint(visitor_get(data));
|
qnum = qobject_to_qnum(visitor_get(data));
|
||||||
g_assert(qint);
|
g_assert(qnum);
|
||||||
g_assert_cmpint(qint_get_int(qint), ==, 42);
|
g_assert(qnum_get_try_int(qnum, &val));
|
||||||
|
g_assert_cmpint(val, ==, 42);
|
||||||
|
|
||||||
qapi_free_UserDefAlternate(tmp);
|
qapi_free_UserDefAlternate(tmp);
|
||||||
|
|
||||||
|
@ -603,18 +610,22 @@ static void check_native_list(QObject *qobj,
|
||||||
case USER_DEF_NATIVE_LIST_UNION_KIND_U16:
|
case USER_DEF_NATIVE_LIST_UNION_KIND_U16:
|
||||||
case USER_DEF_NATIVE_LIST_UNION_KIND_U32:
|
case USER_DEF_NATIVE_LIST_UNION_KIND_U32:
|
||||||
case USER_DEF_NATIVE_LIST_UNION_KIND_U64:
|
case USER_DEF_NATIVE_LIST_UNION_KIND_U64:
|
||||||
/* all integer elements in JSON arrays get stored into QInts when
|
/*
|
||||||
* we convert to QObjects, so we can check them all in the same
|
* All integer elements in JSON arrays get stored into QNums
|
||||||
* fashion, so simply fall through here
|
* when 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:
|
case USER_DEF_NATIVE_LIST_UNION_KIND_INTEGER:
|
||||||
for (i = 0; i < 32; i++) {
|
for (i = 0; i < 32; i++) {
|
||||||
QObject *tmp;
|
QObject *tmp;
|
||||||
QInt *qvalue;
|
QNum *qvalue;
|
||||||
|
int64_t val;
|
||||||
|
|
||||||
tmp = qlist_peek(qlist);
|
tmp = qlist_peek(qlist);
|
||||||
g_assert(tmp);
|
g_assert(tmp);
|
||||||
qvalue = qobject_to_qint(tmp);
|
qvalue = qobject_to_qnum(tmp);
|
||||||
g_assert_cmpint(qint_get_int(qvalue), ==, i);
|
g_assert(qnum_get_try_int(qvalue, &val));
|
||||||
|
g_assert_cmpint(val, ==, i);
|
||||||
qobject_decref(qlist_pop(qlist));
|
qobject_decref(qlist_pop(qlist));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -645,15 +656,15 @@ static void check_native_list(QObject *qobj,
|
||||||
case USER_DEF_NATIVE_LIST_UNION_KIND_NUMBER:
|
case USER_DEF_NATIVE_LIST_UNION_KIND_NUMBER:
|
||||||
for (i = 0; i < 32; i++) {
|
for (i = 0; i < 32; i++) {
|
||||||
QObject *tmp;
|
QObject *tmp;
|
||||||
QFloat *qvalue;
|
QNum *qvalue;
|
||||||
GString *double_expected = g_string_new("");
|
GString *double_expected = g_string_new("");
|
||||||
GString *double_actual = g_string_new("");
|
GString *double_actual = g_string_new("");
|
||||||
|
|
||||||
tmp = qlist_peek(qlist);
|
tmp = qlist_peek(qlist);
|
||||||
g_assert(tmp);
|
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_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);
|
g_assert_cmpstr(double_actual->str, ==, double_expected->str);
|
||||||
|
|
||||||
qobject_decref(qlist_pop(qlist));
|
qobject_decref(qlist_pop(qlist));
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "qemu-common.h"
|
#include "qemu-common.h"
|
||||||
#include "qapi/qmp/qlist.h"
|
#include "qapi/error.h"
|
||||||
#include "qapi/qmp/qstring.h"
|
|
||||||
#include "qapi/qmp/qdict.h"
|
#include "qapi/qmp/qdict.h"
|
||||||
#include "qapi/qmp/qint.h"
|
#include "qapi/qmp/qnum.h"
|
||||||
#include "qapi/qmp/qbool.h"
|
#include "qapi/qmp/qbool.h"
|
||||||
#include "libqtest.h"
|
#include "libqtest.h"
|
||||||
|
|
||||||
|
@ -57,12 +56,14 @@ static void test_cpuid_prop(const void *data)
|
||||||
{
|
{
|
||||||
const CpuidTestArgs *args = data;
|
const CpuidTestArgs *args = data;
|
||||||
char *path;
|
char *path;
|
||||||
QInt *value;
|
QNum *value;
|
||||||
|
int64_t val;
|
||||||
|
|
||||||
qtest_start(args->cmdline);
|
qtest_start(args->cmdline);
|
||||||
path = get_cpu0_qom_path();
|
path = get_cpu0_qom_path();
|
||||||
value = qobject_to_qint(qom_get(path, args->property));
|
value = qobject_to_qnum(qom_get(path, args->property));
|
||||||
g_assert_cmpint(qint_get_int(value), ==, args->expected_value);
|
g_assert(qnum_get_try_int(value, &val));
|
||||||
|
g_assert_cmpint(val, ==, args->expected_value);
|
||||||
qtest_end();
|
qtest_end();
|
||||||
|
|
||||||
QDECREF(value);
|
QDECREF(value);
|
||||||
|
@ -109,12 +110,15 @@ static uint32_t get_feature_word(QList *features, uint32_t eax, uint32_t ecx,
|
||||||
uint32_t reax = qdict_get_int(w, "cpuid-input-eax");
|
uint32_t reax = qdict_get_int(w, "cpuid-input-eax");
|
||||||
bool has_ecx = qdict_haskey(w, "cpuid-input-ecx");
|
bool has_ecx = qdict_haskey(w, "cpuid-input-ecx");
|
||||||
uint32_t recx = 0;
|
uint32_t recx = 0;
|
||||||
|
int64_t val;
|
||||||
|
|
||||||
if (has_ecx) {
|
if (has_ecx) {
|
||||||
recx = qdict_get_int(w, "cpuid-input-ecx");
|
recx = qdict_get_int(w, "cpuid-input-ecx");
|
||||||
}
|
}
|
||||||
if (eax == reax && (!has_ecx || ecx == recx) && !strcmp(rreg, reg)) {
|
if (eax == reax && (!has_ecx || ecx == recx) && !strcmp(rreg, reg)) {
|
||||||
return qint_get_int(qobject_to_qint(qdict_get(w, "features")));
|
g_assert(qnum_get_try_int(qobject_to_qnum(qdict_get(w, "features")),
|
||||||
|
&val));
|
||||||
|
return val;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -30,7 +30,6 @@
|
||||||
#include "qemu-x509.h"
|
#include "qemu-x509.h"
|
||||||
#include "qemu/sockets.h"
|
#include "qemu/sockets.h"
|
||||||
#include "qmp-commands.h"
|
#include "qmp-commands.h"
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qmp/qbool.h"
|
#include "qapi/qmp/qbool.h"
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
#include "qapi/qmp/qjson.h"
|
#include "qapi/qmp/qjson.h"
|
||||||
|
|
|
@ -44,7 +44,6 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "qemu/bswap.h"
|
#include "qemu/bswap.h"
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "vnc.h"
|
#include "vnc.h"
|
||||||
#include "vnc-enc-tight.h"
|
#include "vnc-enc-tight.h"
|
||||||
#include "vnc-palette.h"
|
#include "vnc-palette.h"
|
||||||
|
|
|
@ -941,9 +941,8 @@ typedef struct OptsFromQDictState {
|
||||||
static void qemu_opts_from_qdict_1(const char *key, QObject *obj, void *opaque)
|
static void qemu_opts_from_qdict_1(const char *key, QObject *obj, void *opaque)
|
||||||
{
|
{
|
||||||
OptsFromQDictState *state = opaque;
|
OptsFromQDictState *state = opaque;
|
||||||
char buf[32];
|
char buf[32], *tmp = NULL;
|
||||||
const char *value;
|
const char *value;
|
||||||
int n;
|
|
||||||
|
|
||||||
if (!strcmp(key, "id") || *state->errp) {
|
if (!strcmp(key, "id") || *state->errp) {
|
||||||
return;
|
return;
|
||||||
|
@ -953,17 +952,9 @@ static void qemu_opts_from_qdict_1(const char *key, QObject *obj, void *opaque)
|
||||||
case QTYPE_QSTRING:
|
case QTYPE_QSTRING:
|
||||||
value = qstring_get_str(qobject_to_qstring(obj));
|
value = qstring_get_str(qobject_to_qstring(obj));
|
||||||
break;
|
break;
|
||||||
case QTYPE_QINT:
|
case QTYPE_QNUM:
|
||||||
n = snprintf(buf, sizeof(buf), "%" PRId64,
|
tmp = qnum_to_string(qobject_to_qnum(obj));
|
||||||
qint_get_int(qobject_to_qint(obj)));
|
value = tmp;
|
||||||
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;
|
|
||||||
break;
|
break;
|
||||||
case QTYPE_QBOOL:
|
case QTYPE_QBOOL:
|
||||||
pstrcpy(buf, sizeof(buf),
|
pstrcpy(buf, sizeof(buf),
|
||||||
|
@ -975,13 +966,14 @@ static void qemu_opts_from_qdict_1(const char *key, QObject *obj, void *opaque)
|
||||||
}
|
}
|
||||||
|
|
||||||
qemu_opt_set(state->opts, key, value, state->errp);
|
qemu_opt_set(state->opts, key, value, state->errp);
|
||||||
|
g_free(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create QemuOpts from a QDict.
|
* Create QemuOpts from a QDict.
|
||||||
* Use value of key "id" as ID if it exists and is a QString.
|
* Use value of key "id" as ID if it exists and is a QString. Only
|
||||||
* Only QStrings, QInts, QFloats and QBools are copied. Entries with
|
* QStrings, QNums and QBools are copied. Entries with other types
|
||||||
* other types are silently ignored.
|
* are silently ignored.
|
||||||
*/
|
*/
|
||||||
QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict,
|
QemuOpts *qemu_opts_from_qdict(QemuOptsList *list, const QDict *qdict,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
|
|
Loading…
Reference in New Issue