Elm Layout: Make box & table part proxies temporary
authorJean-Philippe Andre <jp.andre@samsung.com>
Thu, 26 May 2016 05:06:52 +0000 (14:06 +0900)
committerJean-Philippe Andre <jp.andre@samsung.com>
Thu, 26 May 2016 10:55:50 +0000 (19:55 +0900)
efl_part returns short lived objects, let's make them
die after each function call.

src/lib/elementary/efl_ui_layout_internal_box.eo
src/lib/elementary/efl_ui_layout_internal_table.eo
src/lib/elementary/elm_layout.c
src/lib/elementary/elm_layout_pack.c
src/lib/elementary/elm_part_helper.h

index 015f176..97fac12 100644 (file)
@@ -17,7 +17,6 @@ class Efl.Ui.Layout_Internal.Box (Eo.Base, Efl.Pack.Linear)
       }
    }
    implements {
-      Eo.Base.finalize;
       Eo.Base.destructor;
       Efl.Container.content_iterate;
       Efl.Container.content_count;
index 8a81b19..c4081c2 100644 (file)
@@ -17,7 +17,6 @@ class Efl.Ui.Layout_Internal.Table (Eo.Base, Efl.Pack.Grid)
       }
    }
    implements {
-      Eo.Base.finalize;
       Eo.Base.destructor;
       Efl.Container.content_iterate;
       Efl.Container.content_count;
index 660d058..9aab7bc 100644 (file)
@@ -1993,45 +1993,24 @@ elm_layout_table_clear(Elm_Layout *obj, const char *part, Eina_Bool clear)
 
 /* Efl.Part implementation */
 
-static EOLIAN void
-_elm_layout_internal_part_eo_base_destructor(Eo *obj, Elm_Part_Data *pd)
-{
-   free(pd->part);
-   eo_data_xunref(pd->obj, pd->sd, obj);
-   eo_destructor(eo_super(obj, ELM_LAYOUT_INTERNAL_PART_CLASS));
-}
-
 static EOLIAN Eo_Base *
 _elm_layout_efl_part_part(const Eo *obj, Elm_Layout_Smart_Data *sd,
                           const char *part)
 {
-   Elm_Layout_Sub_Object_Data *sub_d;
    const Evas_Object *subobj;
    Elm_Part_Data *pd;
-   Eina_List *l;
    Eo *proxy;
 
    if (!_elm_layout_part_aliasing_eval(obj, sd, &part, EINA_FALSE))
      return NULL;
 
-   // Find parts which already have content
-   if (EINA_LIKELY(!!part))
-     {
-        EINA_LIST_FOREACH(sd->subs, l, sub_d)
-          {
-             if ((sub_d->type == TABLE_PACK) || _sub_box_is(sub_d))
-               {
-                  if (!strcmp(part, sub_d->part))
-                    return _elm_layout_pack_proxy_get((Eo *) obj, sub_d->obj, part);
-               }
-          }
-     }
-
-   // Ask edje for existing parts: BOX & TABLE
    ELM_WIDGET_DATA_GET_OR_RETURN((Eo *) obj, wd, NULL);
+
+   // Ask edje for existing parts
    subobj = edje_object_part_object_get(wd->resize_obj, part);
    if (subobj)
      {
+        // Support BOX & TABLE
         proxy = _elm_layout_pack_proxy_get((Eo *) obj, (Eo *) subobj, part);
         if (proxy) return proxy;
      }
@@ -2050,6 +2029,7 @@ _elm_layout_efl_part_part(const Eo *obj, Elm_Layout_Smart_Data *sd,
    return proxy;
 }
 
+ELM_PART_IMPLEMENT_DESTRUCTOR(elm_layout, ELM_LAYOUT, Elm_Layout_Smart_Data, Elm_Part_Data)
 ELM_PART_IMPLEMENT_CONTENT_SET(elm_layout, ELM_LAYOUT, Elm_Layout_Smart_Data, Elm_Part_Data)
 ELM_PART_IMPLEMENT_CONTENT_GET(elm_layout, ELM_LAYOUT, Elm_Layout_Smart_Data, Elm_Part_Data)
 ELM_PART_IMPLEMENT_CONTENT_UNSET(elm_layout, ELM_LAYOUT, Elm_Layout_Smart_Data, Elm_Part_Data)
index e8ad6d7..f8f66d2 100644 (file)
 
 #include "elm_priv.h"
 #include "elm_widget_layout.h"
+#include "elm_part_helper.h"
 
 #include "efl_ui_layout_internal_box.eo.h"
 #include "efl_ui_layout_internal_table.eo.h"
 #include "../evas/canvas/evas_box.eo.h"
 #include "../evas/canvas/evas_table.eo.h"
 
-#warning TODO: Implement proper lifecycle of proxy objects (single call)
-
 /* layout internals for box & table */
 Eina_Bool    _elm_layout_box_append(Eo *obj, Elm_Layout_Smart_Data *sd, const char *part, Evas_Object *child);
 Eina_Bool    _elm_layout_box_prepend(Eo *obj, Elm_Layout_Smart_Data *sd, const char *part, Evas_Object *child);
@@ -31,7 +30,6 @@ Eina_Bool    _elm_layout_table_clear(Eo *obj, Elm_Layout_Smart_Data *sd, const c
 
 #define BOX_CLASS   EFL_UI_LAYOUT_INTERNAL_BOX_CLASS
 #define TABLE_CLASS EFL_UI_LAYOUT_INTERNAL_TABLE_CLASS
-#define DATA_KEY    "__elm_layout_internal"
 
 typedef struct _Layout_Part_Data   Efl_Ui_Layout_Box_Data;
 typedef struct _Layout_Part_Data   Efl_Ui_Layout_Table_Data;
@@ -39,10 +37,11 @@ typedef struct _Part_Item_Iterator Part_Item_Iterator;
 
 struct _Layout_Part_Data
 {
-   Elm_Layout            *obj;
-   Elm_Layout_Smart_Data *sd;
+   Elm_Layout            *obj; // no ref
+   Elm_Layout_Smart_Data *sd;  // data xref
    Eina_Stringshare      *part;
    Evas_Object           *pack;
+   unsigned char          temp;
 };
 
 struct _Part_Item_Iterator
@@ -58,9 +57,6 @@ _elm_layout_pack_proxy_get(Elm_Layout *obj, Evas_Object *pack, const char *part)
 {
    Efl_Ui_Layout_Internal_Box *eo;
 
-   eo = eo_key_obj_get(pack, DATA_KEY);
-   if (eo) return eo;
-
    if (eo_isa(pack, EVAS_BOX_CLASS))
      eo = eo_add(BOX_CLASS, obj,
                  efl_ui_layout_internal_box_real_part_set(eo_self, obj, pack, part));
@@ -70,31 +66,26 @@ _elm_layout_pack_proxy_get(Elm_Layout *obj, Evas_Object *pack, const char *part)
    else
      return NULL;
 
-   eo_key_obj_set(pack, DATA_KEY, eo);
    return eo;
 }
 
 EOLIAN static void
-_efl_ui_layout_internal_box_real_part_set(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Eo *layout, Eo *pack, const char *part)
-{
-   pd->obj = layout;
-   pd->sd = eo_data_scope_get(layout, ELM_LAYOUT_CLASS);
-   pd->part = part;
-   pd->pack = pack;
-}
-
-EOLIAN static Eo_Base *
-_efl_ui_layout_internal_box_eo_base_finalize(Eo *obj, Efl_Ui_Layout_Box_Data *pd)
+_efl_ui_layout_internal_box_eo_base_destructor(Eo *obj, Efl_Ui_Layout_Table_Data *pd)
 {
-   EINA_SAFETY_ON_FALSE_RETURN_VAL(pd->obj && pd->part && pd->sd, NULL);
-   return eo_finalize(eo_super(obj, BOX_CLASS));
+   ELM_PART_HOOK;
+   eo_data_xunref(pd->obj, pd->sd, obj);
+   eina_stringshare_del(pd->part);
+   eo_destructor(eo_super(obj, BOX_CLASS));
 }
 
 EOLIAN static void
-_efl_ui_layout_internal_box_eo_base_destructor(Eo *obj, Efl_Ui_Layout_Box_Data *pd)
+_efl_ui_layout_internal_box_real_part_set(Eo *obj, Efl_Ui_Layout_Box_Data *pd, Eo *layout, Eo *pack, const char *part)
 {
-   eo_key_data_set(pd->pack, DATA_KEY, NULL);
-   eo_destructor(eo_super(obj, BOX_CLASS));
+   pd->obj = layout;
+   pd->sd = eo_data_xref(pd->obj, ELM_LAYOUT_CLASS, obj);
+   eina_stringshare_replace(&pd->part, part);
+   pd->pack = pack;
+   pd->temp = 1;
 }
 
 /* this iterator is the same as efl_ui_box */
@@ -153,62 +144,62 @@ _efl_ui_layout_internal_box_efl_container_content_iterate(Eo *obj, Efl_Ui_Layout
    Eina_Iterator *it;
 
    it = evas_object_box_iterator_new(pd->pack);
-   return _part_item_iterator_create(obj, it, NULL);
+   ELM_PART_RETURN_VAL(_part_item_iterator_create(obj, it, NULL));
 }
 
 EOLIAN static int
 _efl_ui_layout_internal_box_efl_container_content_count(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd)
 {
-   return evas_obj_box_count(pd->pack);
+   ELM_PART_RETURN_VAL(evas_obj_box_count(pd->pack));
 }
 
 EOLIAN static Eina_Bool
-_efl_ui_layout_internal_box_efl_container_content_remove(Eo *obj, Efl_Ui_Layout_Box_Data *pd EINA_UNUSED, Efl_Gfx *content)
+_efl_ui_layout_internal_box_efl_pack_pack_clear(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd)
 {
-   // alias
-   return efl_pack_unpack(obj, content);
+   ELM_PART_RETURN_VAL(_elm_layout_box_remove_all(pd->obj, pd->sd, pd->part, EINA_TRUE));
 }
 
 EOLIAN static Eina_Bool
-_efl_ui_layout_internal_box_efl_pack_pack_clear(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd)
+_efl_ui_layout_internal_box_efl_pack_unpack_all(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd)
 {
-   return _elm_layout_box_remove_all(pd->obj, pd->sd, pd->part, EINA_TRUE);
+   ELM_PART_RETURN_VAL(_elm_layout_box_remove_all(pd->obj, pd->sd, pd->part, EINA_FALSE));
 }
 
 EOLIAN static Eina_Bool
-_efl_ui_layout_internal_box_efl_pack_unpack_all(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd)
+_efl_ui_layout_internal_box_efl_pack_unpack(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj)
 {
-   return _elm_layout_box_remove_all(pd->obj, pd->sd, pd->part, EINA_FALSE);
+   ELM_PART_RETURN_VAL(_elm_layout_box_remove(pd->obj, pd->sd, pd->part, subobj) != NULL);
 }
 
 EOLIAN static Eina_Bool
-_efl_ui_layout_internal_box_efl_pack_unpack(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj)
+_efl_ui_layout_internal_box_efl_container_content_remove(Eo *obj, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *content)
 {
-   return _elm_layout_box_remove(pd->obj, pd->sd, pd->part, subobj) != NULL;
+   // alias for efl_pack_unpack
+   return _efl_ui_layout_internal_box_efl_pack_unpack(obj, pd, content);
 }
 
 EOLIAN static Eina_Bool
 _efl_ui_layout_internal_box_efl_pack_pack(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj)
 {
-   return _elm_layout_box_append(pd->obj, pd->sd, pd->part, subobj);
+   ELM_PART_RETURN_VAL(_elm_layout_box_append(pd->obj, pd->sd, pd->part, subobj));
 }
 
 EOLIAN static Eina_Bool
 _efl_ui_layout_internal_box_efl_pack_linear_pack_begin(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj)
 {
-   return _elm_layout_box_prepend(pd->obj, pd->sd, pd->part, subobj);
+   ELM_PART_RETURN_VAL(_elm_layout_box_prepend(pd->obj, pd->sd, pd->part, subobj));
 }
 
 EOLIAN static Eina_Bool
 _efl_ui_layout_internal_box_efl_pack_linear_pack_end(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj)
 {
-   return _elm_layout_box_append(pd->obj, pd->sd, pd->part, subobj);
+   ELM_PART_RETURN_VAL(_elm_layout_box_append(pd->obj, pd->sd, pd->part, subobj));
 }
 
 EOLIAN static Eina_Bool
 _efl_ui_layout_internal_box_efl_pack_linear_pack_before(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj, const Efl_Gfx *existing)
 {
-   return _elm_layout_box_insert_before(pd->obj, pd->sd, pd->part, subobj, existing);
+   ELM_PART_RETURN_VAL(_elm_layout_box_insert_before(pd->obj, pd->sd, pd->part, subobj, existing));
 }
 
 EOLIAN static Eina_Bool
@@ -218,20 +209,20 @@ _efl_ui_layout_internal_box_efl_pack_linear_pack_after(Eo *obj EINA_UNUSED, Efl_
    int index;
 
    index = efl_pack_index_get(pd->pack, existing);
-   if (index < 0) return EINA_FALSE;
+   if (index < 0) ELM_PART_RETURN_VAL(EINA_FALSE);
 
    other = efl_pack_content_get(pd->pack, index + 1);
    if (other)
-     return _elm_layout_box_insert_before(pd->obj, pd->sd, pd->part, subobj, other);
+     ELM_PART_RETURN_VAL(_elm_layout_box_insert_before(pd->obj, pd->sd, pd->part, subobj, other));
 
-   efl_pack_end(obj, subobj);
-   return EINA_TRUE;
+   ELM_PART_CALL(efl_pack_end(obj, subobj));
+   ELM_PART_RETURN_VAL(EINA_TRUE);
 }
 
 EOLIAN static Eina_Bool
 _efl_ui_layout_internal_box_efl_pack_linear_pack_at(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, Efl_Gfx *subobj, int index)
 {
-   return _elm_layout_box_insert_at(pd->obj, pd->sd, pd->part, subobj, index);
+   ELM_PART_RETURN_VAL(_elm_layout_box_insert_at(pd->obj, pd->sd, pd->part, subobj, index));
 }
 
 EOLIAN static Efl_Gfx *
@@ -242,8 +233,8 @@ _efl_ui_layout_internal_box_efl_pack_linear_pack_content_get(Eo *obj EINA_UNUSED
 
    priv = eo_data_scope_get(pd->pack, EVAS_BOX_CLASS);
    opt = eina_list_nth(priv->children, index);
-   if (!opt) return NULL;
-   return opt->obj;
+   if (!opt) ELM_PART_RETURN_VAL(NULL);
+   ELM_PART_RETURN_VAL(opt->obj);
 }
 
 EOLIAN static Efl_Gfx *
@@ -252,18 +243,18 @@ _efl_ui_layout_internal_box_efl_pack_linear_pack_unpack_at(Eo *obj, Efl_Ui_Layou
    Efl_Gfx *subobj;
 
    subobj = efl_pack_content_get(pd->pack, index);
-   if (!subobj) return NULL;
+   if (!subobj) ELM_PART_RETURN_VAL(NULL);
    if (efl_pack_unpack(obj, subobj))
-     return subobj;
+     ELM_PART_RETURN_VAL(subobj);
 
    ERR("failed to remove %p from %p (item %d)", subobj, pd->obj, index);
-   return NULL;
+   ELM_PART_RETURN_VAL(NULL);
 }
 
 EOLIAN static int
 _efl_ui_layout_internal_box_efl_pack_linear_pack_index_get(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Box_Data *pd, const Efl_Gfx *subobj)
 {
-   return efl_pack_index_get(pd->pack, subobj);
+   ELM_PART_RETURN_VAL(efl_pack_index_get(pd->pack, subobj));
 }
 
 EOLIAN static Efl_Orient
@@ -271,29 +262,27 @@ _efl_ui_layout_internal_box_efl_pack_linear_pack_direction_get(Eo *obj EINA_UNUS
 {
    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, EFL_ORIENT_NONE);
 
-   return efl_pack_direction_get(efl_content_get(efl_part(wd->resize_obj, pd->part)));
+   ELM_PART_RETURN_VAL(efl_pack_direction_get(efl_part(wd->resize_obj, pd->part)));
 }
 
+
+/* Table proxy implementation */
+
 EOLIAN static void
-_efl_ui_layout_internal_table_real_part_set(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd, Eo *layout, Eo *pack, const char *part)
+_efl_ui_layout_internal_table_real_part_set(Eo *obj, Efl_Ui_Layout_Table_Data *pd, Eo *layout, Eo *pack, const char *part)
 {
    pd->obj = layout;
-   pd->sd = eo_data_scope_get(layout, ELM_LAYOUT_CLASS);
-   pd->part = eina_stringshare_add(part);
+   pd->sd = eo_data_xref(pd->obj, ELM_LAYOUT_CLASS, obj);
+   eina_stringshare_replace(&pd->part, part);
    pd->pack = pack;
-}
-
-EOLIAN static Eo_Base *
-_efl_ui_layout_internal_table_eo_base_finalize(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd)
-{
-   EINA_SAFETY_ON_FALSE_RETURN_VAL(pd->obj && pd->part && pd->sd, NULL);
-   return eo_finalize(eo_super(obj, TABLE_CLASS));
+   pd->temp = 1;
 }
 
 EOLIAN static void
-_efl_ui_layout_internal_table_eo_base_destructor(Eo *obj, Efl_Ui_Layout_Box_Data *pd)
+_efl_ui_layout_internal_table_eo_base_destructor(Eo *obj, Efl_Ui_Layout_Table_Data *pd)
 {
-   eo_key_data_set(pd->pack, DATA_KEY, NULL);
+   ELM_PART_HOOK;
+   eo_data_xunref(pd->obj, pd->sd, obj);
    eina_stringshare_del(pd->part);
    eo_destructor(eo_super(obj, TABLE_CLASS));
 }
@@ -305,50 +294,51 @@ _efl_ui_layout_internal_table_efl_container_content_iterate(Eo *obj, Efl_Ui_Layo
 
    it = evas_object_table_iterator_new(pd->pack);
 
-   return _part_item_iterator_create(obj, it, NULL);
+   ELM_PART_RETURN_VAL(_part_item_iterator_create(obj, it, NULL));
 }
 
 EOLIAN static int
 _efl_ui_layout_internal_table_efl_container_content_count(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd)
 {
-   return evas_obj_table_count(pd->pack);
+   ELM_PART_RETURN_VAL(evas_obj_table_count(pd->pack));
 }
 
 EOLIAN static Eina_Bool
-_efl_ui_layout_internal_table_efl_container_content_remove(Eo *obj, Efl_Ui_Layout_Table_Data *pd EINA_UNUSED, Efl_Gfx *content)
+_efl_ui_layout_internal_table_efl_pack_pack_clear(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd)
 {
-   return efl_pack_unpack(obj, content);
+   ELM_PART_RETURN_VAL(_elm_layout_table_clear(pd->obj, pd->sd, pd->part, EINA_TRUE));
 }
 
 EOLIAN static Eina_Bool
-_efl_ui_layout_internal_table_efl_pack_pack_clear(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd)
+_efl_ui_layout_internal_table_efl_pack_unpack_all(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd)
 {
-   return _elm_layout_table_clear(pd->obj, pd->sd, pd->part, EINA_TRUE);
+   ELM_PART_RETURN_VAL(_elm_layout_table_clear(pd->obj, pd->sd, pd->part, EINA_FALSE));
 }
 
 EOLIAN static Eina_Bool
-_efl_ui_layout_internal_table_efl_pack_unpack_all(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd)
+_efl_ui_layout_internal_table_efl_pack_unpack(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd, Efl_Gfx *subobj)
 {
-   return _elm_layout_table_clear(pd->obj, pd->sd, pd->part, EINA_FALSE);
+   if (!subobj) ELM_PART_RETURN_VAL(EINA_FALSE);
+   ELM_PART_RETURN_VAL(_elm_layout_table_unpack(pd->obj, pd->sd, pd->part, subobj) == subobj);
 }
 
 EOLIAN static Eina_Bool
-_efl_ui_layout_internal_table_efl_pack_unpack(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd, Efl_Gfx *subobj)
+_efl_ui_layout_internal_table_efl_container_content_remove(Eo *obj, Efl_Ui_Layout_Table_Data *pd, Efl_Gfx *content)
 {
-   if (!subobj) return EINA_FALSE;
-   return _elm_layout_table_unpack(pd->obj, pd->sd, pd->part, subobj) == subobj;
+   // alias for efl_pack_unpack
+   return _efl_ui_layout_internal_table_efl_pack_unpack(obj, pd, content);
 }
 
 EOLIAN static Eina_Bool
 _efl_ui_layout_internal_table_efl_pack_grid_pack_grid(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd, Efl_Gfx *subobj, int col, int row, int colspan, int rowspan)
 {
-   return _elm_layout_table_pack(pd->obj, pd->sd, pd->part, subobj, col, row, colspan, rowspan);
+   ELM_PART_RETURN_VAL(_elm_layout_table_pack(pd->obj, pd->sd, pd->part, subobj, col, row, colspan, rowspan));
 }
 
 EOLIAN static Efl_Gfx *
 _efl_ui_layout_internal_table_efl_pack_grid_grid_content_get(Eo *obj EINA_UNUSED, Efl_Ui_Layout_Table_Data *pd, int col, int row)
 {
-   return evas_object_table_child_get(pd->pack, col, row);
+   ELM_PART_RETURN_VAL(evas_object_table_child_get(pd->pack, col, row));
 }
 
 EOLIAN static Eina_Iterator *
@@ -376,7 +366,7 @@ _efl_ui_layout_internal_table_efl_pack_grid_grid_contents_get(Eo *obj EINA_UNUSE
           }
      }
 
-   return _part_item_iterator_create(pd->obj, eina_list_iterator_new(l), l);
+   ELM_PART_RETURN_VAL(_part_item_iterator_create(pd->obj, eina_list_iterator_new(l), l));
 }
 
 EOLIAN static Eina_Bool
@@ -391,7 +381,7 @@ _efl_ui_layout_internal_table_efl_pack_grid_grid_position_get(Eo *obj EINA_UNUSE
    if (colspan) *colspan = cs;
    if (rowspan) *rowspan = rs;
 
-   return ret;
+   ELM_PART_RETURN_VAL(ret);
 }
 
 EOLIAN static void
@@ -405,7 +395,7 @@ _efl_ui_layout_internal_table_efl_pack_grid_grid_columns_get(Eo *obj EINA_UNUSED
 {
    int cols, rows;
    evas_object_table_col_row_size_get(pd->pack, &cols, &rows);
-   return cols;
+   ELM_PART_RETURN_VAL(cols);
 }
 
 EOLIAN static int
@@ -413,7 +403,7 @@ _efl_ui_layout_internal_table_efl_pack_grid_grid_rows_get(Eo *obj EINA_UNUSED, E
 {
    int cols, rows;
    evas_object_table_col_row_size_get(pd->pack, &cols, &rows);
-   return rows;
+   ELM_PART_RETURN_VAL(rows);
 }
 
 #include "efl_ui_layout_internal_box.eo.c"
index d1593d9..f180acd 100644 (file)
@@ -3,10 +3,13 @@
 
 #include "elm_layout_internal_part.eo.h"
 
+//#define ELM_PART_HOOK do { ERR("%p:%s [%d]", pd->obj, pd->part, (int) pd->temp); } while(0)
+#define ELM_PART_HOOK
+
 #define ELM_PART_REF(obj, pd) do { if (!(pd->temp++)) eo_ref(obj); } while(0)
 #define ELM_PART_UNREF(obj, pd) do { if (pd->temp) { if (!(--pd->temp)) eo_unref(obj); } } while(0)
-#define ELM_PART_RETURN_VAL(a) do { typeof(a) _ret = a; ELM_PART_UNREF(obj, pd); return _ret; } while(0)
-#define ELM_PART_RETURN_VOID do { ELM_PART_UNREF(obj, pd); return; } while(0)
+#define ELM_PART_RETURN_VAL(a) do { ELM_PART_HOOK; typeof(a) _ret = a; ELM_PART_UNREF(obj, pd); return _ret; } while(0)
+#define ELM_PART_RETURN_VOID do { ELM_PART_HOOK; ELM_PART_UNREF(obj, pd); return; } while(0)
 #define ELM_PART_CALL(a) ({ ELM_PART_REF(obj, pd); a; })
 
 typedef struct _Elm_Part_Data Elm_Part_Data;
@@ -21,17 +24,19 @@ struct _Elm_Part_Data
 // Note: this generic implementation can be improved to support part object
 // caching or something...
 
-// Main part proxy implementation
-#define ELM_PART_IMPLEMENT(type, TYPE, typedata, partdata) \
-\
+#define ELM_PART_IMPLEMENT_DESTRUCTOR(type, TYPE, typedata, partdata) \
 static EOLIAN void \
 _ ## type ## _internal_part_eo_base_destructor(Eo *obj, partdata *pd) \
 { \
+   ELM_PART_HOOK; \
    free(pd->part); \
    eo_data_xunref(pd->obj, pd->sd, obj); \
    eo_destructor(eo_super(obj, TYPE ## _INTERNAL_PART_CLASS)); \
 } \
-\
+
+// Main part proxy implementation
+#define ELM_PART_IMPLEMENT(type, TYPE, typedata, partdata) \
+ELM_PART_IMPLEMENT_DESTRUCTOR(type, TYPE, typedata, partdata) \
 static EOLIAN Eo_Base * \
 _ ## type ## _efl_part_part(const Eo *obj, typedata *priv EINA_UNUSED, const char *part) \
 { \