diff options
author | Cedric BAIL <cedric@osg.samsung.com> | 2018-05-14 16:15:48 -0700 |
---|---|---|
committer | Cedric BAIL <cedric@osg.samsung.com> | 2018-05-22 16:55:09 -0700 |
commit | db86c05b6676b33cd07a392aef27a8dd3b655fc5 (patch) | |
tree | 32ef4eaf47e2d015e8ded414e5b22e6b6dabe470 | |
parent | c2bb5befad2755b8862cf86d283ca77e0092dc6e (diff) | |
download | efl-db86c05b6676b33cd07a392aef27a8dd3b655fc5.tar.gz |
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...
-rw-r--r-- | src/lib/evas/canvas/evas_object_main.c | 31 | ||||
-rw-r--r-- | src/lib/evas/canvas/evas_render.c | 2 | ||||
-rw-r--r-- | src/lib/evas/canvas/render2/evas_render2_th_main.c | 2 | ||||
-rw-r--r-- | 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 00476e29ca..74f4d2b074 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); @@ -1363,7 +1363,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); |