mirror of
				https://github.com/python/cpython.git
				synced 2025-11-01 06:01:29 +00:00 
			
		
		
		
	Issue #25709: Fixed problem with in-place string concatenation and utf-8 cache.
This commit is contained in:
		
						commit
						7c088a9b5c
					
				
					 3 changed files with 24 additions and 0 deletions
				
			
		|  | @ -2702,6 +2702,23 @@ def test_compare(self): | |||
|         self.assertTrue(astral >= bmp2) | ||||
|         self.assertFalse(astral >= astral2) | ||||
| 
 | ||||
|     @support.cpython_only | ||||
|     def test_pep393_utf8_caching_bug(self): | ||||
|         # Issue #25709: Problem with string concatenation and utf-8 cache | ||||
|         from _testcapi import getargs_s_hash | ||||
|         for k in 0x24, 0xa4, 0x20ac, 0x1f40d: | ||||
|             s = '' | ||||
|             for i in range(5): | ||||
|                 # Due to CPython specific optimization the 's' string can be | ||||
|                 # resized in-place. | ||||
|                 s += chr(k) | ||||
|                 # Parsing with the "s#" format code calls indirectly | ||||
|                 # PyUnicode_AsUTF8AndSize() which creates the UTF-8 | ||||
|                 # encoded string cached in the Unicode object. | ||||
|                 self.assertEqual(getargs_s_hash(s), chr(k).encode() * (i + 1)) | ||||
|                 # Check that the second call returns the same result | ||||
|                 self.assertEqual(getargs_s_hash(s), chr(k).encode() * (i + 1)) | ||||
| 
 | ||||
| 
 | ||||
| class StringModuleTest(unittest.TestCase): | ||||
|     def test_formatter_parser(self): | ||||
|  |  | |||
|  | @ -10,6 +10,8 @@ Release date: XXXX-XX-XX | |||
| Core and Builtins | ||||
| ----------------- | ||||
| 
 | ||||
| - Issue #25709: Fixed problem with in-place string concatenation and utf-8 cache. | ||||
| 
 | ||||
| - Issue #5319: New Py_FinalizeEx() API allowing Python to set an exit status | ||||
|   of 120 on failure to flush buffered streams. | ||||
| 
 | ||||
|  |  | |||
|  | @ -885,6 +885,11 @@ resize_compact(PyObject *unicode, Py_ssize_t length) | |||
|     } | ||||
|     new_size = (struct_size + (length + 1) * char_size); | ||||
| 
 | ||||
|     if (_PyUnicode_HAS_UTF8_MEMORY(unicode)) { | ||||
|         PyObject_DEL(_PyUnicode_UTF8(unicode)); | ||||
|         _PyUnicode_UTF8(unicode) = NULL; | ||||
|         _PyUnicode_UTF8_LENGTH(unicode) = 0; | ||||
|     } | ||||
|     _Py_DEC_REFTOTAL; | ||||
|     _Py_ForgetReference(unicode); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Serhiy Storchaka
						Serhiy Storchaka