summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorg Brandl <georg@python.org>2008-08-11 09:07:59 (GMT)
committerGeorg Brandl <georg@python.org>2008-08-11 09:07:59 (GMT)
commit1e13ea94a3da9fa2b60c24ff201c5ae69791572d (patch)
treeb5e06ec816e047ea89c5dcd6ad5575d16c2141d0
parent14646337bff978f5eba7f2add21ffbe89e894c7c (diff)
downloadcpython-1e13ea94a3da9fa2b60c24ff201c5ae69791572d.zip
cpython-1e13ea94a3da9fa2b60c24ff201c5ae69791572d.tar.gz
cpython-1e13ea94a3da9fa2b60c24ff201c5ae69791572d.tar.bz2
- Issue #3537: Fix an assertion failure when an empty but presized dict
object was stored in the freelist.
-rw-r--r--Lib/test/test_dict.py11
-rw-r--r--Misc/NEWS3
-rw-r--r--Objects/dictobject.c4
3 files changed, 18 insertions, 0 deletions
diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py
index b62237d..f715657 100644
--- a/Lib/test/test_dict.py
+++ b/Lib/test/test_dict.py
@@ -544,6 +544,17 @@ class DictTest(unittest.TestCase):
resizing = True
d[9] = 6
+ 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
diff --git a/Misc/NEWS b/Misc/NEWS
index a197efc..1c34654 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@ What's New in Python 2.6 beta 3?
Core and Builtins
-----------------
+- Issue #3537: Fix an assertion failure when an empty but presized dict
+ object was stored in the freelist.
+
- Issue #1481296: Make long(float('nan')) and int(float('nan')) raise
ValueError consistently across platforms.
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index 038f373..cc083f1 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -241,6 +241,10 @@ PyDict_New(void)
_Py_NewReference((PyObject *)mp);
if (mp->ma_fill) {
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_table == mp->ma_smalltable);