diff options
author | Raymond Hettinger <python@rcn.com> | 2015-07-16 06:52:29 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2015-07-16 06:52:29 (GMT) |
commit | d702044bcdb0678cb0ba96235c43ffcaa737214c (patch) | |
tree | a2388922f676be7b49bd511c638849b0b21802cc | |
parent | 3a2290865972e47d68360af4fed6ad9ef4b4434c (diff) | |
parent | a3626bc5bddf9bf43f33060f4ea1a99f25e0c7f1 (diff) | |
download | cpython-d702044bcdb0678cb0ba96235c43ffcaa737214c.zip cpython-d702044bcdb0678cb0ba96235c43ffcaa737214c.tar.gz cpython-d702044bcdb0678cb0ba96235c43ffcaa737214c.tar.bz2 |
merge
-rw-r--r-- | Lib/test/test_set.py | 13 | ||||
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rw-r--r-- | Objects/setobject.c | 3 |
3 files changed, 17 insertions, 1 deletions
diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py index 9f96f87..54de508 100644 --- a/Lib/test/test_set.py +++ b/Lib/test/test_set.py @@ -1742,6 +1742,19 @@ class TestWeirdBugs(unittest.TestCase): s.update(range(100)) list(si) + def test_merge_and_mutate(self): + class X: + def __hash__(self): + return hash(0) + def __eq__(self, o): + other.clear() + return False + + other = set() + other = {X() for i in range(10)} + s = {0} + s.update(other) + # Application tests (based on David Eppstein's graph recipes ==================================== def powerset(U): @@ -34,6 +34,8 @@ Core and Builtins - Issue #24569: Make PEP 448 dictionary evaluation more consistent. +- Issue #24583: Fix crash when set is mutated while being updated. + - Issue #24407: Fix crash when dict is mutated while being updated. Library diff --git a/Objects/setobject.c b/Objects/setobject.c index e6fb46e..922c619 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -668,7 +668,8 @@ set_merge(PySetObject *so, PyObject *otherset) } /* We can't assure there are no duplicates, so do normal insertions */ - for (i = 0; i <= other->mask; i++, other_entry++) { + for (i = 0; i <= other->mask; i++) { + other_entry = &other->table[i]; key = other_entry->key; if (key != NULL && key != dummy) { if (set_add_entry(so, key, other_entry->hash)) |