eo2: add virtual func support
authorJérémy Zurcher <jeremy@asynk.ch>
Fri, 26 Jul 2013 15:14:52 +0000 (17:14 +0200)
committerTom Hacohen <tom@stosb.com>
Thu, 10 Apr 2014 03:20:16 +0000 (04:20 +0100)
src/lib/eo/Eo.h
src/lib/eo/eo.c

index 2e6729b2a8e09e39fda647a43e330a45864fd164..dbcd42d7a52fcb8ea6793d8aafe6a599452a3297 100644 (file)
@@ -659,10 +659,12 @@ typedef struct _Eo2_Op_Call_Data
 
 // OP ID of an overriding function
 #define EO2_OP_OVERRIDE ((Eo_Op) -1)
+#define EO2_OP_VIRTUAL ((Eo_Op) -2)
 
 #define EO2_OP_FUNC(_private, _api, _doc) {_private, _api, EO_NOOP, EO_OP_TYPE_REGULAR, _doc}
 #define EO2_OP_CLASS_FUNC(_private, _api, _doc) {_private, _api, EO_NOOP, EO_OP_TYPE_CLASS, _doc}
 #define EO2_OP_FUNC_OVERRIDE(_private, _api) {_private, _api, EO2_OP_OVERRIDE, EO_OP_TYPE_REGULAR, NULL}
+#define EO2_OP_FUNC_VIRTUAL(_api, _doc) {NULL, _api, EO2_OP_VIRTUAL, EO_OP_TYPE_REGULAR, _doc}
 #define EO2_OP_SENTINEL { NULL, NULL, 0, EO_OP_TYPE_INVALID, NULL}
 
 // returns the OP id corresponding to the given api_func
index 98378569ac1c979d98e94b8ba26cd99a947d01af..65ead71cb4b23468cf8f3b69107a8b87eecc76f8 100644 (file)
@@ -382,9 +382,17 @@ eo2_call_resolve_internal(const Eo_Class *klass_id, Eo_Op op, Eo2_Op_Call_Data *
    else
       klass = fptr->cur_klass;
 
-   func = _eo_kls_itr_func_get(klass, op);
+   if (!klass)
+     return EINA_FALSE;
+
+   func = _dich_func_get(klass, op);
    if (EINA_LIKELY(func != NULL))
      {
+        if (func->func == NULL)
+          {
+             ERR("you called a pure virtual func");
+             return EINA_FALSE;
+          }
         call->obj_id = fptr->obj_id;
         call->func = func->func;
 
@@ -496,6 +504,11 @@ eo2_class_funcs_set(Eo_Class *klass_id)
              op_desc->op = op_id;
              op_id++;
           }
+        else if (op_desc->op == EO2_OP_VIRTUAL)
+          {
+             op_desc->op = op_id;
+             op_id++;
+          }
         else if (op_desc->op == EO2_OP_OVERRIDE)
           {
              if (klass->parent == NULL)