forked from enlightenment/efl
eo_class_new: remove duplicates in extensions as well as in mro
This commit is contained in:
parent
2f79056078
commit
e0293a421f
|
@ -611,6 +611,34 @@ _eo_class_mro_has(const _Eo_Class *klass, const _Eo_Class *find)
|
||||||
}
|
}
|
||||||
#endif
|
#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 *
|
static Eina_List *
|
||||||
_eo_class_mro_add(Eina_List *mro, const _Eo_Class *klass)
|
_eo_class_mro_add(Eina_List *mro, const _Eo_Class *klass)
|
||||||
{
|
{
|
||||||
|
@ -689,30 +717,7 @@ _eo_class_mro_init(_Eo_Class *klass)
|
||||||
if (!mro)
|
if (!mro)
|
||||||
return EINA_FALSE;
|
return EINA_FALSE;
|
||||||
|
|
||||||
/* Remove duplicates and make them the right order. */
|
mro = _eo_class_list_remove_duplicates(mro);
|
||||||
{
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Copy the mro and free the list. */
|
/* 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);
|
va_end(p_list);
|
||||||
|
|
||||||
|
extn_list = _eo_class_list_remove_duplicates(extn_list);
|
||||||
|
|
||||||
extn_sz = sizeof(_Eo_Class *) * (eina_list_count(extn_list) + 1);
|
extn_sz = sizeof(_Eo_Class *) * (eina_list_count(extn_list) + 1);
|
||||||
|
|
||||||
DBG("Finished building extensions list for class '%s'", desc->name);
|
DBG("Finished building extensions list for class '%s'", desc->name);
|
||||||
|
|
Loading…
Reference in New Issue