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);
> +}

[...]


Reply via email to