kuuko pushed a commit to branch master. http://git.enlightenment.org/bindings/python/python-efl.git/commit/?id=3120e56250e2ec87b74c0c01f8a53234fa8610b7
commit 3120e56250e2ec87b74c0c01f8a53234fa8610b7 Author: Kai Huuhko <kai.huu...@gmail.com> Date: Fri Mar 13 02:40:39 2015 +0200 Evas.SmartObject: Go back to the old cb system Turns out the C calls are awfully slow. Dave, good work with the tests! --- efl/evas/efl.evas_object_smart.pxi | 119 ++++++++++++++++++++++--------------- 1 file changed, 72 insertions(+), 47 deletions(-) diff --git a/efl/evas/efl.evas_object_smart.pxi b/efl/evas/efl.evas_object_smart.pxi index 785e36c..998a6a2 100644 --- a/efl/evas/efl.evas_object_smart.pxi +++ b/efl/evas/efl.evas_object_smart.pxi @@ -340,36 +340,52 @@ cdef void _smart_callback(void *data, Evas_Object *o, void *event_info) with gil EINA_LOG_DOM_ERR(PY_EFL_EVAS_LOG_DOMAIN, "data is NULL!", NULL) return - cdef _SmartCb spec = <_SmartCb>data - cdef list tmp_args + cdef: + void *tmp = NULL + SmartObject obj + object event, ei + _SmartCb spec + list tmp_args + list lst - if event_info == NULL: - try: - tmp_args = [spec.obj] - tmp_args.extend(spec.args) - PyObject_Call(spec.func, tuple(tmp_args), spec.kargs) - except Exception: - traceback.print_exc() - elif spec.event_conv == NULL: - EINA_LOG_DOM_WARN( - PY_EFL_EVAS_LOG_DOMAIN, - 'event_info for event "%s" is not NULL and there is no event_conv!', - spec.event - ) - try: - tmp_args = [spec.obj] - tmp_args.extend(spec.args) - PyObject_Call(spec.func, tuple(tmp_args), spec.kargs) - except Exception: - traceback.print_exc() + eo_do_ret(o, tmp, eo_key_data_get("python-eo")) + if tmp == NULL: + EINA_LOG_DOM_ERR(PY_EFL_EVAS_LOG_DOMAIN, "obj is NULL!", NULL) + return else: - try: - tmp_args = [spec.obj] - tmp_args.append(spec.event_conv(event_info)) - tmp_args.extend(spec.args) - PyObject_Call(spec.func, tuple(tmp_args), spec.kargs) - except Exception: - traceback.print_exc() + obj = <SmartObject>tmp + + event = <object>data + lst = <list>obj._smart_callback_specs[event] + + for spec in lst: + if event_info == NULL: + try: + tmp_args = [spec.obj] + tmp_args.extend(spec.args) + PyObject_Call(spec.func, tuple(tmp_args), spec.kargs) + except Exception: + traceback.print_exc() + elif spec.event_conv == NULL: + EINA_LOG_DOM_WARN( + PY_EFL_EVAS_LOG_DOMAIN, + 'event_info for event "%s" is not NULL and there is no event_conv!', + spec.event + ) + try: + tmp_args = [spec.obj] + tmp_args.extend(spec.args) + PyObject_Call(spec.func, tuple(tmp_args), spec.kargs) + except Exception: + traceback.print_exc() + else: + try: + tmp_args = [spec.obj] + tmp_args.append(spec.event_conv(event_info)) + tmp_args.extend(spec.args) + PyObject_Call(spec.func, tuple(tmp_args), spec.kargs) + except Exception: + traceback.print_exc() cdef class Smart(object): @@ -764,9 +780,14 @@ cdef class SmartObject(Object): if not callable(func): raise TypeError("func must be callable") + cdef: + list lst + _SmartCb spec + object e = intern(event) + if isinstance(event, unicode): event = PyUnicode_AsUTF8String(event) - cdef _SmartCb spec = _SmartCb() + spec = _SmartCb.__new__(_SmartCb) spec.event = event spec.obj = self spec.event_conv = event_conv @@ -774,13 +795,15 @@ cdef class SmartObject(Object): spec.args = args spec.kargs = kargs - lst = self._smart_callback_specs.setdefault(event, []) + lst = <list>self._smart_callback_specs.setdefault(e, []) + if not lst: + evas_object_smart_callback_add(self.obj, + spec.event, + _smart_callback, + <void *>e + ) lst.append(spec) - evas_object_smart_callback_add(self.obj, - <const char *>event if event is not None else NULL, - _smart_callback, <void *>spec) - return 1 cdef int _callback_del_full(self, event, object(*event_conv)(void *), func) except 0: @@ -806,10 +829,9 @@ cdef class SmartObject(Object): int found = 0 int i void *tmp + list lst - if isinstance(event, unicode): event = PyUnicode_AsUTF8String(event) - - lst = self._smart_callback_specs.get(event, None) + lst = <list>self._smart_callback_specs.get(event, None) if lst is None: raise ValueError("No callbacks registered for the given event type") @@ -822,17 +844,17 @@ cdef class SmartObject(Object): if found == 0: raise ValueError("func not registered") - tmp = evas_object_smart_callback_del_full(self.obj, - <const char *>event if event is not None else NULL, - _smart_callback, - <void *>spec - ) - - if tmp == NULL: - raise RuntimeError("Something went wrong while unregistering!") - lst.pop(i) + if not lst: + if isinstance(event, unicode): event = PyUnicode_AsUTF8String(event) + tmp = evas_object_smart_callback_del(self.obj, + event, + _smart_callback + ) + if tmp == NULL: + raise RuntimeError("Something went wrong while unregistering!") + return 1 cdef int _callback_add(self, event, func, args, kargs) except 0: @@ -915,7 +937,10 @@ cdef class SmartObject(Object): **event_info** will always be a python object. """ if isinstance(name, unicode): name = PyUnicode_AsUTF8String(name) - evas_object_smart_callback_call(self.obj, name, <void*>event_info) + evas_object_smart_callback_call( + self.obj, name, + <void*>event_info if event_info is not None else NULL + ) _object_mapping_register("Evas_Smart", SmartObject) --