@@ -244,39 +244,60 @@ def test_resize(self):
244244 """Test _PyBytes_Resize()"""
245245 _resize = _testcapi .bytes_resize
246246
247- def resize (obj , size , new ):
248- result = _resize (obj , size , new )
249- if 1 <= len (result ):
250- if new or size != len (obj ):
251- # gh-156995: Make sure that the result is a fresh object.
252- # Previously, _PyBytes_Resize(&obj, 1) returned a singleton
253- # if _PyObject_IsUniquelyReferenced() is false.
254- self .assertEqual (sys .getrefcount (result ), 1 )
255- self .assertFalse (sys ._is_immortal (result ))
256- else :
247+ def assert_is_fresh_copy (result , refcnt , is_new_obj ):
248+ self .assertEqual (refcnt , 1 )
249+ self .assertTrue (is_new_obj )
250+ self .assertFalse (sys ._is_immortal (result ))
251+
252+ def resize (obj , size , new , compute_hash = False ):
253+ old_size = len (obj )
254+ result , refcnt , is_new_obj = _resize (obj , size , new ,
255+ compute_hash = compute_hash )
256+
257+ if size == old_size :
258+ # Return the same object unchanged
259+ self .assertFalse (is_new_obj )
260+ elif old_size == 0 :
261+ assert_is_fresh_copy (result , refcnt , is_new_obj )
262+ elif size == 0 :
257263 # check that the result is the empty bytes string singleton
264+ self .assertEqual (result , b'' )
258265 self .assertTrue (sys ._is_immortal (result ))
266+ self .assertTrue (is_new_obj )
267+ elif (not new ) or compute_hash :
268+ # gh-156995: Make sure that the result is a fresh object.
269+ # Previously, _PyBytes_Resize(&obj, 1) returned a singleton
270+ # if _PyObject_IsUniquelyReferenced() is false.
271+ assert_is_fresh_copy (result , refcnt , is_new_obj )
272+ else :
273+ # An in-place resize can return the same memory address, or
274+ # not. 'is_new_obj' cannot be tested.
275+ self .assertEqual (refcnt , 1 )
276+ self .assertFalse (sys ._is_immortal (result ))
277+
259278 return result
260279
261280 for new in True , False :
262- with self .subTest (new = new ):
263- self .assertEqual (resize (b'abc' , 0 , new ), b'' )
264- self .assertEqual (resize (b'abc' , 1 , new ), b'a' )
265- self .assertEqual (resize (b'abc' , 2 , new ), b'ab' )
266- self .assertEqual (resize (b'abc' , 3 , new ), b'abc' )
267- b = resize (b'abc' , 4 , new )
268- self .assertEqual (len (b ), 4 )
269- self .assertEqual (b [:3 ], b'abc' )
270-
271- self .assertEqual (resize (b'a' , 0 , new ), b'' )
272- self .assertEqual (resize (b'a' , 1 , new ), b'a' )
273- b = resize (b'a' , 2 , new )
274- self .assertEqual (len (b ), 2 )
275- self .assertEqual (b [:1 ], b'a' )
276-
277- self .assertEqual (resize (b'' , 0 , new ), b'' )
278- self .assertEqual (len (resize (b'' , 1 , new )), 1 )
279- self .assertEqual (len (resize (b'' , 2 , new )), 2 )
281+ for compute_hash in True , False :
282+ with self .subTest (new = new , compute_hash = compute_hash ):
283+ self .assertEqual (resize (b'abc' , 0 , new , compute_hash ), b'' )
284+ self .assertEqual (resize (b'abc' , 1 , new , compute_hash ), b'a' )
285+ self .assertEqual (resize (b'abc' , 2 , new , compute_hash ), b'ab' )
286+ self .assertEqual (resize (b'abc' , 3 , new , compute_hash ), b'abc' )
287+
288+ b = resize (b'abc' , 4 , new , compute_hash )
289+ self .assertEqual (len (b ), 4 )
290+ self .assertEqual (b [:3 ], b'abc' )
291+
292+ self .assertEqual (resize (b'a' , 0 , new , compute_hash ), b'' )
293+ self .assertEqual (resize (b'a' , 1 , new , compute_hash ), b'a' )
294+ b = resize (b'a' , 2 , new , compute_hash )
295+ self .assertEqual (len (b ), 2 )
296+ self .assertEqual (b [:1 ], b'a' )
297+
298+ self .assertEqual (resize (b'' , 0 , new , compute_hash ), b'' )
299+ self .assertEqual (len (resize (b'' , 1 , new , compute_hash )), 1 )
300+ self .assertEqual (len (resize (b'' , 2 , new , compute_hash )), 2 )
280301
281302 self .assertRaises (SystemError , resize , b'abc' , - 1 , False )
282303 self .assertRaises (SystemError , resize , bytearray (b'abc' ), 3 , False )
0 commit comments