Eo: Made composite objects more robust.
authortasn <tasn>
Thu, 7 Jun 2012 10:54:15 +0000 (10:54 +0000)
committertasn <tasn@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Thu, 7 Jun 2012 10:54:15 +0000 (10:54 +0000)
Mark on the object itself if it's composited -> faster.
Remove from composite list if reparented.

git-svn-id: http://svn.enlightenment.org/svn/e/trunk/PROTO/eobj@71794 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

lib/eo.c
tests/eo_test_general.c

index 5aea4b8..03111ed 100644 (file)
--- a/lib/eo.c
+++ b/lib/eo.c
@@ -45,6 +45,7 @@ struct _Eo {
 
      Eo_Kls_Itr mro_itr;
 
+     Eina_Bool composite:1;
      Eina_Bool del:1;
      Eina_Bool construct_error:1;
      Eina_Bool manual_free:1;
@@ -1074,6 +1075,11 @@ eo_parent_set(Eo *obj, const Eo *parent)
 
    _eo_ref(obj);
 
+   if (eo_composite_is(obj))
+     {
+        eo_composite_object_detach(obj->parent, obj);
+     }
+
    if (obj->parent)
      {
         obj->parent->children =
@@ -1534,7 +1540,8 @@ eo_composite_object_attach(Eo *obj, Eo *emb_obj)
    EO_MAGIC_RETURN(obj, EO_EINA_MAGIC);
    EO_MAGIC_RETURN(emb_obj, EO_EINA_MAGIC);
 
-   eo_xref(emb_obj, obj);
+   emb_obj->composite = EINA_TRUE;
+   eo_parent_set(emb_obj, obj);
    obj->composite_objects = eina_list_prepend(obj->composite_objects, emb_obj);
 }
 
@@ -1544,8 +1551,9 @@ eo_composite_object_detach(Eo *obj, Eo *emb_obj)
    EO_MAGIC_RETURN(obj, EO_EINA_MAGIC);
    EO_MAGIC_RETURN(emb_obj, EO_EINA_MAGIC);
 
+   emb_obj->composite = EINA_FALSE;
    obj->composite_objects = eina_list_remove(obj->composite_objects, emb_obj);
-   eo_xunref(emb_obj, obj);
+   eo_parent_set(emb_obj, NULL);
 }
 
 EAPI Eina_Bool
@@ -1557,20 +1565,7 @@ eo_composite_is(const Eo *emb_obj)
         return EINA_FALSE;
      }
 
-   Eo *obj = eo_parent_get(emb_obj);
-   Eina_List *itr;
-   Eo *tmp;
-
-   if (!obj)
-      return EINA_FALSE;
-
-   EINA_LIST_FOREACH(obj->composite_objects, itr, tmp)
-     {
-        if (tmp == emb_obj)
-           return EINA_TRUE;
-     }
-
-   return EINA_FALSE;
+   return emb_obj->composite;
 }
 
 EAPI void
index f9311e0..e1d5bfa 100644 (file)
@@ -59,6 +59,26 @@ START_TEST(eo_data_fetch)
 }
 END_TEST
 
+START_TEST(eo_composite_tests)
+{
+   eo_init();
+
+   Eo *obj = eo_add(SIMPLE_CLASS, NULL);
+   fail_if(!obj);
+   Eo *obj2 = eo_add(SIMPLE_CLASS, NULL);
+   fail_if(!obj2);
+
+   eo_composite_object_attach(obj, obj2);
+   eo_parent_set(obj2, NULL);
+   fail_if(eo_composite_is(obj2));
+
+   eo_unref(obj2);
+   eo_unref(obj);
+
+   eo_shutdown();
+}
+END_TEST
+
 START_TEST(eo_static_classes)
 {
    eo_init();
@@ -516,4 +536,5 @@ void eo_test_general(TCase *tc)
    tcase_add_test(tc, eo_data_fetch);
    tcase_add_test(tc, eo_man_free);
    tcase_add_test(tc, eo_static_classes);
+   tcase_add_test(tc, eo_composite_tests);
 }