Commit bbbac2ec authored by Victor Stinner's avatar Victor Stinner

Issue #17137: When an Unicode string is resized, the internal wide character

string (wstr) format is now cleared.
parent 2efdc90b
...@@ -2167,6 +2167,21 @@ class UnicodeTest(string_tests.CommonTest, ...@@ -2167,6 +2167,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):
......
...@@ -12,6 +12,9 @@ What's New in Python 3.3.1? ...@@ -12,6 +12,9 @@ What's New in Python 3.3.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.
......
...@@ -702,6 +702,10 @@ resize_compact(PyObject *unicode, Py_ssize_t length) ...@@ -702,6 +702,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;
}
PyUnicode_WRITE(PyUnicode_KIND(unicode), PyUnicode_DATA(unicode), PyUnicode_WRITE(PyUnicode_KIND(unicode), PyUnicode_DATA(unicode),
length, 0); length, 0);
assert(_PyUnicode_CheckConsistency(unicode, 0)); assert(_PyUnicode_CheckConsistency(unicode, 0));
......
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