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