[Python-checkins] python/dist/src/Objects setobject.c,1.46,1.47
rhettinger@users.sourceforge.net
rhettinger at users.sourceforge.net
Fri Aug 12 22:48:50 CEST 2005
Update of /cvsroot/python/python/dist/src/Objects
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1026
Modified Files:
setobject.c
Log Message:
* Fix SF #1257731. Make __contains__(), remove(), and discard() only do
a frozenset conversion when the initial search attempt fails with a
TypeError and the key is some type of set. Add a testcase.
* Eliminate a duplicate if-stmt.
Index: setobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/setobject.c,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -d -r1.46 -r1.47
--- setobject.c 11 Aug 2005 07:58:44 -0000 1.46
+++ setobject.c 12 Aug 2005 20:48:39 -0000 1.47
@@ -932,20 +932,22 @@
set_contains(PySetObject *so, PyObject *key)
{
PyObject *tmpkey;
- int result;
+ int rv;
- result = set_contains_key(so, key);
- if (result == -1 && PyAnySet_Check(key)) {
+ 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);
- result = set_contains_key(so, tmpkey);
+ rv = set_contains(so, tmpkey);
set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
Py_DECREF(tmpkey);
}
- return result;
+ return rv;
}
static PyObject *
@@ -1046,15 +1048,16 @@
if (result == NULL)
return NULL;
- if (PyAnySet_Check(other) && set_len(other) > set_len((PyObject *)so)) {
- tmp = (PyObject *)so;
- so = (PySetObject *)other;
- other = tmp;
- }
-
if (PyAnySet_Check(other)) {
int pos = 0;
setentry *entry;
+
+ if (set_len(other) > set_len((PyObject *)so)) {
+ tmp = (PyObject *)so;
+ so = (PySetObject *)other;
+ other = tmp;
+ }
+
while (set_next((PySetObject *)other, &pos, &entry)) {
if (set_contains_entry(so, entry)) {
if (set_add_entry(result, entry) == -1) {
@@ -1556,21 +1559,20 @@
PyObject *tmpkey, *result;
int rv;
- if (PyType_IsSubtype(key->ob_type, &PySet_Type)) {
+ 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 *)key, (PySetObject *)tmpkey);
+ set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
result = set_remove(so, tmpkey);
- set_swap_bodies((PySetObject *)key, (PySetObject *)tmpkey);
+ set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
Py_DECREF(tmpkey);
return result;
- }
-
- rv = set_discard_key(so, key);
- if (rv == -1)
- return NULL;
- else if (rv == DISCARD_NOTFOUND) {
+ } else if (rv == DISCARD_NOTFOUND) {
PyErr_SetObject(PyExc_KeyError, key);
return NULL;
}
@@ -1586,20 +1588,22 @@
set_discard(PySetObject *so, PyObject *key)
{
PyObject *tmpkey, *result;
+ int rv;
- if (PyType_IsSubtype(key->ob_type, &PySet_Type)) {
+ 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 *)key, (PySetObject *)tmpkey);
+ set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
result = set_discard(so, tmpkey);
- set_swap_bodies((PySetObject *)key, (PySetObject *)tmpkey);
+ set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
Py_DECREF(tmpkey);
return result;
}
-
- if (set_discard_key(so, key) == -1)
- return NULL;
Py_RETURN_NONE;
}
More information about the Python-checkins
mailing list