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 37abea3831.
This commit is contained in:
Tom Hacohen 2015-08-26 10:47:06 +01:00
parent 37abea3831
commit acc158a2bf
3 changed files with 32 additions and 5 deletions

View File

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

View File

@ -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
{

View File

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