Eobj: Fixed order of function call.

SVN revision: 70127
This commit is contained in:
Tom Hacohen 2012-04-12 08:27:35 +00:00
parent 69bf58ba95
commit f4cc28cde9
1 changed files with 45 additions and 55 deletions

View File

@ -218,12 +218,17 @@ typedef struct
static inline Eina_Bool static inline Eina_Bool
_eobj_kls_itr_init(Eobj *obj, Eobj_Op op) _eobj_kls_itr_init(Eobj *obj, Eobj_Op op)
{ {
if (obj->kls_itr && if (obj->kls_itr)
EINA_INLIST_CONTAINER_GET(obj->kls_itr, Eobj_Kls_Itr_Node))
{ {
return EINA_FALSE; Eobj_Kls_Itr_Node *node =
EINA_INLIST_CONTAINER_GET(obj->kls_itr, Eobj_Kls_Itr_Node);
if (node->op == op)
{
return EINA_FALSE;
}
} }
else
{ {
Eobj_Kls_Itr_Node *node = calloc(1, sizeof(*node)); Eobj_Kls_Itr_Node *node = calloc(1, sizeof(*node));
node->op = op; node->op = op;
@ -248,6 +253,15 @@ _eobj_kls_itr_end(Eobj *obj, Eobj_Op op)
free(node); free(node);
} }
static inline const Eobj_Class *
_eobj_kls_itr_get(Eobj *obj)
{
Eobj_Kls_Itr_Node *node =
EINA_INLIST_CONTAINER_GET(obj->kls_itr, Eobj_Kls_Itr_Node);
return (node) ? *(node->kls_itr) : NULL;
}
static inline const Eobj_Class * static inline const Eobj_Class *
_eobj_kls_itr_next(Eobj *obj) _eobj_kls_itr_next(Eobj *obj)
{ {
@ -305,70 +319,50 @@ _eobj_op_id_desc_get(Eobj_Op op)
} }
static Eina_Bool static Eina_Bool
_eobj_op_internal(Eobj *obj, const Eobj_Class *obj_klass, Eobj_Op op, va_list *p_list, Eina_Bool recursive) _eobj_op_internal(Eobj *obj, Eobj_Op op, va_list *p_list)
{ {
const Eobj_Class *klass = obj_klass; const Eobj_Class *klass;
eobj_op_func_type func; Eina_Bool ret = EINA_FALSE;
Eina_Bool _itr_init;
if (!obj_klass)
return EINA_FALSE;
_itr_init = _eobj_kls_itr_init(obj, op);
klass = _eobj_kls_itr_get(obj);
while (klass) while (klass)
{ {
func = dich_func_get(klass, op); eobj_op_func_type func = dich_func_get(klass, op);
if (func) if (func)
{ {
func(obj, op, p_list); func(obj, op, p_list);
return EINA_TRUE; ret = EINA_TRUE;
goto end;
} }
else else
{ {
klass = klass->parent; /* Try composite objects */
}
}
if (!recursive)
return EINA_FALSE;
if (!klass)
{
klass = obj_klass;
/* FIXME: Should probably flatten everything. to be faster. */
{
/* Try MIXINS */
Eobj_Extension_Node *itr;
EINA_INLIST_FOREACH(klass->extensions, itr)
{
if (_eobj_op_internal(obj, itr->klass, op, p_list, recursive))
{
return EINA_TRUE;
}
}
}
/* Try composite objects */
{
Eina_List *itr; Eina_List *itr;
Eobj *emb_obj; Eobj *emb_obj;
EINA_LIST_FOREACH(obj->composite_objects, itr, emb_obj) EINA_LIST_FOREACH(obj->composite_objects, itr, emb_obj)
{ {
if (_eobj_op_internal(emb_obj, eobj_class_get(emb_obj), op, p_list, recursive)) if (_eobj_op_internal(emb_obj, op, p_list))
{ {
return EINA_TRUE; ret = EINA_TRUE;
goto end;
} }
} }
} }
/* If haven't found anything, return FALSE */ klass = _eobj_kls_itr_next(obj);
return EINA_FALSE;
} }
return EINA_TRUE; end:
if (_itr_init) _eobj_kls_itr_end(obj, op);
return ret;
} }
static inline Eina_Bool static inline Eina_Bool
_eobj_ops_internal(Eobj *obj, const Eobj_Class *obj_klass, va_list *p_list) _eobj_ops_internal(Eobj *obj, va_list *p_list)
{ {
Eina_Bool ret = EINA_TRUE; Eina_Bool ret = EINA_TRUE;
Eobj_Op op = 0; Eobj_Op op = 0;
@ -376,7 +370,7 @@ _eobj_ops_internal(Eobj *obj, const Eobj_Class *obj_klass, va_list *p_list)
op = va_arg(*p_list, Eobj_Op); op = va_arg(*p_list, Eobj_Op);
while (op) while (op)
{ {
if (!_eobj_op_internal(obj, obj_klass, op, p_list, EINA_TRUE)) if (!_eobj_op_internal(obj, op, p_list))
{ {
const Eobj_Op_Description *desc = _eobj_op_id_desc_get(op); const Eobj_Op_Description *desc = _eobj_op_id_desc_get(op);
const char *_id_name = (desc) ? desc->name : NULL; const char *_id_name = (desc) ? desc->name : NULL;
@ -384,7 +378,7 @@ _eobj_ops_internal(Eobj *obj, const Eobj_Class *obj_klass, va_list *p_list)
const char *_dom_name = (op_klass) ? op_klass->desc->name : NULL; const char *_dom_name = (op_klass) ? op_klass->desc->name : NULL;
ERR("Can't find func for op %x ('%s' of domain '%s') for class '%s'. Aborting.", ERR("Can't find func for op %x ('%s' of domain '%s') for class '%s'. Aborting.",
op, _id_name, _dom_name, op, _id_name, _dom_name,
obj_klass->desc->name); obj->klass->desc->name);
ret = EINA_FALSE; ret = EINA_FALSE;
break; break;
} }
@ -400,7 +394,7 @@ eobj_do_internal(Eobj *obj, ...)
Eina_Bool ret; Eina_Bool ret;
va_list p_list; va_list p_list;
va_start(p_list, obj); va_start(p_list, obj);
ret = _eobj_ops_internal(obj, eobj_class_get(obj), &p_list); ret = _eobj_ops_internal(obj, &p_list);
va_end(p_list); va_end(p_list);
return ret; return ret;
} }
@ -409,16 +403,14 @@ EAPI Eina_Bool
eobj_super_do(Eobj *obj, Eobj_Op op, ...) eobj_super_do(Eobj *obj, Eobj_Op op, ...)
{ {
const Eobj_Class *obj_klass; const Eobj_Class *obj_klass;
Eina_Bool ret = EINA_TRUE; Eina_Bool ret = EINA_TRUE;
va_list p_list; va_list p_list;
Eina_Bool kls_itr_end = _eobj_kls_itr_init(obj, op);
obj_klass = _eobj_kls_itr_next(obj);
if (!obj_klass) goto end;
va_start(p_list, op); va_start(p_list, op);
if (!_eobj_op_internal(obj, obj_klass, op, &p_list, EINA_FALSE))
/* Advance the kls itr. */
obj_klass = _eobj_kls_itr_next(obj);
if (!_eobj_op_internal(obj, op, &p_list))
{ {
const Eobj_Op_Description *desc = _eobj_op_id_desc_get(op); const Eobj_Op_Description *desc = _eobj_op_id_desc_get(op);
const char *_id_name = (desc) ? desc->name : NULL; const char *_id_name = (desc) ? desc->name : NULL;
@ -426,13 +418,11 @@ eobj_super_do(Eobj *obj, Eobj_Op op, ...)
const char *_dom_name = (op_klass) ? op_klass->desc->name : NULL; const char *_dom_name = (op_klass) ? op_klass->desc->name : NULL;
ERR("Can't find func for op %x ('%s' of domain '%s') for class '%s'. Aborting.", ERR("Can't find func for op %x ('%s' of domain '%s') for class '%s'. Aborting.",
op, _id_name, _dom_name, op, _id_name, _dom_name,
obj_klass->desc->name); (obj_klass) ? obj_klass->desc->name : NULL);
ret = EINA_FALSE; ret = EINA_FALSE;
} }
va_end(p_list); va_end(p_list);
end:
if (kls_itr_end) _eobj_kls_itr_end(obj, op);
return ret; return ret;
} }