eo_class_new: remove duplicates in extensions as well as in mro
authorJérémy Zurcher <jeremy@asynk.ch>
Mon, 17 Jun 2013 21:38:04 +0000 (23:38 +0200)
committerJérémy Zurcher <jeremy@asynk.ch>
Mon, 17 Jun 2013 21:38:04 +0000 (23:38 +0200)
src/lib/eo/eo.c

index b98ffab..08dde48 100644 (file)
@@ -612,6 +612,34 @@ _eo_class_mro_has(const _Eo_Class *klass, const _Eo_Class *find)
 #endif
 
 static Eina_List *
+_eo_class_list_remove_duplicates(Eina_List* list)
+{
+   Eina_List *itr1, *itr2, *itr2n;
+
+   itr1 = eina_list_last(list);
+   while (itr1)
+     {
+        itr2 = eina_list_prev(itr1);
+
+        while (itr2)
+          {
+             itr2n = eina_list_prev(itr2);
+
+             if (eina_list_data_get(itr1) == eina_list_data_get(itr2))
+               {
+                  list = eina_list_remove_list(list, itr2);
+               }
+
+             itr2 = itr2n;
+          }
+
+        itr1 = eina_list_prev(itr1);
+     }
+
+   return list;
+}
+
+static Eina_List *
 _eo_class_mro_add(Eina_List *mro, const _Eo_Class *klass)
 {
    Eina_List *extn_pos = NULL;
@@ -689,30 +717,7 @@ _eo_class_mro_init(_Eo_Class *klass)
    if (!mro)
       return EINA_FALSE;
 
-   /* Remove duplicates and make them the right order. */
-     {
-        Eina_List *itr1, *itr2, *itr2n;
-
-        itr1 = eina_list_last(mro);
-        while (itr1)
-          {
-             itr2 = eina_list_prev(itr1);
-
-             while (itr2)
-               {
-                  itr2n = eina_list_prev(itr2);
-
-                  if (eina_list_data_get(itr1) == eina_list_data_get(itr2))
-                    {
-                       mro = eina_list_remove_list(mro, itr2);
-                    }
-
-                  itr2 = itr2n;
-               }
-
-             itr1 = eina_list_prev(itr1);
-          }
-     }
+   mro = _eo_class_list_remove_duplicates(mro);
 
    /* Copy the mro and free the list. */
      {
@@ -913,6 +918,8 @@ eo_class_new(const Eo_Class_Description *desc, const Eo_Class *parent_id, ...)
 
         va_end(p_list);
 
+        extn_list = _eo_class_list_remove_duplicates(extn_list);
+
         extn_sz = sizeof(_Eo_Class *) * (eina_list_count(extn_list) + 1);
 
         DBG("Finished building extensions list for class '%s'", desc->name);