diff --git a/efl/eo/efl.eo.pyx b/efl/eo/efl.eo.pyx
index 1c80c01..dace687 100644
--- a/efl/eo/efl.eo.pyx
+++ b/efl/eo/efl.eo.pyx
@@ -15,10 +15,12 @@
# You should have received a copy of the GNU Lesser General Public License
# along with this Python-EFL. If not, see .
-from cpython cimport PyObject, Py_INCREF, Py_DECREF#, PyMem_Malloc, PyMem_Free
+from cpython cimport PyObject, Py_INCREF, Py_DECREF
from libc.stdlib cimport malloc, free
from libc.string cimport memcpy, strdup
-from efl cimport Eina_Bool, const_Eina_List, eina_list_append, const_void
+from efl cimport Eina_Bool, const_Eina_List, eina_list_append, const_void, \
+ Eina_Hash, eina_hash_string_superfast_new, eina_hash_add, eina_hash_del, \
+ eina_hash_find
from efl.c_eo cimport Eo as cEo
from efl.c_eo cimport eo_init, eo_shutdown, eo_del, eo_unref, eo_wref_add, eo_add, Eo_Class
from efl.c_eo cimport eo_do, eo_class_name_get, eo_class_get
@@ -208,22 +210,27 @@ cdef void _METHOD_DEPRECATED(object self, char *message):
"""
-Object mapping is a dictionary into which object type names can be
+Object mapping is an Eina Hash table into which object type names can be
registered. These can be used to find a bindings class for an object using
-the object_from_instance function.
-"""
-cdef dict object_mapping = dict()
+the object_from_instance function."""
+cdef Eina_Hash *object_mapping = eina_hash_string_superfast_new(NULL)
-cdef void _object_mapping_register(str name, object cls) except *:
-# print("REGISTER: %s => %s" % (name, cls))
- if name in object_mapping:
+cdef void _object_mapping_register(char *name, object cls) except *:
+ cdef void *value
+
+ #print("REGISTER: %s => %s" % (name, cls))
+
+ value = eina_hash_find(object_mapping, name)
+
+ if value == NULL:
+ eina_hash_add(object_mapping, name, cls)
+ else:
raise ValueError("Object type name '%s' already registered." % name)
- object_mapping[name] = cls
-cdef void _object_mapping_unregister(str name):
- object_mapping.pop(name)
+cdef void _object_mapping_unregister(char *name):
+ eina_hash_del(object_mapping, name, NULL)
cdef object object_from_instance(cEo *obj):
@@ -232,27 +239,28 @@ cdef object object_from_instance(cEo *obj):
void *data
Eo o
const_char *cls_name
- object cls
+ type cls
if obj == NULL:
return None
eo_do(obj, eo_base_data_get("python-eo", &data))
if data != NULL:
-# print("Found: %s" % Eo.__repr__(data))
+ #print("Found: %s" % Eo.__repr__(data))
return data
cls_name = eo_class_name_get(eo_class_get(obj))
if cls_name == NULL:
raise ValueError("Eo object %#x does not have a type!" % obj)
-# print("Class name: %s" % cls_name)
+ #print("Class name: %s" % cls_name)
+
+ cls = eina_hash_find(object_mapping, cls_name)
- cls = object_mapping.get(cls_name, None)
if cls is None:
raise ValueError("Eo object %#x of type %s does not have a mapping!" %
(obj, cls_name))
-# print "MAPPING OBJECT:", cls_name, "=>", cls
+ #print "MAPPING OBJECT:", cls_name, "=>", cls
o = cls.__new__(cls)
o._set_obj(obj)
return o
diff --git a/include/efl.eo.pxd b/include/efl.eo.pxd
index 41dbc9a..75f7ee8 100644
--- a/include/efl.eo.pxd
+++ b/include/efl.eo.pxd
@@ -32,8 +32,8 @@ cdef class Eo(object):
cdef int PY_REFCOUNT(object o)
cdef object object_from_instance(cEo *obj)
-cdef void _object_mapping_register(str name, object cls) except *
-cdef void _object_mapping_unregister(str name)
+cdef void _object_mapping_register(char *name, object cls) except *
+cdef void _object_mapping_unregister(char *name)
cdef unicode _touni(char* s)
cdef char* _fruni(s)
diff --git a/include/efl.pxd b/include/efl.pxd
index 12deb4d..6b112f2 100644
--- a/include/efl.pxd
+++ b/include/efl.pxd
@@ -76,6 +76,8 @@ cdef extern from "Eina.h":
void *accounting
ctypedef Eina_List const_Eina_List "const Eina_List"
+ ctypedef struct Eina_Hash
+
ctypedef struct Eina_Hash_Tuple:
void *key
void *data
@@ -91,6 +93,7 @@ cdef extern from "Eina.h":
# Other typedefs
#
ctypedef int (*Eina_Compare_Cb)(const_void *data1, const_void *data2)
+ ctypedef void (*Eina_Free_Cb)(void *data)
####################################################################
# Functions
@@ -144,3 +147,8 @@ cdef extern from "Eina.h":
Eina_List *eina_list_prev(Eina_List *list)
void *eina_list_data_get(Eina_List *list)
unsigned int eina_list_count(Eina_List *list)
+
+ Eina_Hash *eina_hash_string_superfast_new(Eina_Free_Cb data_free_cb)
+ Eina_Bool eina_hash_add(Eina_Hash *hash, const_void *key, const_void *data)
+ Eina_Bool eina_hash_del(Eina_Hash *hash, const_void *key, const_void *data)
+ void *eina_hash_find(Eina_Hash *hash, const_void *key)