[Python-checkins] python/nondist/sandbox/set setobject.c,1.2,1.3

rhettinger@users.sourceforge.net rhettinger at users.sourceforge.net
Fri Jul 29 21:03:11 CEST 2005


Update of /cvsroot/python/python/nondist/sandbox/set
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4100

Modified Files:
	setobject.c 
Log Message:
* Implement an internal discard function so that client functions don't have
  to check for and clear KeyErrors.

* Simplify code where a contains check is followed by a remove operation.  
  Can be reduced from two lookups to just one.



Index: setobject.c
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/set/setobject.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- setobject.c	27 Jul 2005 23:38:40 -0000	1.2
+++ setobject.c	29 Jul 2005 19:03:00 -0000	1.3
@@ -362,8 +362,14 @@
 	return set_table_resize(mp, mp->ma_used*(mp->ma_used>50000 ? 2 : 4));
 }
 
-int
-set_remove_internal(PySetObject *mp, PyObject *key)
+/* Discard unconditionally removes an entry.
+	Returns 1 if not found
+	Returns 0 if found and removed
+	Returns -1 on hash error
+*/
+
+static int
+set_discard_internal(PySetObject *mp, PyObject *key)
 {
 	register long hash;
 	register setentry *ep;
@@ -378,8 +384,7 @@
 	}
 	ep = (mp->ma_lookup)(mp, key, hash);
 	if (ep->me_key == NULL  ||  ep->me_key == dummy) {   // XXX ? can this be simplified
-		PyErr_SetObject(PyExc_KeyError, key);
-		return -1;
+		return 1;
 	}
 	old_key = ep->me_key;
 	Py_INCREF(dummy);
@@ -389,6 +394,18 @@
 	return 0;
 }
 
+static int
+set_remove_internal(PySetObject *mp, PyObject *key)
+{
+	int rv = set_discard_internal(mp, key);
+
+	if (rv == 1) {
+		PyErr_SetObject(PyExc_KeyError, key);
+		return -1;
+	}
+	return rv;
+}
+
 static void
 set_clear_internal(PySetObject *mp)
 {
@@ -1098,14 +1115,10 @@
 		return NULL;
 
 	while ((item = PyIter_Next(it)) != NULL) {
-		if (set_remove_internal(so, item) == -1) {
-			if (PyErr_ExceptionMatches(PyExc_KeyError))
-				PyErr_Clear();
-			else {
-				Py_DECREF(it);
-				Py_DECREF(item);
-				return NULL;
-			}
+		if (set_discard_internal(so, item) == -1) {
+			Py_DECREF(it);
+			Py_DECREF(item);
+			return NULL;
 		}
 		Py_DECREF(item);
 	}
@@ -1200,11 +1213,12 @@
 
 	if (PyDict_Check(other)) {
 		PyObject *value;
+		int rv;
 		while (PyDict_Next(other, &pos, &key, &value)) {
-			if (set_contains_internal(so, key)) {
-				if (set_remove_internal(so, key) == -1)
-					return NULL;
-			} else {
+			rv = set_discard_internal(so, key);
+			if (rv == -1)
+				return NULL;
+			if (rv == 1) {
 				if (set_add_internal(so, key) == -1)
 					return NULL;
 			}
@@ -1222,12 +1236,12 @@
 	}
 
 	while (set_next_internal(otherset, &pos, &key)) {
-		if (set_contains_internal(so, key)) {
-			if (set_remove_internal(so, key) == -1) {
-				Py_XDECREF(otherset);
-				return NULL;
-			}
-		} else {
+		int rv = set_discard_internal(so, key);
+		if (rv == -1) {
+			Py_XDECREF(otherset);
+			return NULL;
+		}
+		if (rv == 1) {
 			if (set_add_internal(so, key) == -1) {
 				Py_XDECREF(otherset);
 				return NULL;
@@ -1555,11 +1569,8 @@
 		return result;
 	}
 
-	if (set_remove_internal(so, item) == -1) {
-		if (!PyErr_ExceptionMatches(PyExc_KeyError))
-			return NULL;
-		PyErr_Clear();
-	}
+	if (set_discard_internal(so, item) == -1)
+		return NULL;
 	Py_RETURN_NONE;
 }
 



More information about the Python-checkins mailing list