diff options
Diffstat (limited to 'src/lib/eo/eo.c')
-rw-r--r-- | src/lib/eo/eo.c | 70 |
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 |