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
* <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 contains method... done.
Testing Unicode formatting strings... done.
......
......@@ -3197,6 +3197,14 @@ PyObject *PyUnicode_Join(PyObject *separator,
}
if (!PyUnicode_Check(item)) {
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);
Py_DECREF(item);
item = v;
......@@ -3205,8 +3213,10 @@ PyObject *PyUnicode_Join(PyObject *separator,
}
itemlen = PyUnicode_GET_SIZE(item);
while (reslen + itemlen + seplen >= sz) {
if (_PyUnicode_Resize(&res, sz*2))
if (_PyUnicode_Resize(&res, sz*2)) {
Py_DECREF(item);
goto onError;
}
sz *= 2;
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