forked from enlightenment/efl
eo_class_new: pack extensions at the end of _Eo_Class
This commit is contained in:
parent
0c4c7ecd3a
commit
2f79056078
|
@ -125,6 +125,7 @@ struct _Eo_Class
|
||||||
unsigned int data_offset; /* < Offset of the data within object data. */
|
unsigned int data_offset; /* < Offset of the data within object data. */
|
||||||
|
|
||||||
Eina_Bool constructed : 1;
|
Eina_Bool constructed : 1;
|
||||||
|
/* [extensions*] + NULL */
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
@ -793,8 +794,6 @@ eo_class_free(_Eo_Class *klass)
|
||||||
_dich_func_clean_all(klass);
|
_dich_func_clean_all(klass);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(klass->extensions);
|
|
||||||
|
|
||||||
if (klass->mro)
|
if (klass->mro)
|
||||||
free(klass->mro);
|
free(klass->mro);
|
||||||
|
|
||||||
|
@ -867,6 +866,8 @@ eo_class_new(const Eo_Class_Description *desc, const Eo_Class *parent_id, ...)
|
||||||
{
|
{
|
||||||
_Eo_Class *klass;
|
_Eo_Class *klass;
|
||||||
va_list p_list;
|
va_list p_list;
|
||||||
|
size_t extn_sz;
|
||||||
|
Eina_List *extn_list;
|
||||||
|
|
||||||
_Eo_Class *parent = _eo_class_pointer_get(parent_id);
|
_Eo_Class *parent = _eo_class_pointer_get(parent_id);
|
||||||
if (parent && !EINA_MAGIC_CHECK(parent, EO_CLASS_EINA_MAGIC))
|
if (parent && !EINA_MAGIC_CHECK(parent, EO_CLASS_EINA_MAGIC))
|
||||||
|
@ -875,8 +876,6 @@ eo_class_new(const Eo_Class_Description *desc, const Eo_Class *parent_id, ...)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
va_start(p_list, parent_id);
|
|
||||||
|
|
||||||
EINA_SAFETY_ON_NULL_RETURN_VAL(desc, NULL);
|
EINA_SAFETY_ON_NULL_RETURN_VAL(desc, NULL);
|
||||||
EINA_SAFETY_ON_NULL_RETURN_VAL(desc->name, NULL);
|
EINA_SAFETY_ON_NULL_RETURN_VAL(desc->name, NULL);
|
||||||
|
|
||||||
|
@ -886,15 +885,14 @@ eo_class_new(const Eo_Class_Description *desc, const Eo_Class *parent_id, ...)
|
||||||
EINA_SAFETY_ON_FALSE_RETURN_VAL(!desc->data_size, NULL);
|
EINA_SAFETY_ON_FALSE_RETURN_VAL(!desc->data_size, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
klass = calloc(1, _eo_class_sz);
|
/* Build class extensions list */
|
||||||
klass->parent = parent;
|
|
||||||
|
|
||||||
/* Handle class extensions */
|
|
||||||
{
|
{
|
||||||
Eina_List *extn_list = NULL;
|
DBG("Started building extensions list for class '%s'", desc->name);
|
||||||
const Eo_Class_Id *extn_id = NULL;
|
extn_list = NULL;
|
||||||
const _Eo_Class *extn = NULL;
|
const _Eo_Class *extn = NULL;
|
||||||
const _Eo_Class **extn_itr = NULL;
|
const Eo_Class_Id *extn_id = NULL;
|
||||||
|
|
||||||
|
va_start(p_list, parent_id);
|
||||||
|
|
||||||
extn_id = va_arg(p_list, Eo_Class_Id *);
|
extn_id = va_arg(p_list, Eo_Class_Id *);
|
||||||
while (extn_id)
|
while (extn_id)
|
||||||
|
@ -913,17 +911,30 @@ eo_class_new(const Eo_Class_Description *desc, const Eo_Class *parent_id, ...)
|
||||||
extn_id = va_arg(p_list, Eo_Class_Id *);
|
extn_id = va_arg(p_list, Eo_Class_Id *);
|
||||||
}
|
}
|
||||||
|
|
||||||
klass->extensions = calloc(_eo_class_sz,
|
va_end(p_list);
|
||||||
eina_list_count(extn_list) + 1);
|
|
||||||
|
|
||||||
extn_itr = klass->extensions;
|
extn_sz = sizeof(_Eo_Class *) * (eina_list_count(extn_list) + 1);
|
||||||
|
|
||||||
|
DBG("Finished building extensions list for class '%s'", desc->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
klass = calloc(1, _eo_class_sz + extn_sz);
|
||||||
|
klass->parent = parent;
|
||||||
|
klass->desc = desc;
|
||||||
|
klass->extensions = (const _Eo_Class **) ((char *) klass + _eo_class_sz);
|
||||||
|
|
||||||
|
/* Copy the extensions and free the list */
|
||||||
|
{
|
||||||
|
const _Eo_Class *extn = NULL;
|
||||||
|
const _Eo_Class **extn_itr = klass->extensions;
|
||||||
EINA_LIST_FREE(extn_list, extn)
|
EINA_LIST_FREE(extn_list, extn)
|
||||||
{
|
{
|
||||||
*(extn_itr++) = extn;
|
*(extn_itr++) = extn;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
klass->desc = desc;
|
DBG("Added '%s' extension", extn->desc->name);
|
||||||
|
}
|
||||||
|
*(extn_itr) = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Handle the inheritance */
|
/* Handle the inheritance */
|
||||||
if (klass->parent)
|
if (klass->parent)
|
||||||
|
@ -1077,8 +1088,6 @@ eo_class_new(const Eo_Class_Description *desc, const Eo_Class *parent_id, ...)
|
||||||
desc->name, klass->obj_size);
|
desc->name, klass->obj_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
va_end(p_list);
|
|
||||||
|
|
||||||
return _eo_class_id_get(klass);
|
return _eo_class_id_get(klass);
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
|
Loading…
Reference in New Issue