Refactor set.discard() and set.remove().
diff --git a/Objects/setobject.c b/Objects/setobject.c
index cc8d25c..82ff683 100644
--- a/Objects/setobject.c
+++ b/Objects/setobject.c
@@ -777,21 +777,19 @@
static PyObject *
set_remove(PySetObject *so, PyObject *item)
{
- PyObject *tmp;
+ PyObject *tmp, *result;
- if (PyDict_DelItem(so->data, item) == -1) {
- if (!PyType_IsSubtype(item->ob_type, &PySet_Type))
- return NULL;
- PyErr_Clear();
+ if (PyType_IsSubtype(item->ob_type, &PySet_Type)) {
tmp = frozenset_dict_wrapper(((PySetObject *)(item))->data);
if (tmp == NULL)
return NULL;
- if (PyDict_DelItem(so->data, tmp) == -1) {
- Py_DECREF(tmp);
- return NULL;
- }
+ result = set_remove(so, tmp);
Py_DECREF(tmp);
+ return result;
}
+
+ if (PyDict_DelItem(so->data, item) == -1)
+ return NULL;
Py_INCREF(Py_None);
return Py_None;
}
@@ -804,28 +802,21 @@
static PyObject *
set_discard(PySetObject *so, PyObject *item)
{
- PyObject *tmp;
+ PyObject *tmp, *result;
+
+ if (PyType_IsSubtype(item->ob_type, &PySet_Type)) {
+ tmp = frozenset_dict_wrapper(((PySetObject *)(item))->data);
+ if (tmp == NULL)
+ return NULL;
+ result = set_discard(so, tmp);
+ Py_DECREF(tmp);
+ return result;
+ }
if (PyDict_DelItem(so->data, item) == -1) {
- if (PyErr_ExceptionMatches(PyExc_KeyError))
- PyErr_Clear();
- else {
- if (!PyType_IsSubtype(item->ob_type, &PySet_Type))
- return NULL;
- PyErr_Clear();
- tmp = frozenset_dict_wrapper(((PySetObject *)(item))->data);
- if (tmp == NULL)
- return NULL;
- if (PyDict_DelItem(so->data, tmp) == -1) {
- if (PyErr_ExceptionMatches(PyExc_KeyError))
- PyErr_Clear();
- else {
- Py_DECREF(tmp);
- return NULL;
- }
- }
- Py_DECREF(tmp);
- }
+ if (!PyErr_ExceptionMatches(PyExc_KeyError))
+ return NULL;
+ PyErr_Clear();
}
Py_INCREF(Py_None);
return Py_None;
@@ -916,7 +907,7 @@
add_doc},
{"clear", (PyCFunction)set_clear, METH_NOARGS,
clear_doc},
- {"__contains__", (PyCFunction)set_direct_contains, METH_O | METH_COEXIST,
+ {"__contains__",(PyCFunction)set_direct_contains, METH_O | METH_COEXIST,
contains_doc},
{"copy", (PyCFunction)set_copy, METH_NOARGS,
copy_doc},
@@ -1044,7 +1035,7 @@
static PyMethodDef frozenset_methods[] = {
- {"__contains__", (PyCFunction)set_direct_contains, METH_O | METH_COEXIST,
+ {"__contains__",(PyCFunction)set_direct_contains, METH_O | METH_COEXIST,
contains_doc},
{"copy", (PyCFunction)frozenset_copy, METH_NOARGS,
copy_doc},