forked from enlightenment/efl
Eo: eo_do is much faster now.
I simplified the kls-itr code so there'll be less overhead when doing eo_do. SVN revision: 73531
This commit is contained in:
parent
52d23bf084
commit
b018d8cfcf
|
@ -25,7 +25,6 @@ static inline void _eo_unref(Eo *obj);
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
Eo_Op op;
|
|
||||||
const Eo_Class **kls_itr;
|
const Eo_Class **kls_itr;
|
||||||
} Eo_Kls_Itr;
|
} Eo_Kls_Itr;
|
||||||
|
|
||||||
|
@ -238,26 +237,16 @@ _eo_op_id_name_get(Eo_Op op)
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
_eo_kls_itr_init(const Eo_Class *obj_klass, Eo_Kls_Itr *cur, Eo_Op op, Eo_Kls_Itr *prev_state)
|
_eo_kls_itr_init(const Eo_Class *obj_klass, Eo_Kls_Itr *cur, Eo_Kls_Itr *prev_state)
|
||||||
{
|
{
|
||||||
prev_state->op = cur->op;
|
|
||||||
prev_state->kls_itr = cur->kls_itr;
|
prev_state->kls_itr = cur->kls_itr;
|
||||||
|
|
||||||
if (cur->op != op)
|
|
||||||
{
|
|
||||||
cur->op = op;
|
|
||||||
cur->kls_itr = obj_klass->mro;
|
cur->kls_itr = obj_klass->mro;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
_eo_kls_itr_end(Eo_Kls_Itr *cur, Eo_Kls_Itr *prev_state)
|
_eo_kls_itr_end(Eo_Kls_Itr *cur, Eo_Kls_Itr *prev_state)
|
||||||
{
|
{
|
||||||
if (cur->op != prev_state->op)
|
|
||||||
{
|
|
||||||
cur->op = prev_state->op;
|
|
||||||
cur->kls_itr = prev_state->kls_itr;
|
cur->kls_itr = prev_state->kls_itr;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline const Eo_Class *
|
static inline const Eo_Class *
|
||||||
|
@ -267,18 +256,10 @@ _eo_kls_itr_get(Eo_Kls_Itr *cur)
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline const Eo_Class *
|
static inline const Eo_Class *
|
||||||
_eo_kls_itr_next(Eo_Kls_Itr *cur, Eo_Op op)
|
_eo_kls_itr_next(Eo_Kls_Itr *cur, Eo_Kls_Itr *prev_state, Eo_Op op)
|
||||||
{
|
{
|
||||||
if (cur->op != op)
|
|
||||||
{
|
|
||||||
Eo_Op node_op = cur->op;
|
|
||||||
ERR("Called with op %x ('%s') while expecting: %x ('%s'). This probaly means you called eo_*_super functions from a wrong place.",
|
|
||||||
op, _eo_op_id_name_get(op),
|
|
||||||
node_op, _eo_op_id_name_get(node_op));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
const Eo_Class **kls_itr = cur->kls_itr;
|
const Eo_Class **kls_itr = cur->kls_itr;
|
||||||
|
prev_state->kls_itr = cur->kls_itr;
|
||||||
if (*kls_itr)
|
if (*kls_itr)
|
||||||
{
|
{
|
||||||
const op_type_funcs *fsrc = _dich_func_get(*kls_itr, op);
|
const op_type_funcs *fsrc = _dich_func_get(*kls_itr, op);
|
||||||
|
@ -296,10 +277,9 @@ _eo_kls_itr_next(Eo_Kls_Itr *cur, Eo_Op op)
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline const op_type_funcs *
|
static inline const op_type_funcs *
|
||||||
_eo_kls_itr_func_get(const Eo_Class *klass, Eo_Kls_Itr *mro_itr, Eo_Op op, Eo_Kls_Itr *prev_state)
|
_eo_kls_itr_func_get(Eo_Kls_Itr *mro_itr, Eo_Op op)
|
||||||
{
|
{
|
||||||
_eo_kls_itr_init(klass, mro_itr, op, prev_state);
|
const Eo_Class *klass = _eo_kls_itr_get(mro_itr);
|
||||||
klass = _eo_kls_itr_get(mro_itr);
|
|
||||||
if (klass)
|
if (klass)
|
||||||
{
|
{
|
||||||
const op_type_funcs *func = _dich_func_get(klass, op);
|
const op_type_funcs *func = _dich_func_get(klass, op);
|
||||||
|
@ -327,8 +307,6 @@ _eo_kls_itr_func_get(const Eo_Class *klass, Eo_Kls_Itr *mro_itr, Eo_Op op, Eo_Kl
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
_eo_op_internal(Eo *obj, Eo_Op_Type op_type, Eo_Op op, va_list *p_list)
|
_eo_op_internal(Eo *obj, Eo_Op_Type op_type, Eo_Op op, va_list *p_list)
|
||||||
{
|
{
|
||||||
Eina_Bool ret = EINA_FALSE;
|
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
const Eo_Op_Description *op_desc = _eo_op_id_desc_get(op);
|
const Eo_Op_Description *op_desc = _eo_op_id_desc_get(op);
|
||||||
|
|
||||||
|
@ -342,16 +320,13 @@ _eo_op_internal(Eo *obj, Eo_Op_Type op_type, Eo_Op op, va_list *p_list)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Eo_Kls_Itr prev_state;
|
|
||||||
|
|
||||||
{
|
{
|
||||||
const op_type_funcs *func =
|
const op_type_funcs *func =
|
||||||
_eo_kls_itr_func_get(obj->klass, &obj->mro_itr, op, &prev_state);
|
_eo_kls_itr_func_get(&obj->mro_itr, op);
|
||||||
if (func)
|
if (func)
|
||||||
{
|
{
|
||||||
func->func(obj, _eo_data_get(obj, func->src), p_list);
|
func->func(obj, _eo_data_get(obj, func->src), p_list);
|
||||||
ret = EINA_TRUE;
|
return EINA_TRUE;
|
||||||
goto end;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -363,15 +338,11 @@ _eo_op_internal(Eo *obj, Eo_Op_Type op_type, Eo_Op op, va_list *p_list)
|
||||||
{
|
{
|
||||||
if (_eo_op_internal(emb_obj, op_type, op, p_list))
|
if (_eo_op_internal(emb_obj, op_type, op, p_list))
|
||||||
{
|
{
|
||||||
ret = EINA_TRUE;
|
return EINA_TRUE;
|
||||||
goto end;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return EINA_FALSE;
|
||||||
end:
|
|
||||||
_eo_kls_itr_end(&obj->mro_itr, &prev_state);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EAPI Eina_Bool
|
EAPI Eina_Bool
|
||||||
|
@ -380,12 +351,14 @@ eo_do_internal(Eo *obj, Eo_Op_Type op_type, ...)
|
||||||
Eina_Bool prev_error;
|
Eina_Bool prev_error;
|
||||||
Eina_Bool ret = EINA_TRUE;
|
Eina_Bool ret = EINA_TRUE;
|
||||||
Eo_Op op = EO_NOOP;
|
Eo_Op op = EO_NOOP;
|
||||||
|
Eo_Kls_Itr prev_state;
|
||||||
va_list p_list;
|
va_list p_list;
|
||||||
|
|
||||||
EO_MAGIC_RETURN_VAL(obj, EO_EINA_MAGIC, EINA_FALSE);
|
EO_MAGIC_RETURN_VAL(obj, EO_EINA_MAGIC, EINA_FALSE);
|
||||||
|
|
||||||
prev_error = obj->do_error;
|
prev_error = obj->do_error;
|
||||||
_eo_ref(obj);
|
_eo_ref(obj);
|
||||||
|
_eo_kls_itr_init(obj->klass, &obj->mro_itr, &prev_state);
|
||||||
|
|
||||||
va_start(p_list, op_type);
|
va_start(p_list, op_type);
|
||||||
|
|
||||||
|
@ -410,6 +383,7 @@ eo_do_internal(Eo *obj, Eo_Op_Type op_type, ...)
|
||||||
|
|
||||||
obj->do_error = prev_error;
|
obj->do_error = prev_error;
|
||||||
|
|
||||||
|
_eo_kls_itr_end(&obj->mro_itr, &prev_state);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -419,13 +393,11 @@ eo_do_super_internal(Eo *obj, Eo_Op_Type op_type, Eo_Op op, ...)
|
||||||
const Eo_Class *nklass;
|
const Eo_Class *nklass;
|
||||||
Eina_Bool ret = EINA_TRUE;
|
Eina_Bool ret = EINA_TRUE;
|
||||||
va_list p_list;
|
va_list p_list;
|
||||||
|
Eo_Kls_Itr prev_state;
|
||||||
EO_MAGIC_RETURN_VAL(obj, EO_EINA_MAGIC, EINA_FALSE);
|
EO_MAGIC_RETURN_VAL(obj, EO_EINA_MAGIC, EINA_FALSE);
|
||||||
|
|
||||||
/* Advance the kls itr. */
|
/* Advance the kls itr. */
|
||||||
nklass = _eo_kls_itr_next(&obj->mro_itr, op);
|
nklass = _eo_kls_itr_next(&obj->mro_itr, &prev_state, op);
|
||||||
|
|
||||||
if (obj->mro_itr.op != op)
|
|
||||||
return EINA_FALSE;
|
|
||||||
|
|
||||||
va_start(p_list, op);
|
va_start(p_list, op);
|
||||||
if (!_eo_op_internal(obj, op_type, op, &p_list))
|
if (!_eo_op_internal(obj, op_type, op, &p_list))
|
||||||
|
@ -438,14 +410,13 @@ eo_do_super_internal(Eo *obj, Eo_Op_Type op_type, Eo_Op op, ...)
|
||||||
if (obj->do_error)
|
if (obj->do_error)
|
||||||
ret = EINA_FALSE;
|
ret = EINA_FALSE;
|
||||||
|
|
||||||
|
_eo_kls_itr_end(&obj->mro_itr, &prev_state);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
_eo_class_op_internal(Eo_Class *klass, Eo_Op op, va_list *p_list)
|
_eo_class_op_internal(Eo_Class *klass, Eo_Op op, va_list *p_list)
|
||||||
{
|
{
|
||||||
Eina_Bool ret = EINA_FALSE;
|
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
const Eo_Op_Description *op_desc = _eo_op_id_desc_get(op);
|
const Eo_Op_Description *op_desc = _eo_op_id_desc_get(op);
|
||||||
|
|
||||||
|
@ -459,22 +430,17 @@ _eo_class_op_internal(Eo_Class *klass, Eo_Op op, va_list *p_list)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Eo_Kls_Itr prev_state;
|
|
||||||
|
|
||||||
{
|
{
|
||||||
const op_type_funcs *func =
|
const op_type_funcs *func =
|
||||||
_eo_kls_itr_func_get(klass, &klass->mro_itr, op, &prev_state);
|
_eo_kls_itr_func_get(&klass->mro_itr, op);
|
||||||
if (func)
|
if (func)
|
||||||
{
|
{
|
||||||
((eo_op_func_type_class) func->func)(klass, p_list);
|
((eo_op_func_type_class) func->func)(klass, p_list);
|
||||||
ret = EINA_TRUE;
|
return EINA_TRUE;
|
||||||
goto end;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
end:
|
return EINA_FALSE;
|
||||||
_eo_kls_itr_end(&klass->mro_itr, &prev_state);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EAPI Eina_Bool
|
EAPI Eina_Bool
|
||||||
|
@ -482,10 +448,13 @@ eo_class_do_internal(const Eo_Class *klass, ...)
|
||||||
{
|
{
|
||||||
Eina_Bool ret = EINA_TRUE;
|
Eina_Bool ret = EINA_TRUE;
|
||||||
Eo_Op op = EO_NOOP;
|
Eo_Op op = EO_NOOP;
|
||||||
|
Eo_Kls_Itr prev_state;
|
||||||
va_list p_list;
|
va_list p_list;
|
||||||
|
|
||||||
EO_MAGIC_RETURN_VAL(klass, EO_CLASS_EINA_MAGIC, EINA_FALSE);
|
EO_MAGIC_RETURN_VAL(klass, EO_CLASS_EINA_MAGIC, EINA_FALSE);
|
||||||
|
|
||||||
|
_eo_kls_itr_init(klass, &((Eo_Class *) klass)->mro_itr, &prev_state);
|
||||||
|
|
||||||
va_start(p_list, klass);
|
va_start(p_list, klass);
|
||||||
|
|
||||||
op = va_arg(p_list, Eo_Op);
|
op = va_arg(p_list, Eo_Op);
|
||||||
|
@ -502,6 +471,7 @@ eo_class_do_internal(const Eo_Class *klass, ...)
|
||||||
|
|
||||||
va_end(p_list);
|
va_end(p_list);
|
||||||
|
|
||||||
|
_eo_kls_itr_end(&((Eo_Class *) klass)->mro_itr, &prev_state);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -511,13 +481,11 @@ eo_class_do_super_internal(const Eo_Class *klass, Eo_Op op, ...)
|
||||||
const Eo_Class *nklass;
|
const Eo_Class *nklass;
|
||||||
Eina_Bool ret = EINA_TRUE;
|
Eina_Bool ret = EINA_TRUE;
|
||||||
va_list p_list;
|
va_list p_list;
|
||||||
|
Eo_Kls_Itr prev_state;
|
||||||
EO_MAGIC_RETURN_VAL(klass, EO_CLASS_EINA_MAGIC, EINA_FALSE);
|
EO_MAGIC_RETURN_VAL(klass, EO_CLASS_EINA_MAGIC, EINA_FALSE);
|
||||||
|
|
||||||
/* Advance the kls itr. */
|
/* Advance the kls itr. */
|
||||||
nklass = _eo_kls_itr_next(&((Eo_Class *) klass)->mro_itr, op);
|
nklass = _eo_kls_itr_next(&((Eo_Class *) klass)->mro_itr, &prev_state, op);
|
||||||
|
|
||||||
if (klass->mro_itr.op != op)
|
|
||||||
return EINA_FALSE;
|
|
||||||
|
|
||||||
va_start(p_list, op);
|
va_start(p_list, op);
|
||||||
if (!_eo_class_op_internal((Eo_Class *) klass, op, &p_list))
|
if (!_eo_class_op_internal((Eo_Class *) klass, op, &p_list))
|
||||||
|
@ -527,6 +495,7 @@ eo_class_do_super_internal(const Eo_Class *klass, Eo_Op op, ...)
|
||||||
}
|
}
|
||||||
va_end(p_list);
|
va_end(p_list);
|
||||||
|
|
||||||
|
_eo_kls_itr_end(&((Eo_Class *) klass)->mro_itr, &prev_state);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1055,6 +1024,8 @@ eo_class_new(const Eo_Class_Description *desc, Eo_Class_Id id, const Eo_Class *p
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
klass->mro_itr.kls_itr = klass->mro;
|
||||||
|
|
||||||
_eo_class_constructor(klass);
|
_eo_class_constructor(klass);
|
||||||
|
|
||||||
va_end(p_list);
|
va_end(p_list);
|
||||||
|
@ -1136,6 +1107,7 @@ eo_add(const Eo_Class *klass, Eo *parent)
|
||||||
EINA_MAGIC_SET(obj, EO_EINA_MAGIC);
|
EINA_MAGIC_SET(obj, EO_EINA_MAGIC);
|
||||||
obj->refcount++;
|
obj->refcount++;
|
||||||
obj->klass = klass;
|
obj->klass = klass;
|
||||||
|
obj->mro_itr.kls_itr = obj->klass->mro;
|
||||||
|
|
||||||
eo_parent_set(obj, parent);
|
eo_parent_set(obj, parent);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue