From 9f1600bc9286b74ea1f7be42c0b50b16ba0962e3 Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Sat, 9 Mar 2013 11:08:36 +0100 Subject: [PATCH] reduce default decoding overhead in Py3 --- Cython/Compiler/ModuleNode.py | 7 +++++-- Cython/Utility/TypeConversion.c | 18 ++++++++++-------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/Cython/Compiler/ModuleNode.py b/Cython/Compiler/ModuleNode.py index b433e9a..aeb2cad 100644 --- a/Cython/Compiler/ModuleNode.py +++ b/Cython/Compiler/ModuleNode.py @@ -562,8 +562,11 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode): if c_string_type != 'bytes' and not c_string_encoding: error(self.pos, "a default encoding must be provided if c_string_type != bytes") code.putln('#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII %s' % int(c_string_encoding == 'ascii')) - code.putln('#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT %s' % int(c_string_encoding == 'default')) - code.putln('#define __PYX_DEFAULT_STRING_ENCODING "%s"' % c_string_encoding) + if c_string_encoding == 'default': + code.putln('#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 1') + else: + code.putln('#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 0') + code.putln('#define __PYX_DEFAULT_STRING_ENCODING "%s"' % c_string_encoding) code.putln('#define __Pyx_PyObject_FromString __Pyx_Py%s_FromString' % c_string_type.title()) code.putln('#define __Pyx_PyObject_FromStringAndSize __Pyx_Py%s_FromStringAndSize' % c_string_type.title()) code.put(UtilityCode.load_as_string("TypeConversions", "TypeConversion.c")[0]) diff --git a/Cython/Utility/TypeConversion.c b/Cython/Utility/TypeConversion.c index 9803c90..81fe6fa 100644 --- a/Cython/Utility/TypeConversion.c +++ b/Cython/Utility/TypeConversion.c @@ -8,7 +8,6 @@ static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* #define __Pyx_PyBytes_FromString PyBytes_FromString #define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(char*); -#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) #if PY_MAJOR_VERSION < 3 #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString @@ -101,10 +100,16 @@ bad: } #endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) + +// __PYX_DEFAULT_STRING_ENCODING is either a user provided string constant +// or we need to look it up here #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT -#undef __PYX_DEFAULT_STRING_ENCODING -#if PY_MAJOR_VERSION < 3 static char* __PYX_DEFAULT_STRING_ENCODING; + static int __Pyx_init_sys_getdefaultencoding_params() { PyObject* sys = NULL; PyObject* default_encoding = NULL; @@ -116,20 +121,17 @@ static int __Pyx_init_sys_getdefaultencoding_params() { default_encoding_c = PyBytes_AS_STRING(default_encoding); __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c)); strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); - Py_XDECREF(sys); - Py_XDECREF(default_encoding); + Py_DECREF(sys); + Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(sys); Py_XDECREF(default_encoding); return -1; } -#else -#define __PYX_DEFAULT_STRING_ENCODING "utf-8" #endif #endif - /////////////// TypeConversions /////////////// /* Type Conversion Functions */ -- 2.7.4