mirror of
https://github.com/python/cpython.git
synced 2025-10-02 21:25:24 +00:00
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:
parent
5e89bd656f
commit
3508e30861
2 changed files with 11 additions and 2 deletions
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue