gh-133703: dict: fix calculate_log2_keysize() (GH-133809)

This commit is contained in:
Inada Naoki 2025-05-11 14:44:21 +09:00 committed by GitHub
parent 878e0fb8b4
commit 92337f666e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 6 additions and 7 deletions

View File

@ -1039,10 +1039,8 @@ class C:
a = C()
a.x = 1
d = a.__dict__
before_resize = sys.getsizeof(d)
d[2] = 2 # split table is resized to a generic combined table
self.assertGreater(sys.getsizeof(d), before_resize)
self.assertEqual(list(d), ['x', 2])
def test_iterator_pickling(self):

View File

@ -0,0 +1 @@
Fix hashtable in dict can be bigger than intended in some situations.

View File

@ -547,13 +547,13 @@ static inline uint8_t
calculate_log2_keysize(Py_ssize_t minsize)
{
#if SIZEOF_LONG == SIZEOF_SIZE_T
minsize = (minsize | PyDict_MINSIZE) - 1;
return _Py_bit_length(minsize | (PyDict_MINSIZE-1));
minsize = Py_MAX(minsize, PyDict_MINSIZE);
return _Py_bit_length(minsize - 1);
#elif defined(_MSC_VER)
// On 64bit Windows, sizeof(long) == 4.
minsize = (minsize | PyDict_MINSIZE) - 1;
// On 64bit Windows, sizeof(long) == 4. We cannot use _Py_bit_length.
minsize = Py_MAX(minsize, PyDict_MINSIZE);
unsigned long msb;
_BitScanReverse64(&msb, (uint64_t)minsize);
_BitScanReverse64(&msb, (uint64_t)minsize - 1);
return (uint8_t)(msb + 1);
#else
uint8_t log2_size;