Eo: Added an internal _eo_data_get implementation.

We don't need to do all the regular checks when called from our code.

SVN revision: 70796
This commit is contained in:
Tom Hacohen 2012-05-06 12:03:21 +00:00
parent 465eb13ce0
commit 3754fd077c
1 changed files with 30 additions and 20 deletions

View File

@ -19,6 +19,7 @@ static void _eo_callback_remove_all(Eo *obj);
static void _eo_constructor(Eo *obj, const Eo_Class *klass); static void _eo_constructor(Eo *obj, const Eo_Class *klass);
static void _eo_destructor(Eo *obj, const Eo_Class *klass); static void _eo_destructor(Eo *obj, const Eo_Class *klass);
static void eo_constructor_error_unset(Eo *obj); static void eo_constructor_error_unset(Eo *obj);
static inline void *_eo_data_get(const Eo *obj, const Eo_Class *klass);
typedef struct _Eo_Callback_Description Eo_Callback_Description; typedef struct _Eo_Callback_Description Eo_Callback_Description;
@ -342,7 +343,7 @@ _eo_op_internal(Eo *obj, Eina_Bool constant, Eo_Op op, va_list *p_list)
if (func) if (func)
{ {
func(obj, eo_data_get(obj, klass), p_list); func(obj, _eo_data_get(obj, klass), p_list);
ret = EINA_TRUE; ret = EINA_TRUE;
goto end; goto end;
} }
@ -1138,7 +1139,7 @@ _eo_constructor(Eo *obj, const Eo_Class *klass)
return; return;
if (klass->desc->constructor) if (klass->desc->constructor)
klass->desc->constructor(obj, eo_data_get(obj, klass)); klass->desc->constructor(obj, _eo_data_get(obj, klass));
else else
_eo_constructor_default(obj); _eo_constructor_default(obj);
} }
@ -1150,7 +1151,7 @@ _eo_destructor(Eo *obj, const Eo_Class *klass)
return; return;
if (klass->desc->destructor) if (klass->desc->destructor)
klass->desc->destructor(obj, eo_data_get(obj, klass)); klass->desc->destructor(obj, _eo_data_get(obj, klass));
else else
_eo_destructor_default(obj); _eo_destructor_default(obj);
} }
@ -1171,18 +1172,9 @@ eo_destructor_super(Eo *obj)
_eo_destructor(obj, _eo_kls_itr_next(obj, EO_NOOP)); _eo_destructor(obj, _eo_kls_itr_next(obj, EO_NOOP));
} }
EAPI void * static inline void *
eo_data_get(const Eo *obj, const Eo_Class *klass) _eo_data_get(const Eo *obj, const Eo_Class *klass)
{ {
EO_MAGIC_RETURN_VAL(obj, EO_EINA_MAGIC, NULL);
#ifndef NDEBUG
if (!_eo_class_mro_has(obj->klass, klass))
{
ERR("Tried getting data of class '%s' from object of class '%s', but the former is not a direct inheritance of the latter.", klass->desc->name, obj->klass->desc->name);
return NULL;
}
#endif
if (EINA_LIKELY(klass->desc->data_size > 0)) if (EINA_LIKELY(klass->desc->data_size > 0))
{ {
if (EINA_UNLIKELY(klass->desc->type == EO_CLASS_TYPE_MIXIN)) if (EINA_UNLIKELY(klass->desc->type == EO_CLASS_TYPE_MIXIN))
@ -1207,16 +1199,34 @@ eo_data_get(const Eo *obj, const Eo_Class *klass)
klass->data_offset; klass->data_offset;
} }
} }
else
{
/* FIXME: Enable this to only work when called from the outside.
ERR("Tried getting data of class '%s', but it has none..", klass->desc->name);
*/
}
return NULL; return NULL;
} }
EAPI void *
eo_data_get(const Eo *obj, const Eo_Class *klass)
{
void *ret;
EO_MAGIC_RETURN_VAL(obj, EO_EINA_MAGIC, NULL);
#ifndef NDEBUG
if (!_eo_class_mro_has(obj->klass, klass))
{
ERR("Tried getting data of class '%s' from object of class '%s', but the former is not a direct inheritance of the latter.", klass->desc->name, obj->klass->desc->name);
return NULL;
}
#endif
ret = _eo_data_get(obj, klass);
if (!ret && (klass->desc->data_size == 0))
{
ERR("Tried getting data of class '%s', but it has none..", klass->desc->name);
}
return ret;
}
EAPI Eina_Bool EAPI Eina_Bool
eo_init(void) eo_init(void)
{ {