diff options
author | Jérémy Zurcher <jeremy@asynk.ch> | 2013-06-12 12:11:12 +0200 |
---|---|---|
committer | Jérémy Zurcher <jeremy@asynk.ch> | 2013-06-14 11:13:09 +0200 |
commit | 49920b77d0119b675f79c90abc5a662315c90a92 (patch) | |
tree | 10b5d0d7aef8c961bae622e9b45f6a466bdc9b56 | |
parent | bbb1ae49e06986d6f5b5933383e5d99c4b8a3d1d (diff) | |
download | efl-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.c | 41 |
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: |