diff -r 0773e5cb8608 Lib/test/test_dict.py --- a/Lib/test/test_dict.py Mon Sep 12 14:43:14 2016 +0200 +++ b/Lib/test/test_dict.py Tue Sep 13 01:41:30 2016 +0800 @@ -856,13 +856,10 @@ """split table must be combined when del d[k]""" a, b = self.make_shared_key_dict(2) - orig_size = sys.getsizeof(a) - - del a['y'] # split table is combined + del a['y'] with self.assertRaises(KeyError): del a['y'] - self.assertGreater(sys.getsizeof(a), orig_size) self.assertEqual(list(a), ['x', 'z']) self.assertEqual(list(b), ['x', 'y', 'z']) @@ -876,13 +873,10 @@ """split table must be combined when d.pop(k)""" a, b = self.make_shared_key_dict(2) - orig_size = sys.getsizeof(a) - - a.pop('y') # split table is combined + a.pop('y') with self.assertRaises(KeyError): a.pop('y') - self.assertGreater(sys.getsizeof(a), orig_size) self.assertEqual(list(a), ['x', 'z']) self.assertEqual(list(b), ['x', 'y', 'z']) diff -r 0773e5cb8608 Objects/dictobject.c --- a/Objects/dictobject.c Mon Sep 12 14:43:14 2016 +0200 +++ b/Objects/dictobject.c Tue Sep 13 01:41:30 2016 +0800 @@ -1550,26 +1550,18 @@ } assert(dk_get_index(mp->ma_keys, hashpos) == ix); - // Split table doesn't allow deletion. Combine it. - if (_PyDict_HasSplitTable(mp)) { - if (dictresize(mp, DK_SIZE(mp->ma_keys))) { - return -1; - } - ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos); - assert(ix>= 0); - } - old_value = *value_addr; - assert(old_value != NULL); *value_addr = NULL; mp->ma_used--; mp->ma_version_tag = DICT_NEXT_VERSION(); - ep = &DK_ENTRIES(mp->ma_keys)[ix]; - dk_set_index(mp->ma_keys, hashpos, DKIX_DUMMY); - ENSURE_ALLOWS_DELETIONS(mp); - old_key = ep->me_key; - ep->me_key = NULL; - Py_DECREF(old_key); + if (!_PyDict_HasSplitTable(mp)) { + ep = &DK_ENTRIES(mp->ma_keys)[ix]; + dk_set_index(mp->ma_keys, hashpos, DKIX_DUMMY); + ENSURE_ALLOWS_DELETIONS(mp); + old_key = ep->me_key; + ep->me_key = NULL; + Py_DECREF(old_key); + } Py_DECREF(old_value); return 0; } @@ -1725,7 +1717,7 @@ ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos); if (ix == DKIX_ERROR) return NULL; - if (ix == DKIX_EMPTY) { + if (ix == DKIX_EMPTY || *value_addr == NULL) { if (deflt) { Py_INCREF(deflt); return deflt; @@ -1734,26 +1726,18 @@ return NULL; } - // Split table doesn't allow deletion. Combine it. - if (_PyDict_HasSplitTable(mp)) { - if (dictresize(mp, DK_SIZE(mp->ma_keys))) { - return NULL; - } - ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos); - assert(ix>= 0); - } - old_value = *value_addr; - assert(old_value != NULL); *value_addr = NULL; mp->ma_used--; mp->ma_version_tag = DICT_NEXT_VERSION(); - dk_set_index(mp->ma_keys, hashpos, DKIX_DUMMY); - ep = &DK_ENTRIES(mp->ma_keys)[ix]; - ENSURE_ALLOWS_DELETIONS(mp); - old_key = ep->me_key; - ep->me_key = NULL; - Py_DECREF(old_key); + if (!_PyDict_HasSplitTable(mp)) { + ep = &DK_ENTRIES(mp->ma_keys)[ix]; + dk_set_index(mp->ma_keys, hashpos, DKIX_DUMMY); + ENSURE_ALLOWS_DELETIONS(mp); + old_key = ep->me_key; + ep->me_key = NULL; + Py_DECREF(old_key); + } return old_value; }

AltStyle によって変換されたページ (->オリジナル) /