diff --git a/qobject/qlit.c b/qobject/qlit.c index dc0015f76c..3c4882c784 100644 --- a/qobject/qlit.c +++ b/qobject/qlit.c @@ -18,29 +18,6 @@ #include "qapi/qmp/qlit.h" #include "qapi/qmp/types.h" -typedef struct QListCompareHelper { - int index; - QLitObject *objs; - bool result; -} QListCompareHelper; - -static void compare_helper(QObject *obj, void *opaque) -{ - QListCompareHelper *helper = opaque; - - if (!helper->result) { - return; - } - - if (helper->objs[helper->index].type == QTYPE_NONE) { - helper->result = false; - return; - } - - helper->result = - qlit_equal_qobject(&helper->objs[helper->index++], obj); -} - static bool qlit_equal_qdict(const QLitObject *lhs, const QDict *qdict) { int i; @@ -62,6 +39,23 @@ static bool qlit_equal_qdict(const QLitObject *lhs, const QDict *qdict) return true; } +static bool qlit_equal_qlist(const QLitObject *lhs, const QList *qlist) +{ + QListEntry *e; + int i = 0; + + QLIST_FOREACH_ENTRY(qlist, e) { + QObject *obj = qlist_entry_obj(e); + + if (!qlit_equal_qobject(&lhs->value.qlist[i], obj)) { + return false; + } + i++; + } + + return !e && lhs->value.qlist[i].type == QTYPE_NONE; +} + bool qlit_equal_qobject(const QLitObject *lhs, const QObject *rhs) { if (!rhs || lhs->type != qobject_type(rhs)) { @@ -78,17 +72,8 @@ bool qlit_equal_qobject(const QLitObject *lhs, const QObject *rhs) qstring_get_str(qobject_to_qstring(rhs))) == 0); case QTYPE_QDICT: return qlit_equal_qdict(lhs, qobject_to_qdict(rhs)); - case QTYPE_QLIST: { - QListCompareHelper helper; - - helper.index = 0; - helper.objs = lhs->value.qlist; - helper.result = true; - - qlist_iter(qobject_to_qlist(rhs), compare_helper, &helper); - - return helper.result; - } + case QTYPE_QLIST: + return qlit_equal_qlist(lhs, qobject_to_qlist(rhs)); case QTYPE_QNULL: return true; default: diff --git a/tests/check-qlit.c b/tests/check-qlit.c index d2ecc200d3..c59ec1ab88 100644 --- a/tests/check-qlit.c +++ b/tests/check-qlit.c @@ -58,6 +58,9 @@ static void qlit_equal_qobject_test(void) g_assert(!qlit_equal_qobject(&qlit_foo, qobj)); + qdict_put(qobject_to_qdict(qobj), "bee", qlist_new()); + g_assert(!qlit_equal_qobject(&qlit, qobj)); + qobject_decref(qobj); }