Add a mechanism to allow property name overloading. The property being
overloaded must explicitly allow it and the property types must match,
otherwise an error is returned as normal.

Once the property has been overloaded, set a flag indicating as such,
so operations that don't make sense for overloaded properties can raise
an error at their time of invocation.

Signed-off-by: Peter Crosthwaite <peter.crosthwa...@xilinx.com>
---
 include/qom/object.h |  2 ++
 qom/object.c         | 20 ++++++++++++--------
 2 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/include/qom/object.h b/include/qom/object.h
index 0505f20..9fae8a4 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -343,6 +343,8 @@ typedef struct ObjectProperty
     ObjectPropertyAccessor *set;
     ObjectPropertyResolve *resolve;
     ObjectPropertyRelease *release;
+    bool allows_overloading;
+    bool overloaded;
     void *opaque;
 
     QTAILQ_ENTRY(ObjectProperty) node;
diff --git a/qom/object.c b/qom/object.c
index 2a65ab5..79172f7 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -728,7 +728,7 @@ object_property_add(Object *obj, const char *name, const 
char *type,
                     ObjectPropertyRelease *release,
                     void *opaque, Error **errp)
 {
-    ObjectProperty *prop;
+    ObjectProperty *first, *prop;
     size_t name_len = strlen(name);
 
     if (name_len >= 3 && !memcmp(name + name_len - 3, "[*]", 4)) {
@@ -754,13 +754,12 @@ object_property_add(Object *obj, const char *name, const 
char *type,
         return ret;
     }
 
-    QTAILQ_FOREACH(prop, &obj->properties, node) {
-        if (strcmp(prop->name, name) == 0) {
-            error_setg(errp, "attempt to add duplicate property '%s'"
-                       " to object (type '%s')", name,
-                       object_get_typename(obj));
-            return NULL;
-        }
+    first = object_property_find(obj, name, NULL);
+
+    if (first && (!first->allows_overloading || strcmp(type, first->type))) {
+        error_setg(errp, "attempt to add duplicate property '%s'"
+                   " to object (type '%s')", name, object_get_typename(obj));
+        return NULL;
     }
 
     prop = g_malloc0(sizeof(*prop));
@@ -773,6 +772,11 @@ object_property_add(Object *obj, const char *name, const 
char *type,
     prop->release = release;
     prop->opaque = opaque;
 
+    if (first) {
+        first->overloaded = true;
+        prop->overloaded = true;
+    }
+
     QTAILQ_INSERT_TAIL(&obj->properties, prop, node);
     return prop;
 }
-- 
2.4.3.3.g905f831


Reply via email to