Marc-André Lureau <[email protected]> writes:
> Add element_info and element_size fields to PropertyInfo, and extend
> qdev_prop_qapi_type() to derive QAPI types for array properties via
> element_info->qapi_type->list.
>
> Add typed list PropertyInfo definitions that replace the generic
> qdev_prop_array. Each typed list PropertyInfo knows its element type
> at compile time through the element_info and element_size fields,
> which allows the QAPI type to be derived automatically.
>
> Infrastructure changes:
> - Add prop_array_info() and prop_array_elem_size() helpers that
> prefer the new element_info/element_size fields with fallback to
> the old arrayinfo/arrayfieldsize fields for compatibility
> - Make get_prop_array, set_prop_array, release_prop_array, and
> default_prop_array non-static so they can be used by
> DEFINE_PROP_ARRAY_INFO in other translation units
> - Add DEFINE_PROP_ARRAY_INFO macro in qdev-prop-internal.h
>
> The array of links needs special care for its "full type name" to follow
> the "link<TYPE>List" pattern used by link properties ("link<TYPE>").
>
> The old qdev_prop_array and DEFINE_PROP_ARRAY macro are preserved
> for compatibility; they will be replaced in the next patch.
>
> Signed-off-by: Marc-André Lureau <[email protected]>
> ---
> hw/core/qdev-prop-internal.h | 18 ++++++
> hw/core/qdev-properties-system.c | 5 ++
> hw/core/qdev-properties.c | 103
> ++++++++++++++++++++++++-------
> include/hw/core/qdev-properties-system.h | 2 +
> include/hw/core/qdev-properties.h | 8 +++
> 5 files changed, 115 insertions(+), 21 deletions(-)
>
> diff --git a/hw/core/qdev-prop-internal.h b/hw/core/qdev-prop-internal.h
> index c190b7b88cf4..b9d9812346d1 100644
> --- a/hw/core/qdev-prop-internal.h
> +++ b/hw/core/qdev-prop-internal.h
> @@ -27,4 +27,22 @@ void qdev_propinfo_get_int32(Object *obj, Visitor *v,
> const char *name,
> void qdev_propinfo_get_size32(Object *obj, Visitor *v, const char *name,
> void *opaque, Error **errp);
>
> +void get_prop_array(Object *obj, Visitor *v, const char *name,
> + void *opaque, Error **errp);
> +void set_prop_array(Object *obj, Visitor *v, const char *name,
> + void *opaque, Error **errp);
> +void release_prop_array(Object *obj, const char *name, void *opaque);
> +void default_prop_array(ObjectProperty *op, const Property *prop);
> +
> +/* .qapi_type is derived from element_info->qapi_type->list by
> qdev_prop_qapi_type() */
scripts/checkpatch.pl warns
WARNING: line over 80 characters
Perhaps
/*
* Note: .qapi_type is derived from element_info->qapi_type->list by
* qdev_prop_qapi_type()
*/
> +#define DEFINE_PROP_ARRAY_INFO(_elem_prop_info, _elem_type) \
> + { \
> + .element_info = &(_elem_prop_info), \
> + .element_size = sizeof(_elem_type), \
> + .get = get_prop_array, \
> + .set = set_prop_array, \
> + .release = release_prop_array, \
> + .set_default_value = default_prop_array, \
> + }
> +
> #endif
[...]
> diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
> index c2980c36afa2..a9ca8e4a03db 100644
> --- a/hw/core/qdev-properties.c
> +++ b/hw/core/qdev-properties.c
[...]
> @@ -860,6 +882,38 @@ const PropertyInfo qdev_prop_array = {
> .set_default_value = default_prop_array,
> };
>
> +const PropertyInfo qdev_prop_uint8_list =
> + DEFINE_PROP_ARRAY_INFO(qdev_prop_uint8, uint8_t);
> +const PropertyInfo qdev_prop_uint16_list =
> + DEFINE_PROP_ARRAY_INFO(qdev_prop_uint16, uint16_t);
> +const PropertyInfo qdev_prop_uint32_list =
> + DEFINE_PROP_ARRAY_INFO(qdev_prop_uint32, uint32_t);
> +const PropertyInfo qdev_prop_uint64_list =
> + DEFINE_PROP_ARRAY_INFO(qdev_prop_uint64, uint64_t);
> +const PropertyInfo qdev_prop_string_list =
> + DEFINE_PROP_ARRAY_INFO(qdev_prop_string, char *);
> +
> +static ObjectProperty *create_link_list_property(ObjectClass *oc,
> + const char *name,
> + const Property *prop)
> +{
> + g_autofree char *full_type = g_strdup_printf("link<%s>List",
> prop->link_type);
scripts/checkpatch.pl warns
WARNING: line over 80 characters
Easy enough to avoid.
> +
> + return object_class_property_add(oc, name, full_type,
> + get_prop_array, set_prop_array,
> + release_prop_array, (Property *)prop);
> +}
[...]