tasn pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=f4c1bff0f33db26a4fa94ae812068e5c532a3290

commit f4c1bff0f33db26a4fa94ae812068e5c532a3290
Author: Jérémy Zurcher <jer...@asynk.ch>
Date:   Fri Sep 27 00:38:15 2013 +0200

    eo: eo_do_super_internal() supports objects and classes
    
    eo_class_do_super() macro calls eo_do_super()
    eo_class_do_super_internal() and _eo_class_op_internal() are removed
    
    Conflicts:
        src/lib/eo/eo.c
---
 src/lib/eo/Eo.h | 22 +++------------
 src/lib/eo/eo.c | 84 +++++++++++----------------------------------------------
 2 files changed, 19 insertions(+), 87 deletions(-)

diff --git a/src/lib/eo/Eo.h b/src/lib/eo/Eo.h
index 3a62c6a..ebbc928 100644
--- a/src/lib/eo/Eo.h
+++ b/src/lib/eo/Eo.h
@@ -651,7 +651,7 @@ EAPI Eina_Bool eo_vdo_internal(const char *file, int line, 
const Eo *obj, va_lis
  *
  * @see #eo_do
  */
-#define eo_do_super(obj, cur_klass, ...) eo_do_super_internal(__FILE__, 
__LINE__, obj, cur_klass, EO_OP_TYPE_REGULAR, __VA_ARGS__)
+#define eo_do_super(obj, cur_klass, ...) eo_do_super_internal(__FILE__, 
__LINE__, obj, cur_klass, __VA_ARGS__)
 
 /**
  * @brief Calls the super function for the specific op.
@@ -664,13 +664,12 @@ EAPI Eina_Bool eo_vdo_internal(const char *file, int 
line, const Eo *obj, va_lis
  *
  * @see #eo_class_do
  */
-#define eo_class_do_super(klass, cur_klass, ...) 
eo_class_do_super_internal(__FILE__, __LINE__, klass, cur_klass, __VA_ARGS__)
+#define eo_class_do_super(klass, cur_klass, ...) eo_do_super(klass, cur_klass, 
__VA_ARGS__)
 
 /**
  * @brief Calls the super function for the specific op.
  * @param obj The object to work on
  * @param cur_klass The *current* class (use the class *after* this in the 
MRO).
- * @param op_type The type of the ops that are passed.
  * @param op The wanted op.
  * @param ... list of parameters.
  * @return @c EINA_TRUE on success.
@@ -680,22 +679,7 @@ EAPI Eina_Bool eo_vdo_internal(const char *file, int line, 
const Eo *obj, va_lis
  * @see #eo_do
  * @see #eo_do_super
  */
-EAPI Eina_Bool eo_do_super_internal(const char *file, int line, Eo *obj, const 
Eo *cur_klass, Eo_Op_Type op_type, Eo_Op op, ...);
-
-/**
- * @brief Calls the super function for the specific op.
- * @param klass The klass to work on
- * @param cur_klass The *current* class (use the class *after* this in the 
MRO).
- * @param op The wanted op.
- * @param ... list of parameters.
- * @return @c EINA_TRUE on success.
- *
- * Don't use this function, use the wrapping macros instead.
- *
- * @see #eo_class_do
- * @see #eo_class_do_super
- */
-EAPI Eina_Bool eo_class_do_super_internal(const char *file, int line, const Eo 
*klass, const Eo *cur_klass, Eo_Op op, ...);
+EAPI Eina_Bool eo_do_super_internal(const char *file, int line, const Eo *obj, 
const Eo *cur_klass, Eo_Op op, ...);
 
 /**
  * @brief Gets the class of the object.
diff --git a/src/lib/eo/eo.c b/src/lib/eo/eo.c
index 371da28..d851fe5 100644
--- a/src/lib/eo/eo.c
+++ b/src/lib/eo/eo.c
@@ -425,88 +425,36 @@ eo_vdo_internal(const char *file, int line, const Eo 
*obj_id, va_list *ops)
 }
 
 EAPI Eina_Bool
-eo_do_super_internal(const char *file, int line, Eo *obj_id, const Eo 
*cur_klass_id,
-                     Eo_Op_Type op_type, Eo_Op op, ...)
+eo_do_super_internal(const char *file, int line, const Eo *obj_id, const Eo 
*cur_klass_id, Eo_Op op, ...)
 {
    const _Eo_Class *nklass;
+   Eina_Bool op_ret = EINA_TRUE;
    Eina_Bool ret = EINA_TRUE;
    va_list p_list;
 
-   EO_OBJ_POINTER_RETURN_VAL(obj_id, obj, EINA_FALSE);
    EO_CLASS_POINTER_RETURN_VAL(cur_klass_id, cur_klass, EINA_FALSE);
 
-   /* Advance the kls itr. */
-   nklass = _eo_kls_itr_next(obj->klass, cur_klass, op);
-
    va_start(p_list, op);
