X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=qobject%2Fqnum.c;h=7012fc57f2fbe5bbbc71add116a66eecc9a70103;hb=6b7ac49d570c66754fad1b80cc200c7596d1facd;hp=476e81c93b37f35c3ac131ba5c5396357826fc7e;hpb=61a8f418b26a2d974e38e4ae55020aca8d402d88;p=mirror_qemu.git diff --git a/qobject/qnum.c b/qobject/qnum.c index 476e81c93b..7012fc57f2 100644 --- a/qobject/qnum.c +++ b/qobject/qnum.c @@ -13,10 +13,7 @@ */ #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 @@ -202,14 +199,57 @@ char *qnum_to_string(QNum *qn) } /** - * qobject_to_qnum(): Convert a QObject into a QNum + * qnum_is_equal(): Test whether the two QNums are equal + * + * Negative integers are never considered equal to unsigned integers, + * but positive integers in the range [0, INT64_MAX] are considered + * equal independently of whether the QNum's kind is i64 or u64. + * + * Doubles are never considered equal to integers. */ -QNum *qobject_to_qnum(const QObject *obj) +bool qnum_is_equal(const QObject *x, const QObject *y) { - if (!obj || qobject_type(obj) != QTYPE_QNUM) { - return NULL; + QNum *num_x = qobject_to(QNum, x); + QNum *num_y = qobject_to(QNum, y); + + switch (num_x->kind) { + case QNUM_I64: + switch (num_y->kind) { + case QNUM_I64: + /* Comparison in native int64_t type */ + return num_x->u.i64 == num_y->u.i64; + case QNUM_U64: + /* Implicit conversion of x to uin64_t, so we have to + * check its sign before */ + return num_x->u.i64 >= 0 && num_x->u.i64 == num_y->u.u64; + case QNUM_DOUBLE: + return false; + } + abort(); + case QNUM_U64: + switch (num_y->kind) { + case QNUM_I64: + return qnum_is_equal(y, x); + case QNUM_U64: + /* Comparison in native uint64_t type */ + return num_x->u.u64 == num_y->u.u64; + case QNUM_DOUBLE: + return false; + } + abort(); + case QNUM_DOUBLE: + switch (num_y->kind) { + case QNUM_I64: + case QNUM_U64: + return false; + case QNUM_DOUBLE: + /* Comparison in native double type */ + return num_x->u.dbl == num_y->u.dbl; + } + abort(); } - return container_of(obj, QNum, base); + + abort(); } /** @@ -219,5 +259,5 @@ QNum *qobject_to_qnum(const QObject *obj) void qnum_destroy_obj(QObject *obj) { assert(obj != NULL); - g_free(qobject_to_qnum(obj)); + g_free(qobject_to(QNum, obj)); }