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.
This commit is contained in:
Marc-André Lemburg 2001-09-20 17:22:58 +00:00
parent 5e89bd656f
commit 3508e30861
2 changed files with 11 additions and 2 deletions

View file

@ -1,5 +1,4 @@
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.

View file

@ -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,
} }
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;
} }