Commit 6cd70f09 authored by Stefan Behnel's avatar Stefan Behnel

propagate "const char*" that Py3.7 returns from PyUnicode_AsStringAndSize() to...

propagate "const char*" that Py3.7 returns from PyUnicode_AsStringAndSize() to user code and make the casts to "char*" explicit for each assignment/conversion
see https://bugs.python.org/issue28769
parent 9eb978cc
...@@ -2169,15 +2169,17 @@ class CPointerBaseType(CType): ...@@ -2169,15 +2169,17 @@ class CPointerBaseType(CType):
if base_type.signed == 2: if base_type.signed == 2:
self.to_py_function = "__Pyx_PyObject_FromCString" self.to_py_function = "__Pyx_PyObject_FromCString"
if self.is_ptr: if self.is_ptr:
self.from_py_function = "__Pyx_PyObject_AsSString" self.from_py_function = "__Pyx_PyObject_As%sSString"
elif base_type.signed: elif base_type.signed:
self.to_py_function = "__Pyx_PyObject_FromString" self.to_py_function = "__Pyx_PyObject_FromString"
if self.is_ptr: if self.is_ptr:
self.from_py_function = "__Pyx_PyObject_AsString" self.from_py_function = "__Pyx_PyObject_As%sString"
else: else:
self.to_py_function = "__Pyx_PyObject_FromCString" self.to_py_function = "__Pyx_PyObject_FromCString"
if self.is_ptr: if self.is_ptr:
self.from_py_function = "__Pyx_PyObject_AsUString" self.from_py_function = "__Pyx_PyObject_As%sUString"
if self.is_ptr:
self.from_py_function %= '' if self.base_type.is_const else 'Writable'
self.exception_value = "NULL" self.exception_value = "NULL"
elif self.is_pyunicode_ptr and not base_type.is_error: elif self.is_pyunicode_ptr and not base_type.is_error:
self.to_py_function = "__Pyx_PyUnicode_FromUnicode" self.to_py_function = "__Pyx_PyUnicode_FromUnicode"
......
...@@ -7,12 +7,12 @@ cdef extern from *: ...@@ -7,12 +7,12 @@ cdef extern from *:
cdef cppclass string "{{type}}": cdef cppclass string "{{type}}":
string() string()
string(char* c_str, size_t size) string(char* c_str, size_t size)
cdef char* __Pyx_PyObject_AsStringAndSize(object, Py_ssize_t*) except NULL cdef const char* __Pyx_PyObject_AsStringAndSize(object, Py_ssize_t*) except NULL
@cname("{{cname}}") @cname("{{cname}}")
cdef string {{cname}}(object o) except *: cdef string {{cname}}(object o) except *:
cdef Py_ssize_t length cdef Py_ssize_t length
cdef char* data = __Pyx_PyObject_AsStringAndSize(o, &length) cdef const char* data = __Pyx_PyObject_AsStringAndSize(o, &length)
return string(data, length) return string(data, length)
...@@ -27,7 +27,7 @@ cdef extern from *: ...@@ -27,7 +27,7 @@ cdef extern from *:
{{for py_type in ['PyObject', 'PyUnicode', 'PyStr', 'PyBytes', 'PyByteArray']}} {{for py_type in ['PyObject', 'PyUnicode', 'PyStr', 'PyBytes', 'PyByteArray']}}
cdef extern from *: cdef extern from *:
cdef object __Pyx_{{py_type}}_FromStringAndSize(char*, size_t) cdef object __Pyx_{{py_type}}_FromStringAndSize(const char*, size_t)
@cname("{{cname.replace("PyObject", py_type, 1)}}") @cname("{{cname.replace("PyObject", py_type, 1)}}")
cdef inline object {{cname.replace("PyObject", py_type, 1)}}(const string& s): cdef inline object {{cname.replace("PyObject", py_type, 1)}}(const string& s):
......
...@@ -37,8 +37,8 @@ ...@@ -37,8 +37,8 @@
#define __Pyx_sst_abs(value) ((value<0) ? -value : value) #define __Pyx_sst_abs(value) ((value<0) ? -value : value)
#endif #endif
static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject*); static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*);
static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length);
#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) #define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s))
#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) #define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l)
...@@ -54,8 +54,11 @@ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); ...@@ -54,8 +54,11 @@ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*);
#define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize
#endif #endif
#define __Pyx_PyObject_AsSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s))
#define __Pyx_PyObject_AsUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s))
#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s))
#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s))
#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s))
#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) #define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s)
#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) #define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s)
#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) #define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s)
...@@ -189,12 +192,14 @@ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { ...@@ -189,12 +192,14 @@ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) {
return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str));
} }
static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject* o) { // Py3.7 returns a "const char*" for unicode strings
static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) {
Py_ssize_t ignore; Py_ssize_t ignore;
return __Pyx_PyObject_AsStringAndSize(o, &ignore); return __Pyx_PyObject_AsStringAndSize(o, &ignore);
} }
static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { // Py3.7 returns a "const char*" for unicode strings
static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) {
#if CYTHON_COMPILING_IN_CPYTHON && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) #if CYTHON_COMPILING_IN_CPYTHON && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT)
if ( if (
#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
...@@ -228,18 +233,14 @@ static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_ ...@@ -228,18 +233,14 @@ static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_
if (PyUnicode_IS_ASCII(o)) { if (PyUnicode_IS_ASCII(o)) {
// cached for the lifetime of the object // cached for the lifetime of the object
*length = PyUnicode_GET_LENGTH(o); *length = PyUnicode_GET_LENGTH(o);
// Py3.7 returns a "const char*", need to cast to "char*" for backwards compatibility return PyUnicode_AsUTF8(o);
// see https://bugs.python.org/issue28769
return (char*) PyUnicode_AsUTF8(o);
} else { } else {
// raise the error // raise the error
PyUnicode_AsASCIIString(o); PyUnicode_AsASCIIString(o);
return NULL; return NULL;
} }
#else /* __PYX_DEFAULT_STRING_ENCODING_IS_ASCII */ #else /* __PYX_DEFAULT_STRING_ENCODING_IS_ASCII */
// Py3.7 returns a "const char*", need to cast to "char*" for backwards compatibility return PyUnicode_AsUTF8AndSize(o, length);
// see https://bugs.python.org/issue28769
return (char*) PyUnicode_AsUTF8AndSize(o, length);
#endif /* __PYX_DEFAULT_STRING_ENCODING_IS_ASCII */ #endif /* __PYX_DEFAULT_STRING_ENCODING_IS_ASCII */
#endif /* PY_VERSION_HEX < 0x03030000 */ #endif /* PY_VERSION_HEX < 0x03030000 */
} else } else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment