summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJérémy Zurcher <jeremy@asynk.ch>2014-01-09 14:42:17 +0100
committerJérémy Zurcher <jeremy@asynk.ch>2014-01-09 14:42:17 +0100
commit890469314cee7b6a2d9ee2ffa9d69b071e36f371 (patch)
tree28d9db1672dfe4889f9f80526e4b0b9357f2b5d1
parent1db763054cba0bd0ad7349c50cd5cbd84dfc7887 (diff)
downloadefl-890469314cee7b6a2d9ee2ffa9d69b071e36f371.tar.gz
eo2: if _eo2_class_funcs_set() fails eo_class_new() returns NULL
call to _eo2_class_funcs_set() is moved out of _eo_class_constructor() into eo_class_new().
-rw-r--r--src/lib/eo/eo.c30
1 files changed, 18 insertions, 12 deletions
diff --git a/src/lib/eo/eo.c b/src/lib/eo/eo.c
index ff530f78c0..3dee6dfd9e 100644
--- a/src/lib/eo/eo.c
+++ b/src/lib/eo/eo.c
@@ -680,7 +680,7 @@ eo2_api_funcs_cmp(const void *p1, const void *p2)
else return 0;
}
-EAPI void
+EAPI Eina_Bool
_eo2_class_funcs_set(_Eo_Class *klass)
{
int op_id;
@@ -696,7 +696,7 @@ _eo2_class_funcs_set(_Eo_Class *klass)
DBG("Set functions for class '%s':%p", klass->desc->name, klass);
- if (!op_descs) return;
+ if (!op_descs) return EINA_TRUE;
last_api_func = NULL;
for (op_desc = op_descs; op_desc->op_type != EO_OP_TYPE_INVALID; op_desc++)
@@ -738,6 +738,8 @@ _eo2_class_funcs_set(_Eo_Class *klass)
_dich_func_set(klass, op_desc->op, op_desc->func);
last_api_func = op_desc->api_func;
}
+
+ return EINA_TRUE;
}
EAPI Eo *
@@ -1204,9 +1206,6 @@ _eo_class_constructor(_Eo_Class *klass)
klass->constructed = EINA_TRUE;
- if (klass->desc->version == EO2_VERSION)
- _eo2_class_funcs_set(klass);
-
if (klass->desc->class_constructor)
klass->desc->class_constructor(_eo_class_id_get(klass));
}
@@ -1347,13 +1346,7 @@ eo_class_new(const Eo_Class_Description *desc, const Eo_Class *parent_id, ...)
EINA_SAFETY_ON_NULL_RETURN_VAL(desc, NULL);
EINA_SAFETY_ON_NULL_RETURN_VAL(desc->name, NULL);
- if (desc->version == EO2_VERSION)
- {
- // FIXME: eo2
- /* if (!_eo2_class_check_op_descs(desc)) */
- /* return NULL; */
- }
- else
+ if (desc->version != EO2_VERSION)
{
if (!_eo_class_check_op_descs(desc))
return NULL;
@@ -1545,6 +1538,7 @@ eo_class_new(const Eo_Class_Description *desc, const Eo_Class *parent_id, ...)
}
_eo_class_base_op_init(klass);
+
/* Flatten the function array */
{
const _Eo_Class **mro_itr = klass->mro;
@@ -1581,6 +1575,18 @@ eo_class_new(const Eo_Class_Description *desc, const Eo_Class *parent_id, ...)
}
}
+ if (desc->version == EO2_VERSION)
+ {
+ if (!_eo2_class_funcs_set(klass))
+ {
+ eina_spinlock_free(&klass->objects.trash_lock);
+ eina_spinlock_free(&klass->iterators.trash_lock);
+ _dich_func_clean_all(klass);
+ free(klass);
+ return NULL;
+ }
+ }
+
eina_spinlock_take(&_eo_class_creation_lock);
klass->header.id = ++_eo_classes_last_id;
{