diff -r b8a6bc70fc08 Lib/test/test_unicode.py --- a/Lib/test/test_unicode.py Thu Feb 07 17:05:32 2013 +0200 +++ b/Lib/test/test_unicode.py Thu Feb 07 17:15:48 2013 +0100 @@ -7,6 +7,7 @@ Written by Marc-Andre Lemburg (mal@lembu """#" import _string import codecs +import random import struct import sys import unittest @@ -2191,6 +2192,20 @@ class UnicodeTest(string_tests.CommonTes self.assertEqual(args[0], text) 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) + + text += 'c' + abcdef = text.encode('unicode_internal') + self.assertNotEqual(abc, abcdef) + self.assertEqual(abcdef.decode('unicode_internal'), text) + class StringModuleTest(unittest.TestCase): def test_formatter_parser(self): diff -r b8a6bc70fc08 Objects/unicodeobject.c --- a/Objects/unicodeobject.c Thu Feb 07 17:05:32 2013 +0200 +++ b/Objects/unicodeobject.c Thu Feb 07 17:15:48 2013 +0100 @@ -717,6 +717,10 @@ resize_compact(PyObject *unicode, Py_ssi if (!PyUnicode_IS_ASCII(unicode)) _PyUnicode_WSTR_LENGTH(unicode) = length; } + else if (_PyUnicode_HAS_WSTR_MEMORY(unicode)) { + PyObject_DEL(_PyUnicode_WSTR(unicode)); + _PyUnicode_WSTR(unicode) = NULL; + } #ifdef Py_DEBUG unicode_fill_invalid(unicode, old_length); #endif