Commit 45c33ce6 authored by Georg Brandl's avatar Georg Brandl

- Issue #3537: Fix an assertion failure when an empty but presized dict

  object was stored in the freelist. (backport from r65637.)
parent 78813dcc
...@@ -454,6 +454,17 @@ class DictTest(unittest.TestCase): ...@@ -454,6 +454,17 @@ class DictTest(unittest.TestCase):
else: else:
self.fail("missing KeyError") self.fail("missing KeyError")
def test_empty_presized_dict_in_freelist(self):
# Bug #3537: if an empty but presized dict with a size larger
# than 7 was in the freelist, it triggered an assertion failure
try:
d = {'a': 1/0, 'b': None, 'c': None, 'd': None, 'e': None,
'f': None, 'g': None, 'h': None}
except ZeroDivisionError:
pass
d = {}
from test import mapping_tests from test import mapping_tests
......
...@@ -12,6 +12,9 @@ What's New in Python 2.5.3? ...@@ -12,6 +12,9 @@ What's New in Python 2.5.3?
Core and builtins Core and builtins
----------------- -----------------
- Issue #3537: Fix an assertion failure when an empty but presized dict
object was stored in the freelist.
- Apply security patches from Apple. - Apply security patches from Apple.
- Issue #2620: Overflow checking when allocating or reallocating memory - Issue #2620: Overflow checking when allocating or reallocating memory
......
...@@ -208,6 +208,10 @@ PyDict_New(void) ...@@ -208,6 +208,10 @@ PyDict_New(void)
_Py_NewReference((PyObject *)mp); _Py_NewReference((PyObject *)mp);
if (mp->ma_fill) { if (mp->ma_fill) {
EMPTY_TO_MINSIZE(mp); EMPTY_TO_MINSIZE(mp);
} else {
/* At least set ma_table and ma_mask; these are wrong
if an empty but presized dict is added to freelist */
INIT_NONZERO_DICT_SLOTS(mp);
} }
assert (mp->ma_used == 0); assert (mp->ma_used == 0);
assert (mp->ma_table == mp->ma_smalltable); assert (mp->ma_table == mp->ma_smalltable);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment