mirror of https://github.com/python/cpython
(Merge 3.3) Issue #17137: When an Unicode string is resized, the internal wide
character string (wstr) format is now cleared.
This commit is contained in:
commit
cfd2c1b4cc
|
@ -2191,6 +2191,21 @@ class UnicodeTest(string_tests.CommonTest,
|
||||||
self.assertEqual(args[0], text)
|
self.assertEqual(args[0], text)
|
||||||
self.assertEqual(len(args), 1)
|
self.assertEqual(len(args), 1)
|
||||||
|
|
||||||
|
def test_resize(self):
|
||||||
|
for length in range(1, 100, 7):
|
||||||
|
# generate a fresh string (refcount=1)
|
||||||
|
text = 'a' * length + 'b'
|
||||||
|
|
||||||
|
# fill wstr internal field
|
||||||
|
abc = text.encode('unicode_internal')
|
||||||
|
self.assertEqual(abc.decode('unicode_internal'), text)
|
||||||
|
|
||||||
|
# resize text: wstr field must be cleared and then recomputed
|
||||||
|
text += 'c'
|
||||||
|
abcdef = text.encode('unicode_internal')
|
||||||
|
self.assertNotEqual(abc, abcdef)
|
||||||
|
self.assertEqual(abcdef.decode('unicode_internal'), text)
|
||||||
|
|
||||||
|
|
||||||
class StringModuleTest(unittest.TestCase):
|
class StringModuleTest(unittest.TestCase):
|
||||||
def test_formatter_parser(self):
|
def test_formatter_parser(self):
|
||||||
|
|
|
@ -10,6 +10,9 @@ What's New in Python 3.4.0 Alpha 1?
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #17137: When an Unicode string is resized, the internal wide character
|
||||||
|
string (wstr) format is now cleared.
|
||||||
|
|
||||||
- Issue #17043: The unicode-internal decoder no longer read past the end of
|
- Issue #17043: The unicode-internal decoder no longer read past the end of
|
||||||
input buffer.
|
input buffer.
|
||||||
|
|
||||||
|
|
|
@ -717,6 +717,10 @@ resize_compact(PyObject *unicode, Py_ssize_t length)
|
||||||
if (!PyUnicode_IS_ASCII(unicode))
|
if (!PyUnicode_IS_ASCII(unicode))
|
||||||
_PyUnicode_WSTR_LENGTH(unicode) = length;
|
_PyUnicode_WSTR_LENGTH(unicode) = length;
|
||||||
}
|
}
|
||||||
|
else if (_PyUnicode_HAS_WSTR_MEMORY(unicode)) {
|
||||||
|
PyObject_DEL(_PyUnicode_WSTR(unicode));
|
||||||
|
_PyUnicode_WSTR(unicode) = NULL;
|
||||||
|
}
|
||||||
#ifdef Py_DEBUG
|
#ifdef Py_DEBUG
|
||||||
unicode_fill_invalid(unicode, old_length);
|
unicode_fill_invalid(unicode, old_length);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue