Commit 2638725049 for qemu.org
commit 263872504918d034d73f455e0bd6716f512beac6
Author: Marc-André Lureau <marcandre.lureau@redhat.com>
Date: Sun Nov 1 21:17:16 2026 +0100
qom: use QAPITypeInfo in object_property_get_enum
The typename parameter becomes a QAPITypeInfo pointer, and the
validation compares prop->qapi_type against it instead of matching
prop->type strings.
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-ID: <20261101201717.3911097-56-armbru@redhat.com>
diff --git a/hw/core/machine-qmp-cmds.c b/hw/core/machine-qmp-cmds.c
index 07a048d0a9..0558d6d703 100644
--- a/hw/core/machine-qmp-cmds.c
+++ b/hw/core/machine-qmp-cmds.c
@@ -18,6 +18,7 @@
#include "qapi/qapi-commands-accelerator.h"
#include "qapi/qapi-commands-machine.h"
#include "qobject/qobject.h"
+#include "qapi/qapi-type-infos-common.h"
#include "qapi/qobject-input-visitor.h"
#include "qapi/type-helpers.h"
#include "qemu/uuid.h"
@@ -278,7 +279,8 @@ static int query_memdev(Object *obj, void *opaque)
} else {
m->has_reserve = true;
}
- m->policy = object_property_get_enum(obj, "policy", "HostMemPolicy",
+ m->policy = object_property_get_enum(obj, "policy",
+ &HostMemPolicy_type_info,
&error_abort);
host_nodes = object_property_get_qobject(obj,
"host-nodes",
diff --git a/include/qom/object.h b/include/qom/object.h
index 66197b406b..70d8ea3e29 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -1562,7 +1562,7 @@ uint64_t object_property_get_uint(Object *obj, const char *name,
* object_property_get_enum:
* @obj: the object
* @name: the name of the property
- * @typename: the name of the enum data type
+ * @type_info: the QAPITypeInfo of the enum
* @errp: returns an error if this function fails
*
* Returns: the value of the property, converted to an integer (which
@@ -1570,7 +1570,7 @@ uint64_t object_property_get_uint(Object *obj, const char *name,
* value is not an enum).
*/
int object_property_get_enum(Object *obj, const char *name,
- const char *typename, Error **errp);
+ const QAPITypeInfo *type_info, Error **errp);
/**
* object_property_set:
diff --git a/qom/object.c b/qom/object.c
index 10b3145f5f..cd0590c3fd 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -2575,32 +2575,30 @@ object_class_property_add_enum(ObjectClass *klass, const char *name,
}
int object_property_get_enum(Object *obj, const char *name,
- const char *typename, Error **errp)
+ const QAPITypeInfo *type_info, Error **errp)
{
char *str;
int ret;
ObjectProperty *prop = object_property_find_err(obj, name, errp);
- EnumProperty *enumprop;
if (prop == NULL) {
return -1;
}
- if (!g_str_equal(prop->type, typename)) {
+ if (prop->qapi_type != type_info) {
error_setg(errp, "Property %s on %s is not '%s' enum type",
- name, object_class_get_name(
- object_get_class(obj)), typename);
+ name, object_class_get_name(object_get_class(obj)),
+ type_info->name);
return -1;
}
- enumprop = prop->opaque;
-
str = object_property_get_str(obj, name, errp);
if (!str) {
return -1;
}
- ret = qapi_enum_parse(enumprop->qapi_type->lookup, str, -1, errp);
+ assert(prop->qapi_type);
+ ret = qapi_enum_parse(prop->qapi_type->lookup, str, -1, errp);
g_free(str);
return ret;
diff --git a/tests/unit/check-qom-proplist.c b/tests/unit/check-qom-proplist.c
index 381a868a80..bf7c1386be 100644
--- a/tests/unit/check-qom-proplist.c
+++ b/tests/unit/check-qom-proplist.c
@@ -580,14 +580,14 @@ static void test_dummy_getenum(void)
val = object_property_get_enum(OBJECT(dobj),
"av",
- "DummyAnimal",
+ &dummy_animal_qapi_type_info,
&error_abort);
g_assert(val == DUMMY_PLATYPUS);
/* A bad enum type name */
val = object_property_get_enum(OBJECT(dobj),
"av",
- "BadAnimal",
+ &dummy_str_qapi_type_info,
&err);
g_assert(val == -1);
error_free_or_abort(&err);
@@ -595,7 +595,7 @@ static void test_dummy_getenum(void)
/* A non-enum property name */
val = object_property_get_enum(OBJECT(dobj),
"iv",
- "DummyAnimal",
+ &dummy_animal_qapi_type_info,
&err);
g_assert(val == -1);
error_free_or_abort(&err);