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