From 9cd6a789c6bd96e89b21b796292138d77d94c5aa Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 18 Jan 2015 16:06:18 -0800 Subject: Clean-up, simplify, and slightly speed-up bounds logic in set_pop(). Elsewhere in the setobject.c code we do a bitwise-and with the mask instead of using a conditional to reset to zero on wrap-around. Using that same technique here use gives cleaner, faster, and more consistent code. --- Objects/setobject.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/Objects/setobject.c b/Objects/setobject.c index 9dc88c8..91f341c 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -658,7 +658,8 @@ set_contains_key(PySetObject *so, PyObject *key) static PyObject * set_pop(PySetObject *so) { - Py_ssize_t i = 0; + /* Make sure the search finger is in bounds */ + Py_ssize_t i = so->finger & so->mask; setentry *entry; PyObject *key; @@ -668,17 +669,9 @@ set_pop(PySetObject *so) return NULL; } - i = so->finger; - /* This may be a legit search finger, or it may be a once legit - * search finger that's out of bounds now (due to wrapping or - * resizing). We simply make sure it's in bounds now. - */ - if (i > so->mask) - i = 0; while ((entry = &so->table[i])->key == NULL || entry->key==dummy) { i++; - if (i > so->mask) - i = 0; + i &= so->mask; } key = entry->key; entry->key = dummy; -- cgit v0.12