Index: Modules/_sre.c =================================================================== --- Modules/_sre.c (revision 58376) +++ Modules/_sre.c (working copy) @@ -1674,6 +1674,15 @@ void* ptr; Py_buffer view; + /* Unicode objects do not support the buffer API. So, get the data + directly instead. */ + if (PyUnicode_Check(string)) { + ptr = (void *)PyUnicode_AS_DATA(string); + *p_length = PyUnicode_GET_SIZE(string); + *p_charsize = sizeof(Py_UNICODE); + return ptr; + } + /* get pointer to string buffer */ view.len = -1; buffer = Py_Type(string)->tp_as_buffer; Index: Objects/unicodeobject.c =================================================================== --- Objects/unicodeobject.c (revision 58376) +++ Objects/unicodeobject.c (working copy) @@ -8113,19 +8113,6 @@ }; -static int -unicode_buffer_getbuffer(PyUnicodeObject *self, Py_buffer *view, int flags) -{ - - if (flags & PyBUF_CHARACTER) { - PyErr_SetString(PyExc_SystemError, "can't use str as char buffer"); - return -1; - } - return PyBuffer_FillInfo(view, (void *)self->str, - PyUnicode_GET_DATA_SIZE(self), 1, flags); -} - - /* Helpers for PyUnicode_Format() */ static PyObject * @@ -8819,11 +8806,6 @@ return NULL; } -static PyBufferProcs unicode_as_buffer = { - (getbufferproc) unicode_buffer_getbuffer, - NULL, -}; - static PyObject * unicode_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds); @@ -8907,7 +8889,7 @@ (reprfunc) unicode_str, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ - &unicode_as_buffer, /* tp_as_buffer */ + 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_UNICODE_SUBCLASS, /* tp_flags */ unicode_doc, /* tp_doc */