cedric pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=4cede693a5d39d80de4aadf395b612378997e813

commit 4cede693a5d39d80de4aadf395b612378997e813
Author: Marcel Hollerbach <m...@marcel-hollerbach.de>
Date:   Wed Aug 21 17:26:03 2019 +0200

    efl_ui_widget: remove self reference
    
    as an example: elm_test uses roughly 500 widgets, this pointer takes 8
    bytes, this is wasting quite some time, which can be perfectly safed by
    just structuring the code a little bit more. In some callbacks we need
    to call one more time efl_data_scope_get but that is not a that big
    issue, as most calls after that are also doing a eo call on that object,
    so the eo_id is already cached.
    
    Reviewed-by: Cedric BAIL <cedric.b...@free.fr>
    Differential Revision: https://phab.enlightenment.org/D9683
---
 src/lib/elementary/efl_ui_image_zoomable.c |  8 +--
 src/lib/elementary/efl_ui_widget.c         | 80 +++++++++++++++---------------
 src/lib/elementary/elm_map.c               | 12 ++---
 src/lib/elementary/elm_menu.c              |  2 +-
 src/lib/elementary/elm_prefs.c             |  8 +--
 src/lib/elementary/elm_widget.h            |  1 -
 6 files changed, 54 insertions(+), 57 deletions(-)

diff --git a/src/lib/elementary/efl_ui_image_zoomable.c 
b/src/lib/elementary/efl_ui_image_zoomable.c
index 88824c3985..92b234782a 100644
--- a/src/lib/elementary/efl_ui_image_zoomable.c
+++ b/src/lib/elementary/efl_ui_image_zoomable.c
@@ -377,15 +377,15 @@ 
_efl_ui_image_zoomable_pan_efl_canvas_group_group_calculate(Eo *obj, Efl_Ui_Imag
 
    evas_object_geometry_get(obj, &ox, &oy, &ow, &oh);
    _image_place(
-       wd->obj, psd->wsd->pan_x, psd->wsd->pan_y,
+       psd->wobj, psd->wsd->pan_x, psd->wsd->pan_y,
        ox - psd->wsd->g_layer_zoom.imx, oy - psd->wsd->g_layer_zoom.imy, ow,
        oh);
 
    EINA_LIST_FOREACH(psd->wsd->grids, l, g)
      {
-        _grid_load(wd->obj, g);
+        _grid_load(psd->wobj, g);
         _grid_place(
-              wd->obj, g, psd->wsd->pan_x,
+              psd->wobj, g, psd->wsd->pan_x,
              psd->wsd->pan_y, ox - psd->wsd->g_layer_zoom.imx,
              oy - psd->wsd->g_layer_zoom.imy, ow, oh);
      }
@@ -536,7 +536,7 @@ _tile_preloaded_cb(void *data,
                    "efl");
 
              efl_event_callback_legacy_call
-               (wd->obj, EFL_UI_IMAGE_ZOOMABLE_EVENT_LOADED_DETAIL, NULL);
+               (git->obj, EFL_UI_IMAGE_ZOOMABLE_EVENT_LOADED_DETAIL, NULL);
           }
      }
 }
diff --git a/src/lib/elementary/efl_ui_widget.c 
b/src/lib/elementary/efl_ui_widget.c
index fa6ba5a3ed..b3644a67ce 100644
--- a/src/lib/elementary/efl_ui_widget.c
+++ b/src/lib/elementary/efl_ui_widget.c
@@ -620,12 +620,12 @@ _on_sub_obj_del(void *data, const Efl_Event *event)
 
    if (_elm_widget_is(event->object))
      {
-        if (_is_focused(event->object)) _parents_unfocus(sd->obj);
+        if (_is_focused(event->object)) _parents_unfocus(data);
      }
    if (event->object == sd->resize_obj)
      {
         /* already dels sub object */
-        elm_widget_resize_object_set(sd->obj, NULL);
+        elm_widget_resize_object_set(data, NULL);
      }
    else if (event->object == sd->hover_obj)
      {
@@ -633,8 +633,8 @@ _on_sub_obj_del(void *data, const Efl_Event *event)
      }
    else
      {
-        if (!elm_widget_sub_object_del(sd->obj, event->object))
-          ERR("failed to remove sub object %p from %p\n", event->object, 
sd->obj);
+        if (!elm_widget_sub_object_del(data, event->object))
+          ERR("failed to remove sub object %p from %p\n", event->object, data);
      }
 }
 
