diff mbox

[RFC,v1,2/8] qom: Add property overloading

Message ID a13ff238861c32ccd8fa07a8e642fb9ae611db55.1434320585.git.peter.crosthwaite@xilinx.com
State New
Headers show

Commit Message

Peter Crosthwaite June 14, 2015, 10:36 p.m. UTC
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.crosthwaite@xilinx.com>
---
 include/qom/object.h |  2 ++
 qom/object.c         | 20 ++++++++++++--------
 2 files changed, 14 insertions(+), 8 deletions(-)
diff mbox

Patch

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