From: Marc-André Lureau <[email protected]> Add a qapi_type field to PropertyInfo to prepare for the transition from string-based type metadata to QAPI type-info.
Update qdev_property_add_static() and qdev_class_add_property() to pass qapi_type instead of NULL to object_property_add() and object_class_property_add(). Update the shared enum accessor functions to prefer .qapi_type->lookup over .enum_table via a new qdev_propinfo_enum_lookup() helper. No PropertyInfo definitions are changed, all .qapi_type fields default to NULL, so this patch is no-op for now. Signed-off-by: Marc-André Lureau <[email protected]> Signed-off-by: Markus Armbruster <[email protected]> Message-ID: <[email protected]> --- include/hw/core/qdev-properties.h | 1 + hw/core/qdev-properties.c | 26 +++++++++++++++++++------- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/include/hw/core/qdev-properties.h b/include/hw/core/qdev-properties.h index eba5436e53..1ea2ba66bb 100644 --- a/include/hw/core/qdev-properties.h +++ b/include/hw/core/qdev-properties.h @@ -34,6 +34,7 @@ struct PropertyInfo { const char *type; const char *description; const QEnumLookup *enum_table; + const QAPITypeInfo *qapi_type; bool realized_set_allowed; /* allow setting property on realized device */ char *(*print)(Object *obj, const Property *prop); void (*set_default_value)(ObjectProperty *op, const Property *prop); diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c index 61dca80c95..71580c04e4 100644 --- a/hw/core/qdev-properties.c +++ b/hw/core/qdev-properties.c @@ -99,13 +99,22 @@ static ObjectPropertyAccessor *field_prop_setter(const PropertyInfo *info) return info->set ? field_prop_set : NULL; } +static const QEnumLookup *qdev_propinfo_enum_lookup(const PropertyInfo *info) +{ + if (info->qapi_type) { + assert(info->qapi_type->lookup); + return info->qapi_type->lookup; + } + return info->enum_table; +} + void qdev_propinfo_get_enum(Object *obj, Visitor *v, const char *name, void *opaque, Error **errp) { const Property *prop = opaque; int *ptr = object_field_prop_ptr(obj, prop); - visit_type_enum(v, name, ptr, prop->info->enum_table, errp); + visit_type_enum(v, name, ptr, qdev_propinfo_enum_lookup(prop->info), errp); } void qdev_propinfo_set_enum(Object *obj, Visitor *v, const char *name, @@ -114,14 +123,15 @@ void qdev_propinfo_set_enum(Object *obj, Visitor *v, const char *name, const Property *prop = opaque; int *ptr = object_field_prop_ptr(obj, prop); - visit_type_enum(v, name, ptr, prop->info->enum_table, errp); + visit_type_enum(v, name, ptr, qdev_propinfo_enum_lookup(prop->info), errp); } void qdev_propinfo_set_default_value_enum(ObjectProperty *op, const Property *prop) { object_property_set_default_str(op, - qapi_enum_lookup(prop->info->enum_table, prop->defval.i)); + qapi_enum_lookup(qdev_propinfo_enum_lookup(prop->info), + prop->defval.i)); } /* Bit */ @@ -941,8 +951,8 @@ void qdev_prop_set_enum(DeviceState *dev, const char *name, int value) prop = qdev_prop_find(dev, name); object_property_set_str(OBJECT(dev), name, - qapi_enum_lookup(prop->info->enum_table, value), - &error_abort); + qapi_enum_lookup(qdev_propinfo_enum_lookup(prop->info), value), + &error_abort); } void qdev_prop_set_array(DeviceState *dev, const char *name, QList *values) @@ -1150,7 +1160,8 @@ void qdev_property_add_static(DeviceState *dev, const Property *prop) assert(!prop->info->create); - op = object_property_add(obj, prop->name, prop->info->type, NULL, + op = object_property_add(obj, prop->name, prop->info->type, + prop->info->qapi_type, field_prop_getter(prop->info), field_prop_setter(prop->info), prop->info->release, @@ -1176,7 +1187,8 @@ static void qdev_class_add_property(DeviceClass *klass, const char *name, if (prop->info->create) { op = prop->info->create(oc, name, prop); } else { - op = object_class_property_add(oc, name, prop->info->type, NULL, + op = object_class_property_add(oc, name, prop->info->type, + prop->info->qapi_type, field_prop_getter(prop->info), field_prop_setter(prop->info), prop->info->release, -- 2.55.0
