summaryrefslogtreecommitdiffstats
path: root/Objects/setobject.c
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2015-07-05 17:03:20 (GMT)
committerRaymond Hettinger <python@rcn.com>2015-07-05 17:03:20 (GMT)
commitdc28d5a1986e88057bb44bfeff34296cf4c01f54 (patch)
treeb020461aa42c97da759b26b31c30e704630d9015 /Objects/setobject.c
parentfdf660a866d09974fecd7c1073a980335b24cd39 (diff)
downloadcpython-dc28d5a1986e88057bb44bfeff34296cf4c01f54.zip
cpython-dc28d5a1986e88057bb44bfeff34296cf4c01f54.tar.gz
cpython-dc28d5a1986e88057bb44bfeff34296cf4c01f54.tar.bz2
Clean-up call patterns for add/contains/discard to better match the caller's needs.
Diffstat (limited to 'Objects/setobject.c')
-rw-r--r--Objects/setobject.c69
1 files changed, 33 insertions, 36 deletions
diff --git a/Objects/setobject.c b/Objects/setobject.c
index d0fb4f1..1387812 100644
--- a/Objects/setobject.c
+++ b/Objects/setobject.c
@@ -127,7 +127,7 @@ set_lookkey(PySetObject *so, PyObject *key, Py_hash_t hash)
static int set_table_resize(PySetObject *, Py_ssize_t);
static int
-set_insert_key(PySetObject *so, PyObject *key, Py_hash_t hash)
+set_add_key_hash(PySetObject *so, PyObject *key, Py_hash_t hash)
{
setentry *table = so->table;
setentry *freeslot;
@@ -162,7 +162,7 @@ set_insert_key(PySetObject *so, PyObject *key, Py_hash_t hash)
if (cmp < 0) /* unlikely */
return -1;
if (table != so->table || entry->key != startkey) /* unlikely */
- return set_insert_key(so, key, hash);
+ return set_add_key_hash(so, key, hash);
if (cmp > 0) /* likely */
goto found_active;
mask = so->mask; /* help avoid a register spill */
@@ -190,7 +190,7 @@ set_insert_key(PySetObject *so, PyObject *key, Py_hash_t hash)
if (cmp < 0)
return -1;
if (table != so->table || entry->key != startkey)
- return set_insert_key(so, key, hash);
+ return set_add_key_hash(so, key, hash);
if (cmp > 0)
goto found_active;
mask = so->mask;
@@ -368,7 +368,7 @@ set_table_resize(PySetObject *so, Py_ssize_t minused)
static int
set_add_entry(PySetObject *so, setentry *entry)
{
- return set_insert_key(so, entry->key, entry->hash);
+ return set_add_key_hash(so, entry->key, entry->hash);
}
static int
@@ -382,19 +382,19 @@ set_add_key(PySetObject *so, PyObject *key)
if (hash == -1)
return -1;
}
- return set_insert_key(so, key, hash);
+ return set_add_key_hash(so, key, hash);
}
#define DISCARD_NOTFOUND 0
#define DISCARD_FOUND 1
static int
-set_discard_entry(PySetObject *so, setentry *oldentry)
+set_discard_key_hash(PySetObject *so, PyObject *key, Py_hash_t hash)
{
setentry *entry;
PyObject *old_key;
- entry = set_lookkey(so, oldentry->key, oldentry->hash);
+ entry = set_lookkey(so, key, hash);
if (entry == NULL)
return -1;
if (entry->key == NULL)
@@ -408,9 +408,14 @@ set_discard_entry(PySetObject *so, setentry *oldentry)
}
static int
+set_discard_entry(PySetObject *so, setentry *entry)
+{
+ return set_discard_key_hash(so, entry->key, entry->hash);
+}
+
+static int
set_discard_key(PySetObject *so, PyObject *key)
{
- setentry entry;
Py_hash_t hash;
assert (PyAnySet_Check(so));
@@ -421,9 +426,7 @@ set_discard_key(PySetObject *so, PyObject *key)
if (hash == -1)
return -1;
}
- entry.key = key;
- entry.hash = hash;
- return set_discard_entry(so, &entry);
+ return set_discard_key_hash(so, key, hash);
}
static void
@@ -655,7 +658,7 @@ set_merge(PySetObject *so, PyObject *otherset)
for (i = 0; i <= other->mask; i++, other_entry++) {
key = other_entry->key;
if (key != NULL && key != dummy) {
- if (set_insert_key(so, key, other_entry->hash))
+ if (set_add_key_hash(so, key, other_entry->hash))
return -1;
}
}
@@ -663,16 +666,20 @@ set_merge(PySetObject *so, PyObject *otherset)
}
static int
-set_contains_entry(PySetObject *so, setentry *entry)
+set_contains_key_hash(PySetObject *so, PyObject *key, Py_hash_t hash)
{
- PyObject *key;
setentry *lu_entry;
- lu_entry = set_lookkey(so, entry->key, entry->hash);
- if (lu_entry == NULL)
- return -1;
- key = lu_entry->key;
- return key != NULL;
+ lu_entry = set_lookkey(so, key, hash);
+ if (lu_entry != NULL)
+ return lu_entry->key != NULL;
+ return -1;
+}
+
+static int
+set_contains_entry(PySetObject *so, setentry *entry)
+{
+ return set_contains_key_hash(so, entry->key, entry->hash);
}
static int
@@ -969,7 +976,7 @@ set_update_internal(PySetObject *so, PyObject *other)
return -1;
}
while (_PyDict_Next(other, &pos, &key, &value, &hash)) {
- if (set_insert_key(so, key, hash))
+ if (set_add_key_hash(so, key, hash))
return -1;
}
return 0;
@@ -1291,7 +1298,6 @@ set_intersection(PySetObject *so, PyObject *other)
while ((key = PyIter_Next(it)) != NULL) {
int rv;
- setentry entry;
Py_hash_t hash = PyObject_Hash(key);
if (hash == -1) {
@@ -1300,9 +1306,7 @@ set_intersection(PySetObject *so, PyObject *other)
Py_DECREF(key);
return NULL;
}
- entry.hash = hash;
- entry.key = key;
- rv = set_contains_entry(so, &entry);
+ rv = set_contains_key_hash(so, key, hash);
if (rv < 0) {
Py_DECREF(it);
Py_DECREF(result);
@@ -1310,7 +1314,7 @@ set_intersection(PySetObject *so, PyObject *other)
return NULL;
}
if (rv) {
- if (set_add_entry(result, &entry)) {
+ if (set_add_key_hash(result, key, hash)) {
Py_DECREF(it);
Py_DECREF(result);
Py_DECREF(key);
@@ -1444,7 +1448,6 @@ set_isdisjoint(PySetObject *so, PyObject *other)
while ((key = PyIter_Next(it)) != NULL) {
int rv;
- setentry entry;
Py_hash_t hash = PyObject_Hash(key);
if (hash == -1) {
@@ -1452,9 +1455,7 @@ set_isdisjoint(PySetObject *so, PyObject *other)
Py_DECREF(it);
return NULL;
}
- entry.hash = hash;
- entry.key = key;
- rv = set_contains_entry(so, &entry);
+ rv = set_contains_key_hash(so, key, hash);
Py_DECREF(key);
if (rv < 0) {
Py_DECREF(it);
@@ -1573,7 +1574,7 @@ set_difference(PySetObject *so, PyObject *other)
return NULL;
}
if (!rv) {
- if (set_insert_key((PySetObject *)result, key, hash)) {
+ if (set_add_key_hash((PySetObject *)result, key, hash)) {
Py_DECREF(result);
return NULL;
}
@@ -1662,19 +1663,15 @@ set_symmetric_difference_update(PySetObject *so, PyObject *other)
int rv;
Py_hash_t hash;
while (_PyDict_Next(other, &pos, &key, &value, &hash)) {
- setentry an_entry;
-
Py_INCREF(key);
- an_entry.hash = hash;
- an_entry.key = key;
- rv = set_discard_entry(so, &an_entry);
+ rv = set_discard_key_hash(so, key, hash);
if (rv < 0) {
Py_DECREF(key);
return NULL;
}
if (rv == DISCARD_NOTFOUND) {
- if (set_add_entry(so, &an_entry)) {
+ if (set_add_key_hash(so, key, hash)) {
Py_DECREF(key);
return NULL;
}