@@ -715,8 +715,6 @@ _obj_mouse_in(void *data,
 EOLIAN static void
 _efl_ui_widget_efl_canvas_group_group_add(Eo *obj, Elm_Widget_Smart_Data *priv)
 {
-
-   priv->obj = obj;
    priv->mirrored_auto_mode = EINA_TRUE; /* will follow system locale
                                           * settings */
    priv->focus_move_policy_auto_mode = EINA_TRUE;
@@ -791,9 +789,9 @@ _efl_ui_widget_efl_canvas_group_group_del(Eo *obj, 
Elm_Widget_Smart_Data *sd)
 }
 
 static void
-_smart_reconfigure(Elm_Widget_Smart_Data *sd)
+_smart_reconfigure(Eo *obj, Elm_Widget_Smart_Data *sd)
 {
-   Eina_Rect geom = efl_gfx_entity_geometry_get(sd->obj);
+   Eina_Rect geom = efl_gfx_entity_geometry_get(obj);
 
    if (sd->resize_obj)
      {
@@ -808,7 +806,7 @@ _smart_reconfigure(Elm_Widget_Smart_Data *sd)
         efl_gfx_entity_geometry_set(sd->bg, geom);
      }
    if (sd->has_shadow)
-     _elm_widget_shadow_update(sd->obj);
+     _elm_widget_shadow_update(obj);
 }
 
 EOLIAN static void
@@ -825,7 +823,7 @@ _efl_ui_widget_efl_gfx_entity_position_set(Eo *obj 
EINA_UNUSED, Elm_Widget_Smart
      efl_gfx_entity_position_set(sd->bg, pos);
 
    if (sd->has_shadow)
-     _elm_widget_shadow_update(sd->obj);
+     _elm_widget_shadow_update(obj);
 
    efl_gfx_entity_position_set(efl_super(obj, MY_CLASS), pos);
 }
@@ -844,7 +842,7 @@ _efl_ui_widget_efl_gfx_entity_size_set(Eo *obj EINA_UNUSED, 
Elm_Widget_Smart_Dat
      efl_gfx_entity_size_set(sd->bg, sz);
 
    if (sd->has_shadow)
-     _elm_widget_shadow_update(sd->obj);
+     _elm_widget_shadow_update(obj);
 
    efl_gfx_entity_size_set(efl_super(obj, MY_CLASS), sz);
 }
@@ -1642,7 +1640,7 @@ _efl_ui_widget_resize_object_set(Eo *obj, 
Elm_Widget_Smart_Data *sd, Eo *sobj)
 
    elm_widget_sub_object_add(obj, sobj);
    evas_object_smart_member_add(sobj, obj);
-   _smart_reconfigure(sd);
+   _smart_reconfigure(obj, sd);
 }
 
 /*
@@ -1666,7 +1664,7 @@ elm_widget_hover_object_set(Eo *obj, Evas_Object *sobj)
    if (sd->hover_obj)
      {
         _callbacks_add(sobj, obj);
-        _smart_reconfigure(sd);
+        _smart_reconfigure(obj, sd);
      }
 }
 
@@ -5201,11 +5199,10 @@ elm_widget_show_region_set(Eo *obj, Eina_Rect sr, 
Eina_Bool forceshow)
                }
           }
      }
-
+   child_obj = obj;
    do
      {
         parent_obj = sd->parent_obj;
-        child_obj = sd->obj;
         if ((!parent_obj) || (!_elm_widget_is(parent_obj))) break;
         sd = efl_data_scope_get(parent_obj, MY_CLASS);
         if (!sd) break;
@@ -5219,6 +5216,7 @@ elm_widget_show_region_set(Eo *obj, Eina_Rect sr, 
Eina_Bool forceshow)
 
         if (sd->on_show_region)
           sd->on_show_region(sd->on_show_region_data, parent_obj, sr);
+        child_obj = parent_obj;
      }
    while (parent_obj);
 }
@@ -5664,7 +5662,7 @@ _efl_ui_widget_bg_get(const Efl_Ui_Widget *obj)
         sd->bg = bg_obj;
         efl_canvas_group_member_add((Eo *)obj, sd->bg);
         evas_object_stack_below(sd->bg, sd->resize_obj);
-        _smart_reconfigure(sd);
+        _smart_reconfigure((Eo*)obj, sd);
      }
 
    return bg_obj;
@@ -5796,7 +5794,7 @@ _efl_ui_property_bind_clean(Eo *obj EINA_UNUSED,
 }
 
 static void
-_efl_ui_property_bind_get(Efl_Ui_Widget_Data *pd, Efl_Ui_Property_Bound *prop)
+_efl_ui_property_bind_get(Eo *obj, Efl_Ui_Widget_Data *pd, 
Efl_Ui_Property_Bound *prop)
 {
    Eina_Value *value;
    Eina_Future *f;
@@ -5807,7 +5805,7 @@ _efl_ui_property_bind_get(Efl_Ui_Widget_Data *pd, 
Efl_Ui_Property_Bound *prop)
    if (!pd->properties.model) return ;
 
    value = efl_model_property_get(pd->properties.model, prop->property);
-   target = prop->part ? efl_part(pd->obj, prop->part) : pd->obj;
+   target = prop->part ? efl_part(obj, prop->part) : obj;
 
    fprintf(stderr, "setting: %s for %s from %s\n",
            eina_value_to_string(value), prop->property, 
efl_debug_name_get(pd->properties.model));
@@ -5820,22 +5818,22 @@ _efl_ui_property_bind_get(Efl_Ui_Widget_Data *pd, 
Efl_Ui_Property_Bound *prop)
    if (prop->f) eina_future_cancel(prop->f);
    f = efl_model_property_set(pd->properties.model, prop->property,
                               eina_value_error_new(err));
-   prop->f = efl_future_then(pd->obj, f, .free = _efl_ui_property_bind_clean, 
.data = prop);
+   prop->f = efl_future_then(obj, f, .free = _efl_ui_property_bind_clean, 
.data = prop);
 }
 
 static void
-_efl_ui_property_bind_set(Efl_Ui_Widget_Data *pd, Efl_Ui_Property_Bound *prop)
+_efl_ui_property_bind_set(Eo *obj, Efl_Ui_Widget_Data *pd, 
Efl_Ui_Property_Bound *prop)
 {
    Eina_Value value;
    Eina_Future *f;
    Eo *target;
 
-   target = prop->part ? efl_part(pd->obj, prop->part) : pd->obj;
+   target = prop->part ? efl_part(obj, prop->part) : obj;
    value = efl_property_reflection_get(target, prop->key);
 
    if (prop->f) eina_future_cancel(prop->f);
    f = efl_model_property_set(pd->properties.model, prop->property, 
eina_value_dup(&value));
-   prop->f = efl_future_then(pd->obj, f, .free = _efl_ui_property_bind_clean, 
.data = prop);
+   prop->f = efl_future_then(obj, f, .free = _efl_ui_property_bind_clean, 
.data = prop);
    eina_value_flush(&value);
 }
 
@@ -5843,7 +5841,7 @@ static void
 _efl_ui_model_property_bind_changed(void *data, const Efl_Event *event)
 {
    Efl_Model_Property_Event *evt = event->info;
-   Efl_Ui_Widget_Data *pd = data;
+   ELM_WIDGET_DATA_GET(data, pd);
    Eina_Array_Iterator it;
    const char *prop;
    unsigned int i;
@@ -5853,7 +5851,7 @@ _efl_ui_model_property_bind_changed(void *data, const 
Efl_Event *event)
         Efl_Ui_Property_Bound *lookup;
 
         lookup = eina_hash_find(pd->properties.model_lookup, prop);
-        if (lookup) _efl_ui_property_bind_get(pd, lookup);
+        if (lookup) _efl_ui_property_bind_get(data, pd, lookup);
      }
 }
 
@@ -5861,7 +5859,7 @@ static void
 _efl_ui_view_property_bind_changed(void *data, const Efl_Event *event)
 {
    Efl_Ui_Property_Event *evt = event->info;
-   Efl_Ui_Widget_Data *pd = data;
+   ELM_WIDGET_DATA_GET(data, pd);
    Eina_Array_Iterator it;
    Eina_Stringshare *prop;
    unsigned int i;
@@ -5871,19 +5869,19 @@ _efl_ui_view_property_bind_changed(void *data, const 
Efl_Event *event)
         Efl_Ui_Property_Bound *lookup;
 
         lookup = eina_hash_find(pd->properties.view_lookup, prop);
-        if (lookup) _efl_ui_property_bind_set(pd, lookup);
+        if (lookup) _efl_ui_property_bind_set(data, pd, lookup);
      }
 }
 
 static void
-_efl_ui_widget_model_update(Efl_Ui_Widget_Data *pd)
+_efl_ui_widget_model_update(Eo *obj, Efl_Ui_Widget_Data *pd)
 {
    Efl_Ui_Property_Bound *property;
    Eina_Iterator *it;
 
    it = eina_hash_iterator_data_new(pd->properties.model_lookup);
    EINA_ITERATOR_FOREACH(it, property)
-     _efl_ui_property_bind_get(pd, property);
+     _efl_ui_property_bind_get(obj, pd, property);
    eina_iterator_free(it);
 }
 
@@ -5897,23 +5895,23 @@ 
EFL_CALLBACKS_ARRAY_DEFINE(efl_ui_widget_model_provider_callbacks,
 static void
 _efl_ui_widget_model_provider_model_change(void *data, const Efl_Event *event)
 {
-   Efl_Ui_Widget_Data *pd = data;
+   ELM_WIDGET_DATA_GET(data, pd);
 
    efl_replace(&pd->properties.model,
                efl_ui_view_model_get(pd->properties.provider));
-   _efl_ui_widget_model_update(pd);
+   _efl_ui_widget_model_update(data, pd);
 
-   efl_event_callback_call(pd->obj, EFL_UI_VIEW_EVENT_MODEL_CHANGED, 
event->info);
+   efl_event_callback_call(data, EFL_UI_VIEW_EVENT_MODEL_CHANGED, event->info);
 }
 
 static void
 _efl_ui_widget_model_provider_invalidate(void *data, const Efl_Event *event 
EINA_UNUSED)
 {
-   Efl_Ui_Widget_Data *pd = data;
+   ELM_WIDGET_DATA_GET(data, pd);
 
    efl_event_callback_array_del(pd->properties.provider,
                                 efl_ui_widget_model_provider_callbacks(),
-                                pd);
+                                data);
    efl_replace(&pd->properties.provider, NULL);
    efl_replace(&pd->properties.model, NULL);
 }
@@ -5932,7 +5930,7 @@ _efl_ui_widget_model_register(Eo *obj, Efl_Ui_Widget_Data 
*pd)
         if (!pd->properties.provider) return ;
         efl_event_callback_array_add(pd->properties.provider,
                                      efl_ui_widget_model_provider_callbacks(),
-                                     pd);
+                                     obj);
 
         efl_replace(&pd->properties.model,
                     efl_ui_view_model_get(pd->properties.provider));
@@ -5948,9 +5946,9 @@ _efl_ui_widget_model_register(Eo *obj, Efl_Ui_Widget_Data 
*pd)
    if (!pd->properties.model_lookup) return ;
 
    efl_event_callback_add(pd->properties.model, 
EFL_MODEL_EVENT_PROPERTIES_CHANGED,
-                          _efl_ui_model_property_bind_changed, pd);
+                          _efl_ui_model_property_bind_changed, obj);
    efl_event_callback_add(obj, EFL_UI_PROPERTY_BIND_EVENT_PROPERTIES_CHANGED,
-                          _efl_ui_view_property_bind_changed, pd);
+                          _efl_ui_view_property_bind_changed, obj);
    pd->properties.registered = EINA_TRUE;
 }
 
@@ -5961,15 +5959,15 @@ _efl_ui_widget_model_unregister(Eo *obj, 
Efl_Ui_Widget_Data *pd)
      {
         // Remove any existing handler that might exist for any reason
         efl_event_callback_del(pd->properties.model, 
EFL_MODEL_EVENT_PROPERTIES_CHANGED,
-                               _efl_ui_model_property_bind_changed, pd);
+                               _efl_ui_model_property_bind_changed, obj);
         efl_event_callback_del(obj, 
EFL_UI_PROPERTY_BIND_EVENT_PROPERTIES_CHANGED,
-                               _efl_ui_view_property_bind_changed, pd);
+                               _efl_ui_view_property_bind_changed, obj);
 
         pd->properties.registered = EINA_FALSE;
      }
    // Invalidate must be called before setting a new model and even if no 
model is registered
    if (pd->properties.provider)
-     _efl_ui_widget_model_provider_invalidate(pd, NULL);
+     _efl_ui_widget_model_provider_invalidate(obj, NULL);
 }
 
 static Eina_Error
@@ -6001,7 +5999,7 @@ _efl_ui_property_bind(Eo *widget, Eo *target, 
Efl_Ui_Widget_Data *pd,
    eina_hash_direct_add(pd->properties.model_lookup, prop->property, prop);
    eina_hash_direct_add(pd->properties.view_lookup, prop->key, prop);
 
-   _efl_ui_property_bind_get(pd, prop);
+   _efl_ui_property_bind_get(widget, pd, prop);
 
    efl_event_callback_call(widget, EFL_UI_PROPERTY_BIND_EVENT_PROPERTY_BOUND, 
(void*) prop->key);
    // In case of part, we emit it also on the part so that the part too can 
act on it
@@ -6040,7 +6038,7 @@ _efl_ui_widget_efl_ui_view_model_set(Eo *obj,
    if (ev.current == pd->properties.model)
      efl_event_callback_call(obj, EFL_UI_VIEW_EVENT_MODEL_CHANGED, &ev);
 
-   if (pd->properties.model) _efl_ui_widget_model_update(pd);
+   if (pd->properties.model) _efl_ui_widget_model_update(obj, pd);
 
    efl_unref(ev.current);
    efl_unref(ev.previous);
diff --git a/src/lib/elementary/elm_map.c b/src/lib/elementary/elm_map.c
index 995197ba7a..49ac3a2f28 100644
--- a/src/lib/elementary/elm_map.c
+++ b/src/lib/elementary/elm_map.c
@@ -3192,18 +3192,18 @@ _name_list_cb(void *data,
         sd->src_name->name_list_parse_cb(name_list);
         INF("Name List request success address");
         if (name_list->cb)
-          name_list->cb(name_list->data, wd->obj,
+          name_list->cb(name_list->data, sd->obj,
                         name_list->names);
         efl_event_callback_legacy_call
-          (wd->obj, ELM_MAP_EVENT_NAME_LOADED, NULL);
+          (sd->obj, ELM_MAP_EVENT_NAME_LOADED, NULL);
      }
    else
      {
         ERR("Name List request failed: %d", status);
         if (name_list->cb)
-          name_list->cb(name_list->data, wd->obj, NULL);
+          name_list->cb(name_list->data, sd->obj, NULL);
         efl_event_callback_legacy_call
-          (wd->obj, ELM_MAP_EVENT_NAME_LOADED_FAIL, NULL);
+          (sd->obj, ELM_MAP_EVENT_NAME_LOADED_FAIL, NULL);
      }
 
    edje_object_signal_emit(wd->resize_obj,
@@ -3306,7 +3306,7 @@ _name_list_request(const Evas_Object *obj,
 
    fname = _prepare_download();
    url = sd->src_name->url_cb
-   (wd->obj, method, address, lon, lat);
+   (obj, method, address, lon, lat);
    if (!url)
      {
         ERR("Name URL is NULL");
@@ -3335,7 +3335,7 @@ _name_list_request(const Evas_Object *obj,
    free(fname);
 
    efl_event_callback_legacy_call
-     (wd->obj, ELM_MAP_EVENT_NAME_LOAD, name_list->names);
+     ((Eo*)obj, ELM_MAP_EVENT_NAME_LOAD, name_list->names);
    edje_object_signal_emit(wd->resize_obj,
                            "elm,state,busy,start", "elm");
    return name_list->names;
diff --git a/src/lib/elementary/elm_menu.c b/src/lib/elementary/elm_menu.c
index 551b9830b3..7da2e551bd 100644
--- a/src/lib/elementary/elm_menu.c
+++ b/src/lib/elementary/elm_menu.c
@@ -395,7 +395,7 @@ _parent_del_cb(void *data,
    ELM_WIDGET_DATA_GET_OR_RETURN(data, wd);
 
    evas_object_event_callback_del_full
-     (obj, EVAS_CALLBACK_RESIZE, _parent_resize_cb, wd->obj);
+     (obj, EVAS_CALLBACK_RESIZE, _parent_resize_cb, data);
    sd->parent = NULL;
 }
 
diff --git a/src/lib/elementary/elm_prefs.c b/src/lib/elementary/elm_prefs.c
index 32e684edc2..e1b1074d19 100644
--- a/src/lib/elementary/elm_prefs.c
+++ b/src/lib/elementary/elm_prefs.c
@@ -139,7 +139,7 @@ _elm_prefs_save(void *data)
         elm_prefs_data_save(sd->prefs_data, NULL, NULL);
 
         efl_event_callback_legacy_call
-          (wd->obj, ELM_PREFS_EVENT_PAGE_SAVED, (char *)sd->root->name);
+          (data, ELM_PREFS_EVENT_PAGE_SAVED, (char *)sd->root->name);
      }
 
    sd->dirty = EINA_FALSE;
@@ -303,7 +303,7 @@ _elm_prefs_item_changed_report(Eo *obj,
    snprintf(buf, sizeof(buf), "%s:%s", it->page->name, it->name);
 
    efl_event_callback_legacy_call
-     (wd->obj, ELM_PREFS_EVENT_ITEM_CHANGED, buf);
+     (obj, ELM_PREFS_EVENT_ITEM_CHANGED, buf);
 }
 
 static Elm_Prefs_Item_Node *
@@ -403,7 +403,7 @@ _prefs_data_autosaved_cb(void *cb_data,
    ELM_WIDGET_DATA_GET_OR_RETURN(cb_data, wd);
 
    efl_event_callback_legacy_call
-     (wd->obj, ELM_PREFS_EVENT_PAGE_SAVED, event_info);
+     (cb_data, ELM_PREFS_EVENT_PAGE_SAVED, event_info);
 
    sd->dirty = EINA_FALSE;
 }
@@ -533,7 +533,7 @@ _item_changed_cb(Evas_Object *it_obj)
    if (it->type == ELM_PREFS_TYPE_ACTION)
      {
         efl_event_callback_legacy_call
-          (wd->obj, ELM_PREFS_EVENT_ACTION, buf);
+          (it->prefs, ELM_PREFS_EVENT_ACTION, buf);
 
         return;
      }
diff --git a/src/lib/elementary/elm_widget.h b/src/lib/elementary/elm_widget.h
index 7a95d0b03b..6350c882bf 100644
--- a/src/lib/elementary/elm_widget.h
+++ b/src/lib/elementary/elm_widget.h
@@ -321,7 +321,6 @@ typedef void (*Elm_Access_On_Highlight_Cb)(void *data);
  */
 typedef struct _Elm_Widget_Smart_Data
 {
-   Evas_Object                  *obj; /**< object pointer for this widget 
smart data */
    Evas_Object                  *parent_obj; /**< parent object of a widget in 
the elementary tree */
    Eina_List                    *subobjs; /**< list of widgets' sub objects in 
the elementary tree */
    Evas_Object                  *resize_obj; /**< an unique object for each 
widget that shows the look of a widget. Resize object's geometry is same as the 
widget. This resize object is different from that of window's resize object. */

-- 


Reply via email to