summaryrefslogtreecommitdiff
path: root/src/lib/eo/eo.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/eo/eo.c')
-rw-r--r--src/lib/eo/eo.c70
1 files changed, 32 insertions, 38 deletions
diff --git a/src/lib/eo/eo.c b/src/lib/eo/eo.c
index 930b3a2048..740e29485e 100644
--- a/src/lib/eo/eo.c
+++ b/src/lib/eo/eo.c
@@ -95,18 +95,19 @@ _dich_func_get(const _Eo_Class *klass, Eo_Op op)
}
static inline void
-_dich_func_set(_Eo_Class *klass, Eo_Op op, eo_op_func_type func)
+_dich_func_set(_Eo *obj, Eo_Op op, eo_op_func_type func)
{
+ _Eo_Class *klass = obj->klass_data;
size_t idx1 = DICH_CHAIN1(op);
Dich_Chain1 *chain1 = &klass->chain[idx1];
_dich_chain_alloc(chain1);
- if (chain1->funcs[DICH_CHAIN_LAST(op)].src == klass)
+ if (chain1->funcs[DICH_CHAIN_LAST(op)].src == (Eo *) obj->obj_id)
{
ERR("Already set function for op 0x%x. Overriding with func %p", op,func);
}
chain1->funcs[DICH_CHAIN_LAST(op)].func = func;
- chain1->funcs[DICH_CHAIN_LAST(op)].src = klass;
+ chain1->funcs[DICH_CHAIN_LAST(op)].src = (Eo *) obj->obj_id;
}
static inline void
@@ -130,7 +131,13 @@ static inline _Eo_Class *
_eo_class_pointer_get(const Eo_Class *klass_id)
{
#ifdef HAVE_EO_ID
- return ID_CLASS_GET((Eo_Class_Id)klass_id);
+ EO_OBJ_POINTER_RETURN_VAL(klass_id, obj, NULL);
+ if (!obj->is_a_klass)
+ {
+ EERR("ref_obj (%p->%p) does not reference a class (%p).", klass_id, obj);
+ return NULL;
+ }
+ return obj->klass_data;
#else
return (_Eo_Class *)klass_id;
#endif
@@ -459,12 +466,13 @@ eo2_api_funcs_cmp(const void *p1, const void *p2)
}
EAPI void
-_eo2_class_funcs_set(_Eo_Class *klass)
+_eo2_class_funcs_set(_Eo *obj)
{
int op_id;
const Eo2_Op_Description *api_desc;
Eo2_Op_Description *op_desc;
Eo2_Op_Description *op_descs;
+ _Eo_Class *klass = obj->klass_data;
op_descs = klass->desc->ops.descs2;
@@ -505,7 +513,7 @@ _eo2_class_funcs_set(_Eo_Class *klass)
}
DBG(" %4d %p %p %s", op_desc->op, op_desc->api_func, op_desc->func, op_desc->doc);
- _dich_func_set(klass, op_desc->op, op_desc->func);
+ _dich_func_set(obj, op_desc->op, op_desc->func);
}
}
@@ -726,23 +734,23 @@ _eo_class_mro_init(const Eo_Class_Description *desc, const _Eo_Class *parent, Ei
}
static void
-_eo_class_constructor(_Eo_Class *klass)
+_eo_class_constructor(_Eo *oj)
{
- if (klass->constructed)
+ if (obj->condtor_done)
return;
- klass->constructed = EINA_TRUE;
+ obj->condtor_done = EINA_TRUE;
- _eo2_class_funcs_set(klass);
+ _eo2_class_funcs_set(obj);
- if (klass->desc->class_constructor)
- klass->desc->class_constructor(_eo_class_id_get(klass));
+ if (obj->klass_data->desc->class_constructor)
+ klass->desc->class_constructor(obj);
}
static void
eo_class_free(_Eo_Class *klass)
{
- if (klass->constructed)
+ if (klass->condtor_done)
{
if (klass->desc->class_destructor)
klass->desc->class_destructor(_eo_class_id_get(klass));
@@ -760,20 +768,16 @@ _eo_class_isa_func(Eo *obj_id EINA_UNUSED, void *class_data EINA_UNUSED)
/* Do nonthing. */
}
-EAPI const Eo_Class *
+EAPI const Eo *
eo_class_new(const Eo_Class_Description *desc, const Eo_Class *parent_id, ...)
{
+ _Eo *obj;
_Eo_Class *klass;
va_list p_list;
size_t extn_sz, mro_sz, mixins_sz;
Eina_List *extn_list, *mro, *mixins;
_Eo_Class *parent = _eo_class_pointer_get(parent_id);
- if (parent && !EINA_MAGIC_CHECK(parent, EO_CLASS_EINA_MAGIC))
- {
- EINA_MAGIC_FAIL(parent, EO_CLASS_EINA_MAGIC);
- return NULL;
- }
EINA_SAFETY_ON_NULL_RETURN_VAL(desc, NULL);
EINA_SAFETY_ON_NULL_RETURN_VAL(desc->name, NULL);
@@ -892,8 +896,8 @@ eo_class_new(const Eo_Class_Description *desc, const Eo_Class *parent_id, ...)
DBG("Finished building Mixins list for class '%s'", desc->name);
}
- klass = calloc(1, _eo_class_sz + extn_sz + mro_sz + mixins_sz);
- EINA_MAGIC_SET(klass, EO_CLASS_EINA_MAGIC);
+ obj = calloc(1, _eo_sz + _eo_class_sz + extn_sz + mro_sz + mixins_sz);
+ klass = obj->klass_data = (const Eo *) ((char *) obj + _eo_sz);
klass->parent = parent;
klass->desc = desc;
klass->extensions = (const _Eo_Class **) ((char *) klass + _eo_class_sz);
@@ -1004,27 +1008,17 @@ eo_class_new(const Eo_Class_Description *desc, const Eo_Class *parent_id, ...)
eina_lock_take(&_eo_class_creation_lock);
- /* klass->class_id = _eo_id_allocate(klass); */
- klass->class_id = ++_eo_classes_last_id;
-
- {
- /* FIXME: Handle errors. */
- size_t arrsize = _eo_classes_last_id * sizeof(*_eo_classes);
- _Eo_Class **tmp;
- tmp = realloc(_eo_classes, arrsize);
-
- /* If it's the first allocation, memset. */
- if (!_eo_classes)
- memset(tmp, 0, arrsize);
+#ifndef HAVE_EO_ID
+ EINA_MAGIC_SET(obj, EO_EINA_MAGIC);
+#endif
+ Eo_Id obj_id = _eo_id_allocate(obj);
+ obj->obj_id = obj_id;
- _eo_classes = tmp;
- _eo_classes[klass->class_id - 1] = klass;
- }
eina_lock_release(&_eo_class_creation_lock);
- _eo_class_constructor(klass);
+ _eo_class_constructor(obj);
- return _eo_class_id_get(klass);
+ return (Eo *)obj_id;
}
EAPI Eina_Bool