static size_t _eo_sz = 0;
static size_t _eo_class_sz = 0;
+static size_t _eo_handle_sz = 0;
static void _eo_condtor_reset(_Eo *obj);
static inline void *_eo_data_scope_get(const _Eo *obj, const _Eo_Class *klass);
(_eo_classes[id - 1]) : NULL); \
})
-#define EO_ALIGN_SIZE(size) eina_mempool_alignof(size)
-
static inline void
_dich_chain_alloc(Dich_Chain1 *chain1)
{
#ifdef HAVE_EO_ID
return ID_CLASS_GET((Eo_Class_Id)klass_id);
#else
- return (_Eo_Class *)klass_id;
+ return (_Eo_Class *) EO_FROM_HANDLE(klass_id);
#endif
}
#ifdef HAVE_EO_ID
return (Eo_Class *)klass->class_id;
#else
- return (Eo_Class *)klass;
+ return (Eo_Class *) HANDLE_FROM_EO(klass);
#endif
}
}
EINA_TRASH_CLEAN(&klass->objects.trash, data)
+#ifdef HAVE_EO_ID
free(data);
+#else
+ free((void *) HANDLE_FROM_EO(data));
+#endif
EINA_TRASH_CLEAN(&klass->iterators.trash, data)
free(data);
eina_lock_free(&klass->objects.trash_lock);
eina_lock_free(&klass->iterators.trash_lock);
+#ifdef HAVE_EO_ID
free(klass);
+#else
+ free((void *) HANDLE_FROM_EO(klass));
+#endif
}
/* DEVCHECK */
eo_class_new(const Eo_Class_Description *desc, const Eo_Class *parent_id, ...)
{
_Eo_Class *klass;
+ _Eo_Handle *hndl;
va_list p_list;
size_t extn_sz, mro_sz, mixins_sz;
Eina_List *extn_list, *mro, *mixins;
DBG("Finished building Mixins list for class '%s'", desc->name);
}
+#ifdef HAVE_EO_ID
+ hndl = NULL;
klass = calloc(1, _eo_class_sz + extn_sz + mro_sz + mixins_sz);
-#ifndef HAVE_EO_ID
+#else
+ hndl = calloc(1, _eo_handle_sz + _eo_class_sz + extn_sz + mro_sz + mixins_sz);
+ hndl->is_a_class = 1;
+ klass = (_Eo_Class *) EO_FROM_HANDLE(hndl);
EINA_MAGIC_SET(klass, EO_CLASS_EINA_MAGIC);
#endif
eina_lock_new(&klass->objects.trash_lock);
extn_data_itr->offset = 0;
}
+#ifdef HAVE_EO_ID
klass->obj_size = _eo_sz + extn_data_off;
+#else
+ klass->obj_size = _eo_handle_sz + _eo_sz + extn_data_off;
+#endif
if (getenv("EO_DEBUG"))
{
fprintf(stderr, "Eo class '%s' will take %u bytes per object.\n",
{
Eina_Bool do_err;
_Eo *obj;
+ _Eo_Handle *hndl;
EO_CLASS_POINTER_RETURN_VAL(klass_id, klass, NULL);
if (parent_id)
}
else
{
+#ifdef HAVE_EO_ID
+ hndl = NULL;
obj = calloc(1, klass->obj_size);
+#else
+ hndl = calloc(1, klass->obj_size);
+ hndl->is_a_class = 0;
+ obj = EO_FROM_HANDLE(hndl);
+#endif
}
eina_lock_release(&klass->objects.trash_lock);
_eo_sz = EO_ALIGN_SIZE(sizeof (_Eo));
_eo_class_sz = EO_ALIGN_SIZE(sizeof (_Eo_Class));
+ _eo_handle_sz = EO_ALIGN_SIZE(sizeof (_Eo_Handle));
_eo_classes = NULL;
_eo_classes_last_id = EO_CLASS_IDS_FIRST - 1;
# define UNPROTECT(_ptr_)
#endif
+#define EO_ALIGN_SIZE(size) eina_mempool_alignof(size)
+
+#ifndef HAVE_EO_ID
+# define HANDLE_FROM_EO(eo) (Eo_Id)( eo ? (((char *) eo) - EO_ALIGN_SIZE(sizeof (_Eo_Handle))) : NULL )
+# define EO_FROM_HANDLE(hndl) (_Eo *) ( hndl ? (((char *) hndl) + EO_ALIGN_SIZE(sizeof (_Eo_Handle))) : NULL )
+#endif
+
/* Entry */
typedef struct
{
return NULL;
#else
- return (_Eo *)obj_id;
+ return EO_FROM_HANDLE(obj_id);
#endif
}
(entry - _current_table->entries),
entry->generation);
#else
- return (Eo_Id)obj;
+ return HANDLE_FROM_EO(obj);
#endif
}
ERR("obj_id %p is not pointing to a valid object. Maybe it has already been freed.", (void *)obj_id);
#else
- EINA_MAGIC_SET((_Eo *) obj_id, EO_FREED_EINA_MAGIC);
+ EINA_MAGIC_SET(EO_FROM_HANDLE(obj_id), EO_FREED_EINA_MAGIC);
#endif
}