From 19e7d11f61b8a9ee04f21b8460cde7a96b5b5238 Mon Sep 17 00:00:00 2001 From: Kai Huuhko Date: Sat, 26 Oct 2013 02:38:25 +0300 Subject: [PATCH] Resolved Py3 issues. Fixes T459 --- efl/eo/efl.eo.pyx | 7 +++++-- efl/utils/deprecated.pyx | 12 ++++++++++-- efl/utils/logger.pyx | 19 +++++++++++++------ include/efl.utils.logger.pxd | 2 +- 4 files changed, 29 insertions(+), 11 deletions(-) diff --git a/efl/eo/efl.eo.pyx b/efl/eo/efl.eo.pyx index 8e9bbd1..b48a76d 100644 --- a/efl/eo/efl.eo.pyx +++ b/efl/eo/efl.eo.pyx @@ -34,7 +34,7 @@ cdef int PY_EFL_EO_LOG_DOMAIN = add_logger(__name__) def init(): - EINA_LOG_DOM_INFO(PY_EFL_EO_LOG_DOMAIN, "Initializing %s", __name__) + EINA_LOG_DOM_INFO(PY_EFL_EO_LOG_DOMAIN, "Initializing efl.eo", NULL) return eo_init() def shutdown(): @@ -65,7 +65,10 @@ cdef void _object_mapping_register(char *name, object cls) except *: if eina_hash_find(object_mapping, name) != NULL: raise ValueError("Object type name '%s' already registered." % name) - EINA_LOG_DOM_DBG(PY_EFL_EO_LOG_DOMAIN, "REGISTER: %s => %s", name, cls.__name__) + cdef object cls_name = cls.__name__ + if isinstance(cls_name, unicode): cls_name = PyUnicode_AsUTF8String(cls_name) + + EINA_LOG_DOM_DBG(PY_EFL_EO_LOG_DOMAIN, "REGISTER: %s => %s", name, cls_name) eina_hash_add(object_mapping, name, cls) diff --git a/efl/utils/deprecated.pyx b/efl/utils/deprecated.pyx index 9cf46b4..2b57260 100644 --- a/efl/utils/deprecated.pyx +++ b/efl/utils/deprecated.pyx @@ -2,6 +2,8 @@ import traceback import types from functools import update_wrapper +from cpython cimport PY_VERSION_HEX, PyUnicode_AsUTF8String + from efl.eina cimport EINA_LOG_DOM_WARN from efl.utils.logger cimport PY_EFL_LOG_DOMAIN @@ -33,7 +35,10 @@ class WRAPPER(object): self.message = message def __get__(self, obj, objtype): - return types.MethodType(self, obj, objtype) + if PY_VERSION_HEX < 0x03000000: + return types.MethodType(self, obj, objtype) + else: + return types.MethodType(self, obj) def __call__(self, *args, **kwargs): cdef: @@ -58,6 +63,9 @@ class WRAPPER(object): if self.message is not None: msg += " " + self.message - EINA_LOG_DOM_WARN(PY_EFL_LOG_DOMAIN, msg, NULL) + msg2 = msg + if isinstance(msg2, unicode): msg2 = PyUnicode_AsUTF8String(msg2) + + EINA_LOG_DOM_WARN(PY_EFL_LOG_DOMAIN, msg2, NULL) return self.f(*args, **kwargs) diff --git a/efl/utils/logger.pyx b/efl/utils/logger.pyx index 3893bbc..46de4ef 100644 --- a/efl/utils/logger.pyx +++ b/efl/utils/logger.pyx @@ -18,7 +18,9 @@ from libc.string cimport const_char from efl.eina cimport Eina_Log_Domain, const_Eina_Log_Domain, Eina_Log_Level, \ eina_log_print_cb_set, eina_log_domain_register, eina_log_level_set, \ - eina_log_level_get, eina_log_domain_level_get, eina_log_domain_level_set + eina_log_level_get, eina_log_domain_level_get, eina_log_domain_level_set, \ + eina_log_print +from cpython cimport PyUnicode_AsUTF8String cdef extern from "stdarg.h": ctypedef struct va_list: @@ -42,8 +44,9 @@ cdef void py_eina_log_print_cb(const_Eina_Log_Domain *d, const_char *file, const_char *fnc, int line, const_char *fmt, void *data, va_list args) with gil: cdef unicode msg = PyUnicode_FromFormatV(fmt, args) - rec = logging.LogRecord(d.name, log_levels[level], file, line, msg, None, None, fnc) - logger = loggers.get(d.name, loggers["efl"]) + cdef unicode name = d.name.decode("utf-8") + rec = logging.LogRecord(name, log_levels[level], file, line, msg, None, None, fnc) + logger = loggers.get(name, loggers["efl"]) logger.handle(rec) import logging @@ -52,12 +55,16 @@ eina_log_print_cb_set(py_eina_log_print_cb, NULL) class PyEFLLogger(logging.Logger): def __init__(self, name): - self.eina_log_domain = eina_log_domain_register(name, NULL) + cname = name + if isinstance(cname, unicode): cname = PyUnicode_AsUTF8String(cname) + self.eina_log_domain = eina_log_domain_register(cname, NULL) loggers[name] = self logging.Logger.__init__(self, name) def setLevel(self, lvl): - eina_log_domain_level_set(self.name, log_levels.index(lvl)) + cname = self.name + if isinstance(cname, unicode): cname = PyUnicode_AsUTF8String(cname) + eina_log_domain_level_set(cname, log_levels.index(lvl)) logging.Logger.setLevel(self, lvl) logging.setLoggerClass(PyEFLLogger) @@ -71,7 +78,7 @@ logging.setLoggerClass(logging.Logger) cdef public int PY_EFL_LOG_DOMAIN = rootlog.eina_log_domain -cdef int add_logger(char *name): +cdef int add_logger(object name): logging.setLoggerClass(PyEFLLogger) log = logging.getLogger(name) diff --git a/include/efl.utils.logger.pxd b/include/efl.utils.logger.pxd index d09ce6d..1817724 100644 --- a/include/efl.utils.logger.pxd +++ b/include/efl.utils.logger.pxd @@ -1,3 +1,3 @@ cdef: - int add_logger(char *name) + int add_logger(object name) int PY_EFL_LOG_DOMAIN