summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCedric BAIL <cedric@osg.samsung.com>2018-05-14 16:15:48 -0700
committerCedric BAIL <cedric@osg.samsung.com>2018-05-22 16:55:09 -0700
commitdb86c05b6676b33cd07a392aef27a8dd3b655fc5 (patch)
tree32ef4eaf47e2d015e8ded414e5b22e6b6dabe470
parentc2bb5befad2755b8862cf86d283ca77e0092dc6e (diff)
downloadefl-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.c31
-rw-r--r--src/lib/evas/canvas/evas_render.c2
-rw-r--r--src/lib/evas/canvas/render2/evas_render2_th_main.c2
-rw-r--r--src/lib/evas/include/evas_private.h3
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);