Index: Objects/unicodeobject.c =================================================================== --- Objects/unicodeobject.c (Revision 84223) +++ Objects/unicodeobject.c (Arbeitskopie) @@ -1234,9 +1234,9 @@ const char *encoding, const char *errors) { - const char *s = NULL; - Py_ssize_t len; + Py_buffer char_buffer; PyObject *v; + int buffer_acquired = 0; if (obj == NULL) { PyErr_BadInternalCall(); @@ -1251,36 +1251,35 @@ /* Coerce object */ if (PyBytes_Check(obj)) { - s = PyBytes_AS_STRING(obj); - len = PyBytes_GET_SIZE(obj); + char_buffer.buf = PyBytes_AS_STRING(obj); + char_buffer.len = PyBytes_GET_SIZE(obj); } else if (PyByteArray_Check(obj)) { - s = PyByteArray_AS_STRING(obj); - len = PyByteArray_GET_SIZE(obj); + char_buffer.buf = PyByteArray_AS_STRING(obj); + char_buffer.len = PyByteArray_GET_SIZE(obj); } - else if (PyObject_AsCharBuffer(obj, &s, &len)) { - /* Overwrite the error message with something more useful in - case of a TypeError. */ - if (PyErr_ExceptionMatches(PyExc_TypeError)) + else { + if (PyObject_GetBuffer(obj, &char_buffer, PyBUF_SIMPLE) < 0) { PyErr_Format(PyExc_TypeError, "coercing to str: need bytes, bytearray or char buffer, " "%.80s found", Py_TYPE(obj)->tp_name); - goto onError; + return NULL; + } + buffer_acquired = 1; } /* Convert to Unicode */ - if (len == 0) { + if (char_buffer.len == 0) { Py_INCREF(unicode_empty); v = (PyObject *)unicode_empty; } else - v = PyUnicode_Decode(s, len, encoding, errors); + v = PyUnicode_Decode((char*)char_buffer.buf, char_buffer.len, encoding, errors); + if (buffer_acquired) + PyBuffer_Release(&char_buffer); return v; - - onError: - return NULL; } /* Convert encoding to lower case and replace '_' with '-' in order to