Commit 3508e308 authored by Marc-André Lemburg's avatar Marc-André Lemburg

Fix Unicode .join() method to raise a TypeError for sequence

elements which are not Unicode objects or strings. (This matches
the string.join() behaviour.)

Fix a memory leak in the .join() method which occurs in case
the Unicode resize fails.

Restore the test_unicode output.
parent 5e89bd65
test_unicode test_unicode
* <built-in method join of unicode object at 0x81b3ba0> u' ' <class exceptions.TypeError at 0x80fac4c> u'7 hello 123'
Testing Unicode comparisons... done. Testing Unicode comparisons... done.
Testing Unicode contains method... done. Testing Unicode contains method... done.
Testing Unicode formatting strings... done. Testing Unicode formatting strings... done.
......
...@@ -3197,6 +3197,14 @@ PyObject *PyUnicode_Join(PyObject *separator, ...@@ -3197,6 +3197,14 @@ PyObject *PyUnicode_Join(PyObject *separator,
} }
if (!PyUnicode_Check(item)) { if (!PyUnicode_Check(item)) {
PyObject *v; PyObject *v;
if (!PyString_Check(item)) {
PyErr_Format(PyExc_TypeError,
"sequence item %i: expected string or Unicode,"
" %.80s found",
i, item->ob_type->tp_name);
Py_DECREF(item);
goto onError;
}
v = PyUnicode_FromObject(item); v = PyUnicode_FromObject(item);
Py_DECREF(item); Py_DECREF(item);
item = v; item = v;
...@@ -3205,8 +3213,10 @@ PyObject *PyUnicode_Join(PyObject *separator, ...@@ -3205,8 +3213,10 @@ PyObject *PyUnicode_Join(PyObject *separator,
} }
itemlen = PyUnicode_GET_SIZE(item); itemlen = PyUnicode_GET_SIZE(item);
while (reslen + itemlen + seplen >= sz) { while (reslen + itemlen + seplen >= sz) {
if (_PyUnicode_Resize(&res, sz*2)) if (_PyUnicode_Resize(&res, sz*2)) {
Py_DECREF(item);
goto onError; goto onError;
}
sz *= 2; sz *= 2;
p = PyUnicode_AS_UNICODE(res) + reslen; p = PyUnicode_AS_UNICODE(res) + reslen;
} }
......
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