qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [RFC PATCH v1 2/8] qom: Add property overloading


From: Peter Crosthwaite
Subject: [Qemu-devel] [RFC PATCH v1 2/8] qom: Add property overloading
Date: Sun, 14 Jun 2015 15:36:48 -0700

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 <address@hidden>
---
 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

[Prev in Thread] Current Thread [Next in Thread]