diff options
| author | Georg Brandl <georg@python.org> | 2008-08-11 09:07:59 (GMT) |
|---|---|---|
| committer | Georg Brandl <georg@python.org> | 2008-08-11 09:07:59 (GMT) |
| commit | 1e13ea94a3da9fa2b60c24ff201c5ae69791572d (patch) | |
| tree | b5e06ec816e047ea89c5dcd6ad5575d16c2141d0 | |
| parent | 14646337bff978f5eba7f2add21ffbe89e894c7c (diff) | |
| download | cpython-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.py | 11 | ||||
| -rw-r--r-- | Misc/NEWS | 3 | ||||
| -rw-r--r-- | Objects/dictobject.c | 4 |
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 @@ -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); |
