@@ -343,6 +343,8 @@ typedef struct ObjectProperty
ObjectPropertyAccessor *set;
ObjectPropertyResolve *resolve;
ObjectPropertyRelease *release;
+ bool allows_overloading;
+ bool overloaded;
void *opaque;
QTAILQ_ENTRY(ObjectProperty) node;
@@ -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;
}
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(-)