Refactoring of object_property_add() before performance optimization of the array expansion code
Signed-off-by: Pavel Fedin <p.fe...@samsung.com> Reviewed-by: Peter Crosthwaite <peter.crosthwa...@xilinx.com> --- qom/object.c | 67 ++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 40 insertions(+), 27 deletions(-) diff --git a/qom/object.c b/qom/object.c index eea8edf..ba63777 100644 --- a/qom/object.c +++ b/qom/object.c @@ -830,35 +830,14 @@ void object_unref(Object *obj) } } -ObjectProperty * -object_property_add(Object *obj, const char *name, const char *type, - ObjectPropertyAccessor *get, - ObjectPropertyAccessor *set, - ObjectPropertyRelease *release, - void *opaque, Error **errp) +static ObjectProperty * +object_property_add_single(Object *obj, const char *name, const char *type, + ObjectPropertyAccessor *get, + ObjectPropertyAccessor *set, + ObjectPropertyRelease *release, + void *opaque, Error **errp) { ObjectProperty *prop; - size_t name_len = strlen(name); - - if (name_len >= 3 && !memcmp(name + name_len - 3, "[*]", 4)) { - int i; - ObjectProperty *ret; - char *name_no_array = g_strdup(name); - - name_no_array[name_len - 3] = '\0'; - for (i = 0; ; ++i) { - char *full_name = g_strdup_printf("%s[%d]", name_no_array, i); - - ret = object_property_add(obj, full_name, type, get, set, - release, opaque, NULL); - g_free(full_name); - if (ret) { - break; - } - } - g_free(name_no_array); - return ret; - } QTAILQ_FOREACH(prop, &obj->properties, node) { if (strcmp(prop->name, name) == 0) { @@ -883,6 +862,40 @@ object_property_add(Object *obj, const char *name, const char *type, return prop; } +ObjectProperty * +object_property_add(Object *obj, const char *name, const char *type, + ObjectPropertyAccessor *get, + ObjectPropertyAccessor *set, + ObjectPropertyRelease *release, + void *opaque, Error **errp) +{ + size_t name_len = strlen(name); + char *name_no_array; + ObjectProperty *ret; + int i; + + if (name_len < 3 || memcmp(&name[name_len - 3], "[*]", 4)) { + return object_property_add_single(obj, name, type, + get, set, release, opaque, errp); + } + + name_no_array = g_strdup(name); + + name_no_array[name_len - 3] = '\0'; + for (i = 0; ; ++i) { + char *full_name = g_strdup_printf("%s[%d]", name_no_array, i); + + ret = object_property_add(obj, full_name, type, get, set, + release, opaque, NULL); + g_free(full_name); + if (ret) { + break; + } + } + g_free(name_no_array); + return ret; +} + ObjectProperty *object_property_find(Object *obj, const char *name, Error **errp) { -- 1.9.5.msysgit.0