@@ -296,14 +296,19 @@ def assert_unhashable(self):
296296 return self .assertRaisesRegex (TypeError , err_msg )
297297
298298 def test_empty (self ):
299- for size in (0 , 128 ):
299+ _set_get_table_size = _testcapi ._set_get_table_size
300+
301+ for size in (0 , 1024 ):
300302 with self .subTest (size = size ):
301303 writer = self .create_writer (size )
302304 empty_tuple = ()
303305 writer .update (empty_tuple )
304306 writer .update_array (empty_tuple )
305307 writer .update_array_steal (empty_tuple )
306- self .assertEqual (writer .finish (), frozenset ())
308+ result = writer .finish ()
309+ self .assertEqual (result , frozenset ())
310+ self .assertEqual (_set_get_table_size (result ),
311+ self .PySet_MINSIZE )
307312
308313 def test_get_table_set (self ):
309314 # Test size parameter of PyFrozenSetWriter_Create()
@@ -420,6 +425,24 @@ class MyObject:
420425 writer .update ([obj ])
421426 self .assertTrue (gc .is_tracked (writer .finish ()))
422427
428+ def test_finish_shrink (self ):
429+ # Check that PyFrozenSetWriter_Finish() shrinks the table
430+ # if the frozenset table is way too big
431+ _set_get_table_size = _testcapi ._set_get_table_size
432+
433+ writer = self .create_writer (1024 )
434+ writer .update ([1 ])
435+ result = writer .finish ()
436+ self .assertEqual (result , frozenset ([1 ]))
437+ self .assertEqual (_set_get_table_size (result ), self .PySet_MINSIZE )
438+
439+ items = self .create_items (127 )
440+ writer = self .create_writer (len (items ) * 100 )
441+ writer .update (items )
442+ result = writer .finish ()
443+ self .assertEqual (result , frozenset (items ))
444+ self .assertEqual (_set_get_table_size (result ), 256 )
445+
423446 def test_discard (self ):
424447 # Test PyFrozenSetWriter_Discard(): must not leak memory
425448
0 commit comments