cedric pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=15995ff0eb9e48ff0c6a395def61f7f818cbd0b1
commit 15995ff0eb9e48ff0c6a395def61f7f818cbd0b1 Author: Cedric BAIL <[email protected]> Date: Mon May 14 16:15:48 2018 -0700 evas: make evas_object_free work in case of lost reference to Eo object. This is clearly a workaround to a bad situation, but there is no case that I can find that solely lead to object being NULL nor is there any code that should do that, but still it does in some case... --- src/lib/evas/canvas/evas_object_main.c | 31 +++++++++++----------- src/lib/evas/canvas/evas_render.c | 2 +- src/lib/evas/canvas/render2/evas_render2_th_main.c | 2 +- src/lib/evas/include/evas_private.h | 3 +-- 4 files changed, 18 insertions(+), 20 deletions(-) diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c index 8522d5f8ef..28f46d96a2 100644 --- a/src/lib/evas/canvas/evas_object_main.c +++ b/src/lib/evas/canvas/evas_object_main.c @@ -541,17 +541,14 @@ evas_object_cur_prev(Evas_Object_Protected_Data *obj) } void -evas_object_free(Evas_Object *eo_obj, Eina_Bool clean_layer) +evas_object_free(Evas_Object_Protected_Data *obj, Eina_Bool clean_layer) { - Evas_Object_Protected_Data *obj; - - if (!eo_obj) return ; - obj = efl_data_scope_get(eo_obj, MY_CLASS); - if (!obj) return; - obj->clean_layer = !!clean_layer; - + Evas_Object *eo_obj; int was_smart_child = 0; + if (!obj) return ; + eo_obj = obj->object; + evas_object_callback_shutdown(eo_obj, obj); if (efl_isa(eo_obj, EFL_CANVAS_IMAGE_INTERNAL_CLASS)) _evas_object_image_free(eo_obj); @@ -585,15 +582,18 @@ evas_object_free(Evas_Object *eo_obj, Eina_Bool clean_layer) } EINA_COW_WRITE_END(evas_object_mask_cow, obj->mask, mask); } - evas_object_grabs_cleanup(eo_obj, obj); - evas_object_intercept_cleanup(eo_obj); - if (obj->smart.parent) was_smart_child = 1; - evas_object_smart_cleanup(eo_obj); - if (obj->func->free) + if (eo_obj) { - obj->func->free(eo_obj, obj, obj->private_data); + evas_object_grabs_cleanup(eo_obj, obj); + evas_object_intercept_cleanup(eo_obj); + if (obj->smart.parent) was_smart_child = 1; + evas_object_smart_cleanup(eo_obj); + if (obj->func->free) + { + obj->func->free(eo_obj, obj, obj->private_data); + } } - if (!was_smart_child) evas_object_release(eo_obj, obj, obj->clean_layer); + if (!was_smart_child) evas_object_release(eo_obj, obj, !!clean_layer); if (obj->clip.clipees) obj->clip.clipees = eina_list_free(obj->clip.clipees); obj->clip.cache_clipees_answer = eina_list_free(obj->clip.cache_clipees_answer); @@ -1362,7 +1362,6 @@ _efl_canvas_object_efl_object_destructor(Eo *eo_obj, Evas_Object_Protected_Data if (!obj->layer) { efl_manual_free_set(eo_obj, EINA_FALSE); - obj->clean_layer = 1; goto end; } diff --git a/src/lib/evas/canvas/evas_render.c b/src/lib/evas/canvas/evas_render.c index 52ffd0e5d3..d6373a2d49 100644 --- a/src/lib/evas/canvas/evas_render.c +++ b/src/lib/evas/canvas/evas_render.c @@ -3682,7 +3682,7 @@ evas_render_updates_internal(Evas *eo_e, for (i = 0; i < e->delete_objects.count; ++i) { obj = eina_array_data_get(&e->delete_objects, i); - evas_object_free(obj->object, EINA_TRUE); + evas_object_free(obj, EINA_TRUE); } eina_array_clean(&e->delete_objects); /* if we deleted no objects this frame or we deleted a lot (> 1024) then diff --git a/src/lib/evas/canvas/render2/evas_render2_th_main.c b/src/lib/evas/canvas/render2/evas_render2_th_main.c index e3039776dd..c101a9abbb 100644 --- a/src/lib/evas/canvas/render2/evas_render2_th_main.c +++ b/src/lib/evas/canvas/render2/evas_render2_th_main.c @@ -58,7 +58,7 @@ _evas_render2_th_main_delete_objects_clean(Evas_Public_Data *e) for (i = 0; i < e->delete_objects.count; ++i) { obj = eina_array_data_get(&e->delete_objects, i); - evas_object_free(obj->object, 1); + evas_object_free(obj, 1); } // OBJS_ARRAY_CLEAN(&e->delete_objects); eina_array_clean(&e->delete_objects); diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index ea3adb3ec5..c49d9990ed 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -1184,7 +1184,6 @@ struct _Evas_Object_Protected_Data Eina_Bool child_has_map : 1; Eina_Bool efl_del_called : 1; Eina_Bool no_render : 1; // since 1.15 - Eina_Bool clean_layer : 1; // destructor option Eina_Bool snapshot_needs_redraw : 1; Eina_Bool snapshot_no_obscure : 1; @@ -1553,7 +1552,7 @@ Evas_Object *evas_object_new(Evas *e); void evas_object_change_reset(Evas_Object_Protected_Data *obj); void evas_object_clip_recalc_do(Evas_Object_Protected_Data *obj, Evas_Object_Protected_Data *clipper); void evas_object_cur_prev(Evas_Object_Protected_Data *obj); -void evas_object_free(Evas_Object *obj, Eina_Bool clean_layer); +void evas_object_free(Evas_Object_Protected_Data *obj, Eina_Bool clean_layer); void evas_object_update_bounding_box(Evas_Object *obj, Evas_Object_Protected_Data *pd, Evas_Smart_Data *s); void evas_object_inject(Evas_Object *obj, Evas_Object_Protected_Data *pd, Evas *e); void evas_object_release(Evas_Object *obj, Evas_Object_Protected_Data *pd, int clean_layer); --
