diff --git a/legacy/edje/ChangeLog b/legacy/edje/ChangeLog index ee7b62cd66..24e9617696 100644 --- a/legacy/edje/ChangeLog +++ b/legacy/edje/ChangeLog @@ -560,3 +560,8 @@ 2012-08-21 Guilherme Silveira * Fix password timeout with fixed point. + +2012-08-24 Cedric Bail + + * Properly destroy color_class and text_class on an Edje_Object. + diff --git a/legacy/edje/NEWS b/legacy/edje/NEWS index 547ca1bd2e..dddf53d024 100644 --- a/legacy/edje/NEWS +++ b/legacy/edje/NEWS @@ -32,6 +32,7 @@ Fixes: * Reduce potential reentrant issue when using edje_object_signal_emit. * Call edje_object_message_signal_process also on GROUP part Edje object. * Remove memory leak when alias are present in the edj file. + * Properly destroy color_class and text_class on an Edje_Object. Edje 1.2.0 diff --git a/legacy/edje/src/lib/edje_main.c b/legacy/edje/src/lib/edje_main.c index 01b428a147..f9b8eab2a1 100644 --- a/legacy/edje/src/lib/edje_main.c +++ b/legacy/edje/src/lib/edje_main.c @@ -188,16 +188,29 @@ edje_shutdown(void) } /* Private Routines */ -static Eina_Bool -_class_member_free(const Eina_Hash *hash __UNUSED__, - const void *key, - void *data, - void *fdata) +static void +_class_member_free(Eina_Hash *hash, + void (*_edje_class_member_direct_del)(const char *class, void *l)) { - void (*_edje_class_member_direct_del)(const char *class, void *l) = fdata; + const char *color_class; + Eina_Iterator *it; + Eina_List *class_kill = NULL; - _edje_class_member_direct_del(key, data); - return EINA_TRUE; + if (hash) + { + it = eina_hash_iterator_key_new(hash); + EINA_ITERATOR_FOREACH(it, color_class) + class_kill = eina_list_append(class_kill, color_class); + eina_iterator_free(it); + EINA_LIST_FREE(class_kill, color_class) + { + void *l; + + l = eina_hash_find(hash, color_class); + _edje_class_member_direct_del(color_class, l); + } + eina_hash_free(hash); + } } void @@ -254,16 +267,8 @@ _edje_del(Edje *ed) free(cb); } - if (ed->members.text_class) - { - eina_hash_foreach(ed->members.text_class, _class_member_free, _edje_text_class_member_direct_del); - eina_hash_free(ed->members.text_class); - } - if (ed->members.color_class) - { - eina_hash_foreach(ed->members.color_class, _class_member_free, _edje_color_class_member_direct_del); - eina_hash_free(ed->members.color_class); - } + _class_member_free(ed->members.text_class, _edje_text_class_member_direct_del); + _class_member_free(ed->members.color_class, _edje_color_class_member_direct_del); free(ed); }