-   if (!_eo_op_internal(file, line, (_Eo)obj, nklass, op_type, op, &p_list))
-     {
-        _EO_OP_ERR_NO_OP_PRINT(file, line, op, nklass);
-        ret = EINA_FALSE;
-     }
-   va_end(p_list);
-
-   if (obj->do_error)
-      ret = EINA_FALSE;
-
-   return ret;
-}
-
-static Eina_Bool
-_eo_class_op_internal(const char *file, int line, _Eo_Class *klass, const 
_Eo_Class *cur_klass,
-                      Eo_Op op, va_list *p_list)
-{
-#ifdef EO_DEBUG
-   const Eo_Op_Description *op_desc = _eo_op_id_desc_get(op);
-
-   if (op_desc)
-     {
-        if (op_desc->op_type != EO_OP_TYPE_CLASS)
-          {
-             ERR("in %s:%d: Tried calling an instance op '%s' (0x%x) from a 
class context.",
-                 file, line, (op_desc) ? op_desc->name : NULL, op);
-             return EINA_FALSE;
-          }
-     }
-#else
-   (void) file;
-   (void) line;
-#endif
-
+   if (_eo_is_a_class(obj_id))
      {
-        const op_type_funcs *func = _eo_kls_itr_func_get(cur_klass, op);
-        if (func)
-          {
-             ((eo_op_func_type_class) func->func)(_eo_class_id_get(klass), 
p_list);
-             return EINA_TRUE;
-          }
+        EO_CLASS_POINTER_RETURN_VAL(obj_id, klass, EINA_FALSE);
+        nklass = _eo_kls_itr_next(klass, cur_klass, op);
+        op_ret = _eo_op_internal(file, line, (_Eo)klass, nklass, 
EO_OP_TYPE_CLASS, op, &p_list);
      }
-
-   return EINA_FALSE;
-}
-
-EAPI Eina_Bool
-eo_class_do_super_internal(const char *file, int line, const Eo *klass_id,
-                           const Eo *cur_klass_id, Eo_Op op, ...)
-{
-   const _Eo_Class *nklass;
-   Eina_Bool ret = EINA_TRUE;
-   va_list p_list;
-   EO_CLASS_POINTER_RETURN_VAL(klass_id, klass, EINA_FALSE);
-   EO_CLASS_POINTER_RETURN_VAL(cur_klass_id, cur_klass, EINA_FALSE);
-
-   /* Advance the kls itr. */
-   nklass = _eo_kls_itr_next(klass, cur_klass, op);
-
-   va_start(p_list, op);
-   if (!_eo_class_op_internal(file, line, (_Eo_Class *) klass, nklass, op, 
&p_list))
+   else
      {
-        _EO_OP_ERR_NO_OP_PRINT(file, line, op, nklass);
-        ret = EINA_FALSE;
+        EO_OBJ_POINTER_RETURN_VAL(obj_id, obj, EINA_FALSE);
+        nklass = _eo_kls_itr_next(obj->klass, cur_klass, op);
+        op_ret = _eo_op_internal(file, line, (_Eo)obj, nklass, 
EO_OP_TYPE_REGULAR, op, &p_list);
+        if (obj->do_error)
+          ret = EINA_FALSE;
      }
    va_end(p_list);
 
-   return ret;
+   if (!op_ret)
+     _EO_OP_ERR_NO_OP_PRINT(file, line, op, nklass);
+
+   return (ret & op_ret);
 }
 
 EAPI const Eo *

-- 


Reply via email to