summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJérémy Zurcher <jeremy@asynk.ch>2013-06-12 12:11:12 +0200
committerJérémy Zurcher <jeremy@asynk.ch>2013-06-14 11:13:09 +0200
commit49920b77d0119b675f79c90abc5a662315c90a92 (patch)
tree10b5d0d7aef8c961bae622e9b45f6a466bdc9b56
parentbbb1ae49e06986d6f5b5933383e5d99c4b8a3d1d (diff)
downloadefl-49920b77d0119b675f79c90abc5a662315c90a92.tar.gz
eo: pack extensions add the end of _Eo_Class
1 calloc call less, better mem packing
-rw-r--r--src/lib/eo/eo.c41
1 files changed, 23 insertions, 18 deletions
diff --git a/src/lib/eo/eo.c b/src/lib/eo/eo.c
index de13b86e43..eb87f038d3 100644
--- a/src/lib/eo/eo.c
+++ b/src/lib/eo/eo.c
@@ -125,6 +125,7 @@ struct _Eo_Class
unsigned int data_offset; /* < Offset of the data within object data. */
Eina_Bool constructed : 1;
+ /* [extensions*] + NULL */
};
static inline void
@@ -793,8 +794,6 @@ eo_class_free(_Eo_Class *klass)
_dich_func_clean_all(klass);
}
- free(klass->extensions);
-
if (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;
va_list p_list;
+ size_t extn_sz;
+ Eina_List *extn_list;
_Eo_Class *parent = _eo_class_pointer_get(parent_id);
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;
}
- va_start(p_list, parent_id);
-
EINA_SAFETY_ON_NULL_RETURN_VAL(desc, NULL);
EINA_SAFETY_ON_NULL_RETURN_VAL(desc->name, NULL);
@@ -886,15 +885,13 @@ eo_class_new(const Eo_Class_Description *desc, const Eo_Class *parent_id, ...)
EINA_SAFETY_ON_FALSE_RETURN_VAL(!desc->data_size, NULL);
}
- klass = calloc(1, _eo_class_sz);
- klass->parent = parent;
-
- /* Handle class extensions */
+ /* Build class extensions list */
{
- Eina_List *extn_list = NULL;
- const Eo_Class_Id *extn_id = NULL;
+ extn_list = 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 *);
while (extn_id)
@@ -913,18 +910,28 @@ eo_class_new(const Eo_Class_Description *desc, const Eo_Class *parent_id, ...)
extn_id = va_arg(p_list, Eo_Class_Id *);
}
- klass->extensions = calloc(_eo_class_sz,
- eina_list_count(extn_list) + 1);
+ va_end(p_list);
+
+ extn_sz = sizeof(_Eo_Class *) * (eina_list_count(extn_list) + 1);
+ }
- extn_itr = klass->extensions;
+ 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)
{
*(extn_itr++) = extn;
+
+ DBG("Added '%s' extension", extn->desc->name);
}
}
- klass->desc = desc;
-
/* Handle the inheritance */
if (klass->parent)
{
@@ -1077,8 +1084,6 @@ eo_class_new(const Eo_Class_Description *desc, const Eo_Class *parent_id, ...)
desc->name, klass->obj_size);
}
- va_end(p_list);
-
return _eo_class_id_get(klass);
cleanup: