[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