On Fri, Jul 03, 2026 at 02:53:04PM +0100, Mark Cave-Ayland wrote:
> This adds a class property that references a uint8_t within the object 
> instance
> and is intended to be a replacement for object_property_add_uint8_ptr().
> 
> Signed-off-by: Mark Cave-Ayland <[email protected]>
> ---
>  include/qom/object.h |  5 +++++
>  qom/object.c         | 52 ++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 57 insertions(+)
> 
> diff --git a/include/qom/object.h b/include/qom/object.h
> index 89c23d45ab..a55f9d0e97 100644
> --- a/include/qom/object.h
> +++ b/include/qom/object.h
> @@ -1956,6 +1956,11 @@ ObjectProperty *object_property_add_uint8_ptr(Object 
> *obj, const char *name,
>                                                const uint8_t *v,
>                                                ObjectPropertyFlags flags);
>  
> +ObjectProperty *object_class_property_add_uint8_ptr(ObjectClass *klass,
> +                                                    const char *name,
> +                                                    ptrdiff_t v,
> +                                                    ObjectPropertyFlags 
> flags);
> +
>  ObjectProperty *object_class_static_property_add_uint8_ptr(ObjectClass 
> *klass,
>                                           const char *name,
>                                           const uint8_t *v,
> diff --git a/qom/object.c b/qom/object.c
> index d10bf848c0..263c313cd2 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -2741,6 +2741,38 @@ static void property_set_uint64_ptr(Object *obj, 
> Visitor *v, const char *name,
>      *field = value;
>  }
>  
> +static void *object_class_prop_ptr(Object *obj, ptrdiff_t offset)
> +{
> +    void *ptr = obj;
> +    ptr += offset;
> +
> +    return ptr;
> +}

Perhaps just

 #define FIELD(obj, offset) ((void *)obj+(ptrdiff_t)offset)

> +
> +static void property_class_get_uint8_ptr(Object *obj, Visitor *v,
> +                                         const char *name,
> +                                         void *opaque, Error **errp)
> +{
> +    uint8_t value = *(uint8_t *)object_class_prop_ptr(obj,
> +                                                      (ptrdiff_t)opaque);

Do we need this intermediate instead of now

> +    visit_type_uint8(v, name, &value, errp);

  visit_type_uint8(v, name, FIELD(obj, opaque), errp);


> +}
> +
> +static void property_class_set_uint8_ptr(Object *obj, Visitor *v,
> +                                         const char *name,
> +                                         void *opaque, Error **errp)
> +{
> +    uint8_t *field = (uint8_t *)object_class_prop_ptr(obj,
> +                                                      (ptrdiff_t)opaque);
> +    uint8_t value;
> +
> +    if (!visit_type_uint8(v, name, &value, errp)) {
> +        return;
> +    }
> +
> +    *field = value;

Instead of all this is it sufficient to do:

   visit_type_uint8(v, name, FIELD(obj, opaque), errp);


Also, since we'll be using this pattern for int8, int16, int32,
and many more, perhaps we could define a macro that can expand
to the getter/setter impl for any scalar type. so we can do

  DEFINE_SCALAR_PROP_CALLBACKS(uint8);
  DEFINE_SCALAR_PROP_CALLBACKS(uint16);
  DEFINE_SCALAR_PROP_CALLBACKS(uint32);
  DEFINE_SCALAR_PROP_CALLBACKS(uint64);
  DEFINE_SCALAR_PROP_CALLBACKS(bool);
  ..etc..

> +}
> +
>  ObjectProperty *
>  object_property_add_uint8_ptr(Object *obj, const char *name,
>                                const uint8_t *v,

With regards,
Daniel
-- 
|: https://berrange.com       ~~        https://hachyderm.io/@berrange :|
|: https://libvirt.org          ~~          https://entangle-photo.org :|
|: https://pixelfed.art/berrange   ~~    https://fstop138.berrange.com :|


Reply via email to