tasn pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=acc158a2bfb2f1f1edc587386d7f0ac5ed456e20
commit acc158a2bfb2f1f1edc587386d7f0ac5ed456e20 Author: Tom Hacohen <t...@stosb.com> Date: Wed Aug 26 10:47:06 2015 +0100 Revert "Revert "Eo base: Change parent_set to be an assignment of ref."" Had to revert it until I pushed the changes to elm, which I had issues with. Now the patch can safely go back in. This reverts commit 37abea3831f62ac612b377bb48ce6c90e076dd25. --- src/lib/eo/eo.c | 6 +++--- src/lib/eo/eo_base_class.c | 8 ++++++-- src/tests/eo/suite/eo_test_general.c | 23 +++++++++++++++++++++++ 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/lib/eo/eo.c b/src/lib/eo/eo.c index b5e24a9..4cd992d 100644 --- a/src/lib/eo/eo.c +++ b/src/lib/eo/eo.c @@ -917,13 +917,13 @@ _eo_add_internal_start(const char *file, int line, const Eo_Class *klass_id, Eo eo_do(eo_id, eo_parent_set(parent_id)); - /* If there's a parent. Unref. Eo_add should return an object with either a + /* If there's a parent. Ref. Eo_add should return an object with either a * parent ref, or with the lack of, just a ref. */ { Eo *parent_tmp; - if (!ref && eo_do_ret(eo_id, parent_tmp, eo_parent_get())) + if (ref && eo_do_ret(eo_id, parent_tmp, eo_parent_get())) { - _eo_unref(obj); + _eo_ref(obj); } } diff --git a/src/lib/eo/eo_base_class.c b/src/lib/eo/eo_base_class.c index 0c5f3ef..bbdf426 100644 --- a/src/lib/eo/eo_base_class.c +++ b/src/lib/eo/eo_base_class.c @@ -124,7 +124,12 @@ _eo_base_parent_set(Eo *obj, Eo_Base_Data *pd, Eo *parent_id) ERR("CONTACT DEVS!!! SHOULD NEVER HAPPEN!!! Old parent %p for object %p is not a valid Eo object.", pd->parent, obj); } - eo_unref(obj); + + /* Only unref if we don't have a new parent instead. */ + if (!parent_id) + { + eo_unref(obj); + } } /* Set new parent */ @@ -138,7 +143,6 @@ _eo_base_parent_set(Eo *obj, Eo_Base_Data *pd, Eo *parent_id) pd->parent = parent_id; parent_pd->children = eina_list_append(parent_pd->children, obj); pd->parent_list = eina_list_last(parent_pd->children); - eo_ref(obj); } else { diff --git a/src/tests/eo/suite/eo_test_general.c b/src/tests/eo/suite/eo_test_general.c index 47064cf..9121f8f 100644 --- a/src/tests/eo/suite/eo_test_general.c +++ b/src/tests/eo/suite/eo_test_general.c @@ -464,6 +464,29 @@ START_TEST(eo_refs) ck_assert_int_eq(eo_ref_get(obj2), 1); ck_assert_int_eq(eo_ref_get(obj3), 2); + /* Setting and removing parents. */ + obj = eo_add(SIMPLE_CLASS, NULL); + obj2 = eo_ref(eo_add(SIMPLE_CLASS, obj)); + obj3 = eo_ref(eo_add(SIMPLE_CLASS, NULL)); + + eo_do(obj2, eo_parent_set(obj3)); + eo_do(obj3, eo_parent_set(obj)); + ck_assert_int_eq(eo_ref_get(obj2), 2); + ck_assert_int_eq(eo_ref_get(obj3), 2); + + eo_do(obj2, eo_parent_set(NULL)); + eo_do(obj3, eo_parent_set(NULL)); + ck_assert_int_eq(eo_ref_get(obj2), 1); + ck_assert_int_eq(eo_ref_get(obj3), 1); + + eo_do(obj2, eo_parent_set(obj)); + eo_do(obj3, eo_parent_set(obj)); + ck_assert_int_eq(eo_ref_get(obj2), 1); + ck_assert_int_eq(eo_ref_get(obj3), 1); + + eo_del(obj); + eo_del(obj2); + eo_del(obj3); /* Just check it doesn't seg atm. */ obj = eo_add(SIMPLE_CLASS, NULL); --