[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