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);

-- 


Reply via email to