On 07/07/2026 13:17, Daniel P. Berrangé wrote:

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)

That could work.

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

Yes, I think that would be possible. I shall give it a test and report back.

+}
+
+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..

That is something else that is possible: I've purposely avoided doing this since it's not a pattern already in use within object.c. Do you think this is worth doing as a separate exercise first?

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


ATB,

Mark.


Reply via email to