diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py index c33461d7dd9..3203d516938 100644 --- a/Lib/test/test_set.py +++ b/Lib/test/test_set.py @@ -35,6 +35,8 @@ class TestJointOps(unittest.TestCase): 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_copy(self): dup = self.s.copy() diff --git a/Objects/setobject.c b/Objects/setobject.c index 88d5640635f..2d77c7485a3 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -104,7 +104,23 @@ set_len(PySetObject *so) static int set_contains(PySetObject *so, PyObject *key) { - return PySequence_Contains(so->data, key); + PyObject *olddict; + PySetObject *tmp; + int result; + + result = PySequence_Contains(so->data, key); + if (result == -1 && PyType_IsSubtype(key->ob_type, &PySet_Type)) { + PyErr_Clear(); + tmp = (PySetObject *)make_new_set(&PyFrozenSet_Type, NULL); + if (tmp == NULL) + return -1; + olddict = tmp->data; + tmp->data = ((PySetObject *)(key))->data; + result = PySequence_Contains(so->data, (PyObject *)tmp); + tmp->data = olddict; + Py_DECREF(tmp); + } + return result; } static PyObject *