=== modified file 'Lib/test/test_set.py' --- Lib/test/test_set.py 2008-03-25 06:35:10 +0000 +++ Lib/test/test_set.py 2008-05-07 20:53:03 +0000 @@ -63,7 +63,7 @@ self.assertEqual(c in self.s, c in self.d) self.assertRaises(TypeError, self.s.__contains__, [[]]) s = self.thetype([frozenset(self.letters)]) - self.assert_(self.thetype(self.letters) in s) + self.assert_(frozenset(self.letters) in s) def test_union(self): u = self.s.union(self.otherword) @@ -356,10 +356,10 @@ self.assertRaises(KeyError, self.s.remove, 'Q') self.assertRaises(TypeError, self.s.remove, []) s = self.thetype([frozenset(self.word)]) - self.assert_(self.thetype(self.word) in s) - s.remove(self.thetype(self.word)) - self.assert_(self.thetype(self.word) not in s) - self.assertRaises(KeyError, self.s.remove, self.thetype(self.word)) + self.assert_(frozenset(self.word) in s) + s.remove(frozenset(self.word)) + self.assert_(frozenset(self.word) not in s) + self.assertRaises(KeyError, self.s.remove, frozenset(self.word)) def test_remove_keyerror_unpacking(self): # bug: www.python.org/sf/1576657 @@ -378,10 +378,10 @@ self.s.discard('Q') self.assertRaises(TypeError, self.s.discard, []) s = self.thetype([frozenset(self.word)]) - self.assert_(self.thetype(self.word) in s) - s.discard(self.thetype(self.word)) - self.assert_(self.thetype(self.word) not in s) - s.discard(self.thetype(self.word)) + self.assert_(frozenset(self.word) in s) + s.discard(frozenset(self.word)) + self.assert_(frozenset(self.word) not in s) + s.discard(frozenset(self.word)) def test_pop(self): for i in xrange(len(self.s)): @@ -528,6 +528,13 @@ s.__init__(self.otherword) self.assertEqual(s, set(self.word)) + def test_contains_as_key(self): + for c in self.letters: + self.assertEqual(c in self.s, c in self.d) + self.assertRaises(TypeError, self.s.__contains__, [[]]) + s = self.thetype([frozenset(self.letters)]) + self.assert_(self.thetype(self.letters) in s) + def test_singleton_empty_frozenset(self): f = frozenset() efs = [frozenset(), frozenset([]), frozenset(()), frozenset(''), === modified file 'Objects/setobject.c' --- Objects/setobject.c 2008-02-12 19:05:36 +0000 +++ Objects/setobject.c 2008-05-08 02:40:19 +0000 @@ -1080,10 +1080,8 @@ t=set(a); a.clear(); a.update(b); b.clear(); b.update(t); del t The function always succeeds and it leaves both objects in a stable state. - Useful for creating temporary frozensets from sets for membership testing - in __contains__(), discard(), and remove(). Also useful for operations - that update in-place (by allowing an intermediate result to be swapped - into one of the original inputs). + Useful for operations that update in-place (by allowing an intermediate + result to be swapped into one of the original inputs). */ static void @@ -1093,7 +1091,6 @@ setentry *u; setentry *(*f)(PySetObject *so, PyObject *key, long hash); setentry tab[PySet_MINSIZE]; - long h; t = a->fill; a->fill = b->fill; b->fill = t; t = a->used; a->used = b->used; b->used = t; @@ -1115,13 +1112,8 @@ memcpy(b->smalltable, tab, sizeof(tab)); } - if (PyType_IsSubtype(Py_TYPE(a), &PyFrozenSet_Type) && - PyType_IsSubtype(Py_TYPE(b), &PyFrozenSet_Type)) { - h = a->hash; a->hash = b->hash; b->hash = h; - } else { - a->hash = -1; - b->hash = -1; - } + assert(!PyFrozenSet_Check(a) && !PyFrozenSet_Check(b)); + assert(a->hash == -1 && b->hash == -1); } static PyObject * @@ -1750,23 +1742,7 @@ static int set_contains(PySetObject *so, PyObject *key) { - PyObject *tmpkey; - int rv; - - rv = set_contains_key(so, key); - if (rv == -1) { - if (!PyAnySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError)) - return -1; - PyErr_Clear(); - tmpkey = make_new_set(&PyFrozenSet_Type, NULL); - if (tmpkey == NULL) - return -1; - set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key); - rv = set_contains(so, tmpkey); - set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key); - Py_DECREF(tmpkey); - } - return rv; + return set_contains_key(so, key); } static PyObject * @@ -1785,23 +1761,12 @@ static PyObject * set_remove(PySetObject *so, PyObject *key) { - PyObject *tmpkey, *result; int rv; rv = set_discard_key(so, key); - if (rv == -1) { - if (!PyAnySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError)) - return NULL; - PyErr_Clear(); - tmpkey = make_new_set(&PyFrozenSet_Type, NULL); - if (tmpkey == NULL) - return NULL; - set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key); - result = set_remove(so, tmpkey); - set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key); - Py_DECREF(tmpkey); - return result; - } else if (rv == DISCARD_NOTFOUND) { + if (rv == -1) + return NULL; + else if (rv == DISCARD_NOTFOUND) { set_key_error(key); return NULL; } @@ -1816,23 +1781,11 @@ static PyObject * set_discard(PySetObject *so, PyObject *key) { - PyObject *tmpkey, *result; int rv; rv = set_discard_key(so, key); - if (rv == -1) { - if (!PyAnySet_Check(key) || !PyErr_ExceptionMatches(PyExc_TypeError)) - return NULL; - PyErr_Clear(); - tmpkey = make_new_set(&PyFrozenSet_Type, NULL); - if (tmpkey == NULL) - return NULL; - set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key); - result = set_discard(so, tmpkey); - set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key); - Py_DECREF(tmpkey); - return result; - } + if (rv == -1) + return NULL; Py_RETURN_NONE; }