From 00c94edea0cdc8c490a91dd5455150be8b19d3e2 Mon Sep 17 00:00:00 2001 From: Amaury Forgeot d'Arc Date: Tue, 7 Oct 2008 20:40:09 +0000 Subject: [PATCH] #4069: aSet.remove(otherSet) would always report the empty frozenset([]) as the missing key. Now it correctly refers to the initial otherSet. Backport of r66836. --- Lib/test/test_set.py | 11 +++++++++++ Misc/NEWS | 5 +++++ Objects/setobject.c | 11 +++++++---- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py index 1b01954108e..499406f3c26 100644 --- a/Lib/test/test_set.py +++ b/Lib/test/test_set.py @@ -382,6 +382,17 @@ class TestSet(TestJointOps): else: self.fail() + def test_remove_keyerror_set(self): + key = self.thetype([3, 4]) + try: + self.s.remove(key) + except KeyError as e: + self.assert_(e.args[0] is key, + "KeyError should be {0}, not {1}".format(key, + e.args[0])) + else: + self.fail() + def test_discard(self): self.s.discard('a') self.assert_('a' not in self.s) diff --git a/Misc/NEWS b/Misc/NEWS index aba287cd4b9..ec96dc90d49 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,11 @@ What's New in Python 2.6.1 alpha 1 Core and Builtins ----------------- +- Issue #4069: When set.remove(element) is used with a set element, the element + is temporarily replaced with an equivalent frozenset. But the eventual + KeyError would always report the empty frozenset([]) as the missing key. Now + it correctly refers to the initial element. + - Fixed C99 style comments in several files. Python is now C89 compatible again. diff --git a/Objects/setobject.c b/Objects/setobject.c index 075f8e77063..ea3970e9b70 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1874,7 +1874,7 @@ PyDoc_STRVAR(contains_doc, "x.__contains__(y) <==> y in x."); static PyObject * set_remove(PySetObject *so, PyObject *key) { - PyObject *tmpkey, *result; + PyObject *tmpkey; int rv; rv = set_discard_key(so, key); @@ -1886,11 +1886,14 @@ set_remove(PySetObject *so, PyObject *key) if (tmpkey == NULL) return NULL; set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key); - result = set_remove(so, tmpkey); + rv = set_discard_key(so, tmpkey); set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key); Py_DECREF(tmpkey); - return result; - } else if (rv == DISCARD_NOTFOUND) { + if (rv == -1) + return NULL; + } + + if (rv == DISCARD_NOTFOUND) { set_key_error(key); return NULL; }