summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarkus Armbruster <armbru@redhat.com>2017-06-26 13:52:24 +0200
committerMarkus Armbruster <armbru@redhat.com>2017-07-24 13:35:11 +0200
commit006ca09f3027d86346fce707e9295975c6558f42 (patch)
tree1c06825264666d09ea76e3e4e2673fc089027b65
parentdf95f1a298a3e16c80293343143dcedbe7978f6c (diff)
qapi: Separate type QNull from QObject
Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Daniel P. Berrange <berrange@redhat.com>
-rw-r--r--include/qapi/qmp/qobject.h10
-rw-r--r--qapi/qobject-output-visitor.c2
-rw-r--r--qobject/json-parser.c2
-rw-r--r--qobject/qnull.c8
-rw-r--r--target/i386/cpu.c4
-rw-r--r--tests/check-qjson.c6
-rw-r--r--tests/check-qnull.c18
7 files changed, 28 insertions, 22 deletions
diff --git a/include/qapi/qmp/qobject.h b/include/qapi/qmp/qobject.h
index b8ddbca405..3543b552f4 100644
--- a/include/qapi/qmp/qobject.h
+++ b/include/qapi/qmp/qobject.h
@@ -93,11 +93,15 @@ static inline QType qobject_type(const QObject *obj)
return obj->type;
}
-extern QObject qnull_;
+typedef struct QNull {
+ QObject base;
+} QNull;
-static inline QObject *qnull(void)
+extern QNull qnull_;
+
+static inline QNull *qnull(void)
{
- qobject_incref(&qnull_);
+ QINCREF(&qnull_);
return &qnull_;
}
diff --git a/qapi/qobject-output-visitor.c b/qapi/qobject-output-visitor.c
index 70be84ccb5..398dcb5cee 100644
--- a/qapi/qobject-output-visitor.c
+++ b/qapi/qobject-output-visitor.c
@@ -190,7 +190,7 @@ static void qobject_output_type_any(Visitor *v, const char *name,
static void qobject_output_type_null(Visitor *v, const char *name, Error **errp)
{
QObjectOutputVisitor *qov = to_qov(v);
- qobject_output_add_obj(qov, name, qnull());
+ qobject_output_add(qov, name, qnull());
}
/* Finish building, and return the root object.
diff --git a/qobject/json-parser.c b/qobject/json-parser.c
index 7a417f20cd..724ca240e4 100644
--- a/qobject/json-parser.c
+++ b/qobject/json-parser.c
@@ -445,7 +445,7 @@ static QObject *parse_keyword(JSONParserContext *ctxt)
} else if (!strcmp(token->str, "false")) {
return QOBJECT(qbool_from_bool(false));
} else if (!strcmp(token->str, "null")) {
- return qnull();
+ return QOBJECT(qnull());
}
parse_error(ctxt, token, "invalid keyword '%s'", token->str);
return NULL;
diff --git a/qobject/qnull.c b/qobject/qnull.c
index c124d0585e..69a21d1059 100644
--- a/qobject/qnull.c
+++ b/qobject/qnull.c
@@ -14,7 +14,9 @@
#include "qemu-common.h"
#include "qapi/qmp/qobject.h"
-QObject qnull_ = {
- .type = QTYPE_QNULL,
- .refcnt = 1,
+QNull qnull_ = {
+ .base = {
+ .type = QTYPE_QNULL,
+ .refcnt = 1,
+ },
};
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index 0bbda76323..89f5fb7a3f 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -2442,7 +2442,7 @@ static QDict *x86_cpu_static_props(void)
d = qdict_new();
for (i = 0; props[i]; i++) {
- qdict_put_obj(d, props[i], qnull());
+ qdict_put(d, props[i], qnull());
}
for (w = 0; w < FEATURE_WORDS; w++) {
@@ -2452,7 +2452,7 @@ static QDict *x86_cpu_static_props(void)
if (!fi->feat_names[bit]) {
continue;
}
- qdict_put_obj(d, fi->feat_names[bit], qnull());
+ qdict_put(d, fi->feat_names[bit], qnull());
}
}
diff --git a/tests/check-qjson.c b/tests/check-qjson.c
index 53f2275b9b..a3a97b0d99 100644
--- a/tests/check-qjson.c
+++ b/tests/check-qjson.c
@@ -1012,7 +1012,7 @@ static void keyword_literal(void)
{
QObject *obj;
QBool *qbool;
- QObject *null;
+ QNull *null;
QString *str;
obj = qobject_from_json("true", &error_abort);
@@ -1053,10 +1053,10 @@ static void keyword_literal(void)
g_assert(qobject_type(obj) == QTYPE_QNULL);
null = qnull();
- g_assert(null == obj);
+ g_assert(QOBJECT(null) == obj);
qobject_decref(obj);
- qobject_decref(null);
+ QDECREF(null);
}
typedef struct LiteralQDictEntry LiteralQDictEntry;
diff --git a/tests/check-qnull.c b/tests/check-qnull.c
index 8dd1c9686f..1ab7c983a5 100644
--- a/tests/check-qnull.c
+++ b/tests/check-qnull.c
@@ -24,14 +24,14 @@ static void qnull_ref_test(void)
{
QObject *obj;
- g_assert(qnull_.refcnt == 1);
- obj = qnull();
+ g_assert(qnull_.base.refcnt == 1);
+ obj = QOBJECT(qnull());
g_assert(obj);
- g_assert(obj == &qnull_);
- g_assert(qnull_.refcnt == 2);
+ g_assert(obj == QOBJECT(&qnull_));
+ g_assert(qnull_.base.refcnt == 2);
g_assert(qobject_type(obj) == QTYPE_QNULL);
qobject_decref(obj);
- g_assert(qnull_.refcnt == 1);
+ g_assert(qnull_.base.refcnt == 1);
}
static void qnull_visit_test(void)
@@ -45,8 +45,8 @@ static void qnull_visit_test(void)
* depend on layering violations to check qnull_ refcnt.
*/
- g_assert(qnull_.refcnt == 1);
- obj = qnull();
+ g_assert(qnull_.base.refcnt == 1);
+ obj = QOBJECT(qnull());
v = qobject_input_visitor_new(obj);
qobject_decref(obj);
visit_type_null(v, NULL, &error_abort);
@@ -55,11 +55,11 @@ static void qnull_visit_test(void)
v = qobject_output_visitor_new(&obj);
visit_type_null(v, NULL, &error_abort);
visit_complete(v, &obj);
- g_assert(obj == &qnull_);
+ g_assert(obj == QOBJECT(&qnull_));
qobject_decref(obj);
visit_free(v);
- g_assert(qnull_.refcnt == 1);
+ g_assert(qnull_.base.refcnt == 1);
}
int main(int argc, char **argv)