diff --git a/src/lib/edje/edje_object.eo b/src/lib/edje/edje_object.eo index c294d43f66..be6d2e2a00 100644 --- a/src/lib/edje/edje_object.eo +++ b/src/lib/edje/edje_object.eo @@ -1176,7 +1176,7 @@ class Edje.Object (Efl.Canvas.Group.Clipped, Efl.File, Efl.Container, Efl.Part, Efl.Gfx.size { set; } Efl.Object.constructor; Efl.Object.destructor; - Efl.Object.debug_name_override { get; } + Efl.Object.debug_name_override; Efl.Canvas.Object.no_render { set; } Efl.Canvas.Object.paragraph_direction { set; } Efl.Canvas.Group.group_calculate; diff --git a/src/lib/edje/edje_smart.c b/src/lib/edje/edje_smart.c index 4f105ff595..070efff883 100644 --- a/src/lib/edje/edje_smart.c +++ b/src/lib/edje/edje_smart.c @@ -60,15 +60,14 @@ _edje_object_efl_object_destructor(Eo *obj, Edje *class_data) efl_data_unref(obj, class_data->base); } -EOLIAN static const char * -_edje_object_efl_object_debug_name_override_get(Eo *obj, Edje *ed) +EOLIAN static Eina_Strbuf * +_edje_object_efl_object_debug_name_override(Eo *obj, Edje *ed, Eina_Strbuf *sb) { - const char *base; - - base = efl_debug_name_get(efl_super(obj, MY_CLASS)); - return eina_slstr_printf("%s:file='%s':group='%s'", base, - ed->file ? eina_file_filename_get(ed->file->f) : NULL, - ed->group); + sb = efl_debug_name_override(efl_super(obj, MY_CLASS), sb); + eina_strbuf_append_printf(sb, ":file='%s':group='%s'", + ed->file ? eina_file_filename_get(ed->file->f) : NULL, + ed->group); + return sb; } EOLIAN static void diff --git a/src/lib/elementary/efl_ui_win.c b/src/lib/elementary/efl_ui_win.c index 7456cb87d4..e9ecc3c145 100644 --- a/src/lib/elementary/efl_ui_win.c +++ b/src/lib/elementary/efl_ui_win.c @@ -6608,13 +6608,12 @@ _efl_ui_win_class_constructor(Efl_Class *klass) } } -EOLIAN static const char * -_efl_ui_win_efl_object_debug_name_override_get(Eo *obj, Efl_Ui_Win_Data *pd) +EOLIAN static Eina_Strbuf * +_efl_ui_win_efl_object_debug_name_override(Eo *obj, Efl_Ui_Win_Data *pd, Eina_Strbuf *sb) { - const char *base; - - base = efl_debug_name_get(efl_super(obj, MY_CLASS)); - return eina_slstr_printf("%s:'%s':'%s'", base, pd->name, pd->title); + sb = efl_debug_name_override(efl_super(obj, MY_CLASS), sb); + eina_strbuf_append_printf(sb, ":'%s':'%s'", pd->name, pd->title); + return sb; } EOLIAN static Eo* diff --git a/src/lib/elementary/efl_ui_win.eo b/src/lib/elementary/efl_ui_win.eo index 21b8d86c5a..91863a848d 100644 --- a/src/lib/elementary/efl_ui_win.eo +++ b/src/lib/elementary/efl_ui_win.eo @@ -930,7 +930,7 @@ class Efl.Ui.Win (Elm.Widget, Efl.Canvas, Elm.Interface.Atspi.Window, Efl.Object.constructor; Efl.Object.destructor; Efl.Object.finalize; - Efl.Object.debug_name_override { get; } + Efl.Object.debug_name_override; Efl.Gfx.visible { set; } Efl.Gfx.position { set; } Efl.Gfx.size { set; } diff --git a/src/lib/elementary/elm_widget.c b/src/lib/elementary/elm_widget.c index 7e5380de9c..0c84c5792d 100644 --- a/src/lib/elementary/elm_widget.c +++ b/src/lib/elementary/elm_widget.c @@ -6234,14 +6234,15 @@ _elm_widget_efl_object_destructor(Eo *obj, Elm_Widget_Smart_Data *sd) sd->on_destroy = EINA_FALSE; } -EOLIAN static const char * -_elm_widget_efl_object_debug_name_override_get(Eo *obj, Elm_Widget_Smart_Data *sd EINA_UNUSED) +EOLIAN static Eina_Strbuf * +_elm_widget_efl_object_debug_name_override(Eo *obj, Elm_Widget_Smart_Data *sd EINA_UNUSED, Eina_Strbuf *sb) { - const char *base, *focus = ""; + const char *focus = ""; if (elm_obj_widget_focus_get(obj)) focus = ":focused"; - base = efl_debug_name_get(efl_super(obj, MY_CLASS)); - return eina_slstr_printf("%s%s", base, focus); + sb = efl_debug_name_override(efl_super(obj, MY_CLASS), sb); + eina_strbuf_append_printf(sb, "%s", focus); + return sb; } EOLIAN static Eina_Bool diff --git a/src/lib/elementary/elm_widget.eo b/src/lib/elementary/elm_widget.eo index 9dfda78bc5..78b77cf605 100644 --- a/src/lib/elementary/elm_widget.eo +++ b/src/lib/elementary/elm_widget.eo @@ -787,7 +787,7 @@ abstract Elm.Widget (Efl.Canvas.Group, Elm.Interface.Atspi_Accessible, Efl.Object.finalize; Efl.Object.destructor; Efl.Object.provider_find; - Efl.Object.debug_name_override { get; } + Efl.Object.debug_name_override; Efl.Gfx.color { set; } Efl.Gfx.visible { set; } Efl.Gfx.position { set; } diff --git a/src/lib/eo/efl_object.eo b/src/lib/eo/efl_object.eo index 31861a61c9..f31606f293 100644 --- a/src/lib/eo/efl_object.eo +++ b/src/lib/eo/efl_object.eo @@ -81,15 +81,26 @@ abstract Efl.Object () comment: string @nullable; [[The comment]] } } - @property debug_name_override { - [[ A read-only name for this object used for debugging. + debug_name_override { + [[ Build a read-only name for this object used for debugging. + + Multiple calls using efl_super() can be chained in order to build + the entire debug name, from parent to child classes. In C the usual + way to build the string is as follows: + + sb = efl_debug_name_override(efl_super(obj, MY_CLASS), sb); + eina_strbuf_append_printf(sb, "new_information"); + return sb; + + The receiving function should always either free the strbuf or + returning it back to the caller, as ownership is transferred. @since 1.21 ]] - get {} - values { - name: string; [[A name including class name and object name.]] + params { + @in sb: own(ptr(Eina.Strbuf)); [[A string buffer, must not be $null.]] } + return: own(ptr(Eina.Strbuf)); [[Should not be $null, may be $sb.]] } @property event_global_freeze_count @class { get { diff --git a/src/lib/eo/eina_types.eot b/src/lib/eo/eina_types.eot index dce0e65884..40fbbf2df8 100644 --- a/src/lib/eo/eina_types.eot +++ b/src/lib/eo/eina_types.eot @@ -47,6 +47,7 @@ enum @extern Eina.Xattr.Flags { type @extern Eina.Error: int; [[Eina error type]] struct @extern @free(eina_binbuf_free) Eina.Binbuf; [[Eina binbuf data structure]] +struct @extern @free(eina_strbuf_free) Eina.Strbuf; [[Eina strbuf data structure]] struct @extern Eina.Slice { [[A linear, read-only, memory segment]] diff --git a/src/lib/eo/eo.c b/src/lib/eo/eo.c index 72db1dd0a9..a567a00d44 100644 --- a/src/lib/eo/eo.c +++ b/src/lib/eo/eo.c @@ -2480,7 +2480,8 @@ EAPI const char * efl_debug_name_get(const Eo *obj_id) { const char *override = ""; - const char *name, *clsname, *ret; + const char *name, *clsname; + Eina_Strbuf *sb; if (!obj_id) return "(null)"; @@ -2507,34 +2508,32 @@ efl_debug_name_get(const Eo *obj_id) EO_OBJ_POINTER(obj_id, obj); if (!obj) return eina_slstr_printf("Invalid_Object_ID@%p", obj_id); - if (!obj->cur_klass) - { - ret = efl_debug_name_override_get(obj_id); - if (ret) goto end; - } - else - { - if (obj->super) - ret = efl_debug_name_override_get(efl_super(obj_id, (Efl_Class *) obj->cur_klass->header.id)); - else - ret = efl_debug_name_override_get(efl_cast(obj_id, (Efl_Class *) obj->cur_klass->header.id)); - obj->super = EINA_FALSE; - obj->cur_klass = NULL; - if (ret) goto end; - } - + sb = eina_strbuf_new(); name = efl_name_get(obj_id); clsname = obj->klass->desc->name; if (_obj_is_override(obj)) override = "(override)"; if (name) - ret = eina_slstr_printf("%s%s@%p[%d]:'%s'", clsname, override, obj_id, (int) obj->refcount, name); + eina_strbuf_append_printf(sb, "%s%s@%p[%d]:'%s'", clsname, override, obj_id, (int) obj->refcount, name); else - ret = eina_slstr_printf("%s%s@%p[%d]", clsname, override, obj_id, (int) obj->refcount); + eina_strbuf_append_printf(sb, "%s%s@%p[%d]", clsname, override, obj_id, (int) obj->refcount); + + if (!obj->cur_klass) + { + sb = efl_debug_name_override((Eo *) obj_id, sb); + } + else + { + if (obj->super) + sb = efl_debug_name_override(efl_super(obj_id, (Efl_Class *) obj->cur_klass->header.id), sb); + else + sb = efl_debug_name_override(efl_cast(obj_id, (Efl_Class *) obj->cur_klass->header.id), sb); + obj->super = EINA_FALSE; + obj->cur_klass = NULL; + } -end: EO_OBJ_DONE(obj_id); - return ret; + return eina_slstr_strbuf_new(sb); } EAPI int diff --git a/src/lib/eo/eo_base_class.c b/src/lib/eo/eo_base_class.c index ceea2261bb..5b3801abb2 100644 --- a/src/lib/eo/eo_base_class.c +++ b/src/lib/eo/eo_base_class.c @@ -572,10 +572,10 @@ _efl_object_comment_get(Eo *obj EINA_UNUSED, Efl_Object_Data *pd) return pd->ext->comment; } -EOLIAN static const char * -_efl_object_debug_name_override_get(Eo *obj_id EINA_UNUSED, Efl_Object_Data *pd EINA_UNUSED) +EOLIAN static Eina_Strbuf * +_efl_object_debug_name_override(Eo *obj_id EINA_UNUSED, Efl_Object_Data *pd EINA_UNUSED, Eina_Strbuf *sb) { - return NULL; + return sb; } EOLIAN static void diff --git a/src/lib/evas/canvas/efl_canvas_group.eo b/src/lib/evas/canvas/efl_canvas_group.eo index 3235dadd97..cad0ff5bc3 100644 --- a/src/lib/evas/canvas/efl_canvas_group.eo +++ b/src/lib/evas/canvas/efl_canvas_group.eo @@ -102,7 +102,7 @@ class Efl.Canvas.Group (Efl.Canvas.Object) class.destructor; Efl.Object.constructor; Efl.Object.destructor; - Efl.Object.debug_name_override { get; } + Efl.Object.debug_name_override; Efl.Canvas.Object.no_render { set; } Efl.Canvas.Object.paragraph_direction { get; set; } } diff --git a/src/lib/evas/canvas/efl_canvas_object.eo b/src/lib/evas/canvas/efl_canvas_object.eo index bf06f31f8c..cf92e6f2c7 100644 --- a/src/lib/evas/canvas/efl_canvas_object.eo +++ b/src/lib/evas/canvas/efl_canvas_object.eo @@ -662,7 +662,7 @@ abstract Efl.Canvas.Object (Efl.Object, Efl.Gfx, Efl.Gfx.Stack, Efl.Animator, Efl.Object.destructor; Efl.Object.finalize; Efl.Object.provider_find; - Efl.Object.debug_name_override { get; } + Efl.Object.debug_name_override; Efl.Gfx.visible { get; set; } Efl.Gfx.color { get; set; } Efl.Gfx.color_part { get; set; } diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c index 000f52e08b..114e12fdd5 100644 --- a/src/lib/evas/canvas/evas_main.c +++ b/src/lib/evas/canvas/evas_main.c @@ -330,8 +330,8 @@ _evas_canvas_efl_object_destructor(Eo *eo_e, Evas_Public_Data *e) EINA_LIST_FREE(unrefs, eo_obj) { - ERR("Killing Zombie Object [%s@%p]. Refs: %i:%i", - efl_class_name_get(eo_obj), eo_obj, efl_ref_get(eo_obj), ___efl_ref2_get(eo_obj)); + ERR("Killing Zombie Object [%s]. Refs: %i:%i", + efl_debug_name_get(eo_obj), efl_ref_get(eo_obj), ___efl_ref2_get(eo_obj)); ___efl_ref2_reset(eo_obj); while (efl_ref_get(eo_obj) > 1) efl_unref(eo_obj); while (efl_ref_get(eo_obj) < 1) efl_ref(eo_obj); @@ -343,12 +343,12 @@ _evas_canvas_efl_object_destructor(Eo *eo_e, Evas_Public_Data *e) EINA_INLIST_FOREACH(lay->objects, o) if (o && (o->object == eo_obj)) { - ERR("Zombie Object [%s@%p] could not be removed " + ERR("Zombie Object [%s] could not be removed " "from the list of objects. Maybe this object " "was deleted but the call to efl_destructor() " "was not propagated to all the parent classes? " "Forcibly removing it. This may leak! Refs: %i:%i", - efl_class_name_get(eo_obj), eo_obj, efl_ref_get(eo_obj), ___efl_ref2_get(eo_obj)); + efl_debug_name_get(eo_obj), efl_ref_get(eo_obj), ___efl_ref2_get(eo_obj)); lay->objects = (Evas_Object_Protected_Data *) eina_inlist_remove(EINA_INLIST_GET(lay->objects), EINA_INLIST_GET(o)); goto next_zombie; diff --git a/src/lib/evas/canvas/evas_name.c b/src/lib/evas/canvas/evas_name.c index a048bff0f5..8f26e5c2c5 100644 --- a/src/lib/evas/canvas/evas_name.c +++ b/src/lib/evas/canvas/evas_name.c @@ -67,22 +67,22 @@ evas_object_name_child_find(const Evas_Object *eo_obj, const char *name, int rec } /* new in EO */ -EOLIAN const char * -_efl_canvas_object_efl_object_debug_name_override_get(Eo *eo_obj, Evas_Object_Protected_Data *obj) +EOLIAN Eina_Strbuf * +_efl_canvas_object_efl_object_debug_name_override(Eo *eo_obj, Evas_Object_Protected_Data *obj, Eina_Strbuf *sb) { const char *norend = obj->no_render ? ":no_render" : ""; const char *clip = obj->clip.clipees ? ":clipper" : ""; - const char *base; - base = efl_debug_name_get(efl_super(eo_obj, EFL_CANVAS_OBJECT_CLASS)); + sb = efl_debug_name_override(efl_super(eo_obj, EFL_CANVAS_OBJECT_CLASS), sb); if (obj->cur->visible) { - return eina_slstr_printf("%s%s%s:(%d,%d %dx%d)", base, norend, clip, - obj->cur->geometry.x, obj->cur->geometry.y, - obj->cur->geometry.w, obj->cur->geometry.h); + eina_strbuf_append_printf(sb, "%s%s:(%d,%d %dx%d)", norend, clip, + obj->cur->geometry.x, obj->cur->geometry.y, + obj->cur->geometry.w, obj->cur->geometry.h); } else { - return eina_slstr_printf("%s:hidden%s%s", base, norend, clip); + eina_strbuf_append_printf(sb, ":hidden%s%s", norend, clip); } + return sb; } diff --git a/src/lib/evas/canvas/evas_object_smart.c b/src/lib/evas/canvas/evas_object_smart.c index 9a6e725e3b..55dc84d497 100644 --- a/src/lib/evas/canvas/evas_object_smart.c +++ b/src/lib/evas/canvas/evas_object_smart.c @@ -647,13 +647,12 @@ _efl_canvas_group_efl_object_destructor(Eo *eo_obj, Evas_Smart_Data *o) } } -EOLIAN static const char * -_efl_canvas_group_efl_object_debug_name_override_get(Eo *eo_obj, Evas_Smart_Data *o) +EOLIAN static Eina_Strbuf * +_efl_canvas_group_efl_object_debug_name_override(Eo *eo_obj, Evas_Smart_Data *o, Eina_Strbuf *sb) { - const char *base; - - base = efl_debug_name_get(efl_super(eo_obj, MY_CLASS)); - return eina_slstr_printf("%s:children=%d", base, eina_inlist_count(o->contained)); + sb = efl_debug_name_override(efl_super(eo_obj, MY_CLASS), sb); + eina_strbuf_append_printf(sb, ":children=%d", eina_inlist_count(o->contained)); + return sb; } static inline void