mirror of https://github.com/python/cpython
Change add/contains/discard calls to pass the key and hash instead of an entry struct.
This commit is contained in:
parent
14806c4b86
commit
73799b181e
|
@ -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_table_resize(PySetObject *, Py_ssize_t);
|
||||||
|
|
||||||
static int
|
static int
|
||||||
set_add_key_hash(PySetObject *so, PyObject *key, Py_hash_t hash)
|
set_add_entry(PySetObject *so, PyObject *key, Py_hash_t hash)
|
||||||
{
|
{
|
||||||
setentry *table = so->table;
|
setentry *table = so->table;
|
||||||
setentry *freeslot;
|
setentry *freeslot;
|
||||||
|
@ -162,7 +162,7 @@ set_add_key_hash(PySetObject *so, PyObject *key, Py_hash_t hash)
|
||||||
if (cmp < 0) /* unlikely */
|
if (cmp < 0) /* unlikely */
|
||||||
return -1;
|
return -1;
|
||||||
if (table != so->table || entry->key != startkey) /* unlikely */
|
if (table != so->table || entry->key != startkey) /* unlikely */
|
||||||
return set_add_key_hash(so, key, hash);
|
return set_add_entry(so, key, hash);
|
||||||
if (cmp > 0) /* likely */
|
if (cmp > 0) /* likely */
|
||||||
goto found_active;
|
goto found_active;
|
||||||
mask = so->mask; /* help avoid a register spill */
|
mask = so->mask; /* help avoid a register spill */
|
||||||
|
@ -190,7 +190,7 @@ set_add_key_hash(PySetObject *so, PyObject *key, Py_hash_t hash)
|
||||||
if (cmp < 0)
|
if (cmp < 0)
|
||||||
return -1;
|
return -1;
|
||||||
if (table != so->table || entry->key != startkey)
|
if (table != so->table || entry->key != startkey)
|
||||||
return set_add_key_hash(so, key, hash);
|
return set_add_entry(so, key, hash);
|
||||||
if (cmp > 0)
|
if (cmp > 0)
|
||||||
goto found_active;
|
goto found_active;
|
||||||
mask = so->mask;
|
mask = so->mask;
|
||||||
|
@ -365,12 +365,6 @@ set_table_resize(PySetObject *so, Py_ssize_t minused)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
set_add_entry(PySetObject *so, setentry *entry)
|
|
||||||
{
|
|
||||||
return set_add_key_hash(so, entry->key, entry->hash);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
set_add_key(PySetObject *so, PyObject *key)
|
set_add_key(PySetObject *so, PyObject *key)
|
||||||
{
|
{
|
||||||
|
@ -382,14 +376,14 @@ set_add_key(PySetObject *so, PyObject *key)
|
||||||
if (hash == -1)
|
if (hash == -1)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return set_add_key_hash(so, key, hash);
|
return set_add_entry(so, key, hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DISCARD_NOTFOUND 0
|
#define DISCARD_NOTFOUND 0
|
||||||
#define DISCARD_FOUND 1
|
#define DISCARD_FOUND 1
|
||||||
|
|
||||||
static int
|
static int
|
||||||
set_discard_key_hash(PySetObject *so, PyObject *key, Py_hash_t hash)
|
set_discard_entry(PySetObject *so, PyObject *key, Py_hash_t hash)
|
||||||
{
|
{
|
||||||
setentry *entry;
|
setentry *entry;
|
||||||
PyObject *old_key;
|
PyObject *old_key;
|
||||||
|
@ -407,12 +401,6 @@ set_discard_key_hash(PySetObject *so, PyObject *key, Py_hash_t hash)
|
||||||
return DISCARD_FOUND;
|
return DISCARD_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
set_discard_entry(PySetObject *so, setentry *entry)
|
|
||||||
{
|
|
||||||
return set_discard_key_hash(so, entry->key, entry->hash);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
set_discard_key(PySetObject *so, PyObject *key)
|
set_discard_key(PySetObject *so, PyObject *key)
|
||||||
{
|
{
|
||||||
|
@ -426,7 +414,7 @@ set_discard_key(PySetObject *so, PyObject *key)
|
||||||
if (hash == -1)
|
if (hash == -1)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return set_discard_key_hash(so, key, hash);
|
return set_discard_entry(so, key, hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -658,7 +646,7 @@ set_merge(PySetObject *so, PyObject *otherset)
|
||||||
for (i = 0; i <= other->mask; i++, other_entry++) {
|
for (i = 0; i <= other->mask; i++, other_entry++) {
|
||||||
key = other_entry->key;
|
key = other_entry->key;
|
||||||
if (key != NULL && key != dummy) {
|
if (key != NULL && key != dummy) {
|
||||||
if (set_add_key_hash(so, key, other_entry->hash))
|
if (set_add_entry(so, key, other_entry->hash))
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -666,7 +654,7 @@ set_merge(PySetObject *so, PyObject *otherset)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
set_contains_key_hash(PySetObject *so, PyObject *key, Py_hash_t hash)
|
set_contains_entry(PySetObject *so, PyObject *key, Py_hash_t hash)
|
||||||
{
|
{
|
||||||
setentry *lu_entry;
|
setentry *lu_entry;
|
||||||
|
|
||||||
|
@ -676,12 +664,6 @@ set_contains_key_hash(PySetObject *so, PyObject *key, Py_hash_t hash)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
set_contains_entry(PySetObject *so, setentry *entry)
|
|
||||||
{
|
|
||||||
return set_contains_key_hash(so, entry->key, entry->hash);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
set_contains_key(PySetObject *so, PyObject *key)
|
set_contains_key(PySetObject *so, PyObject *key)
|
||||||
{
|
{
|
||||||
|
@ -976,7 +958,7 @@ set_update_internal(PySetObject *so, PyObject *other)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
while (_PyDict_Next(other, &pos, &key, &value, &hash)) {
|
while (_PyDict_Next(other, &pos, &key, &value, &hash)) {
|
||||||
if (set_add_key_hash(so, key, hash))
|
if (set_add_entry(so, key, hash))
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1256,6 +1238,8 @@ set_intersection(PySetObject *so, PyObject *other)
|
||||||
{
|
{
|
||||||
PySetObject *result;
|
PySetObject *result;
|
||||||
PyObject *key, *it, *tmp;
|
PyObject *key, *it, *tmp;
|
||||||
|
Py_hash_t hash;
|
||||||
|
int rv;
|
||||||
|
|
||||||
if ((PyObject *)so == other)
|
if ((PyObject *)so == other)
|
||||||
return set_copy(so);
|
return set_copy(so);
|
||||||
|
@ -1275,13 +1259,15 @@ set_intersection(PySetObject *so, PyObject *other)
|
||||||
}
|
}
|
||||||
|
|
||||||
while (set_next((PySetObject *)other, &pos, &entry)) {
|
while (set_next((PySetObject *)other, &pos, &entry)) {
|
||||||
int rv = set_contains_entry(so, entry);
|
key = entry->key;
|
||||||
|
hash = entry->hash;
|
||||||
|
rv = set_contains_entry(so, key, hash);
|
||||||
if (rv < 0) {
|
if (rv < 0) {
|
||||||
Py_DECREF(result);
|
Py_DECREF(result);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (rv) {
|
if (rv) {
|
||||||
if (set_add_entry(result, entry)) {
|
if (set_add_entry(result, key, hash)) {
|
||||||
Py_DECREF(result);
|
Py_DECREF(result);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -1297,16 +1283,14 @@ set_intersection(PySetObject *so, PyObject *other)
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((key = PyIter_Next(it)) != NULL) {
|
while ((key = PyIter_Next(it)) != NULL) {
|
||||||
int rv;
|
hash = PyObject_Hash(key);
|
||||||
Py_hash_t hash = PyObject_Hash(key);
|
|
||||||
|
|
||||||
if (hash == -1) {
|
if (hash == -1) {
|
||||||
Py_DECREF(it);
|
Py_DECREF(it);
|
||||||
Py_DECREF(result);
|
Py_DECREF(result);
|
||||||
Py_DECREF(key);
|
Py_DECREF(key);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
rv = set_contains_key_hash(so, key, hash);
|
rv = set_contains_entry(so, key, hash);
|
||||||
if (rv < 0) {
|
if (rv < 0) {
|
||||||
Py_DECREF(it);
|
Py_DECREF(it);
|
||||||
Py_DECREF(result);
|
Py_DECREF(result);
|
||||||
|
@ -1314,7 +1298,7 @@ set_intersection(PySetObject *so, PyObject *other)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (rv) {
|
if (rv) {
|
||||||
if (set_add_key_hash(result, key, hash)) {
|
if (set_add_entry(result, key, hash)) {
|
||||||
Py_DECREF(it);
|
Py_DECREF(it);
|
||||||
Py_DECREF(result);
|
Py_DECREF(result);
|
||||||
Py_DECREF(key);
|
Py_DECREF(key);
|
||||||
|
@ -1415,6 +1399,7 @@ static PyObject *
|
||||||
set_isdisjoint(PySetObject *so, PyObject *other)
|
set_isdisjoint(PySetObject *so, PyObject *other)
|
||||||
{
|
{
|
||||||
PyObject *key, *it, *tmp;
|
PyObject *key, *it, *tmp;
|
||||||
|
int rv;
|
||||||
|
|
||||||
if ((PyObject *)so == other) {
|
if ((PyObject *)so == other) {
|
||||||
if (PySet_GET_SIZE(so) == 0)
|
if (PySet_GET_SIZE(so) == 0)
|
||||||
|
@ -1433,7 +1418,7 @@ set_isdisjoint(PySetObject *so, PyObject *other)
|
||||||
other = tmp;
|
other = tmp;
|
||||||
}
|
}
|
||||||
while (set_next((PySetObject *)other, &pos, &entry)) {
|
while (set_next((PySetObject *)other, &pos, &entry)) {
|
||||||
int rv = set_contains_entry(so, entry);
|
rv = set_contains_entry(so, entry->key, entry->hash);
|
||||||
if (rv < 0)
|
if (rv < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (rv)
|
if (rv)
|
||||||
|
@ -1447,7 +1432,6 @@ set_isdisjoint(PySetObject *so, PyObject *other)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
while ((key = PyIter_Next(it)) != NULL) {
|
while ((key = PyIter_Next(it)) != NULL) {
|
||||||
int rv;
|
|
||||||
Py_hash_t hash = PyObject_Hash(key);
|
Py_hash_t hash = PyObject_Hash(key);
|
||||||
|
|
||||||
if (hash == -1) {
|
if (hash == -1) {
|
||||||
|
@ -1455,7 +1439,7 @@ set_isdisjoint(PySetObject *so, PyObject *other)
|
||||||
Py_DECREF(it);
|
Py_DECREF(it);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
rv = set_contains_key_hash(so, key, hash);
|
rv = set_contains_entry(so, key, hash);
|
||||||
Py_DECREF(key);
|
Py_DECREF(key);
|
||||||
if (rv < 0) {
|
if (rv < 0) {
|
||||||
Py_DECREF(it);
|
Py_DECREF(it);
|
||||||
|
@ -1486,7 +1470,7 @@ set_difference_update_internal(PySetObject *so, PyObject *other)
|
||||||
Py_ssize_t pos = 0;
|
Py_ssize_t pos = 0;
|
||||||
|
|
||||||
while (set_next((PySetObject *)other, &pos, &entry))
|
while (set_next((PySetObject *)other, &pos, &entry))
|
||||||
if (set_discard_entry(so, entry) < 0)
|
if (set_discard_entry(so, entry->key, entry->hash) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
PyObject *key, *it;
|
PyObject *key, *it;
|
||||||
|
@ -1546,8 +1530,11 @@ static PyObject *
|
||||||
set_difference(PySetObject *so, PyObject *other)
|
set_difference(PySetObject *so, PyObject *other)
|
||||||
{
|
{
|
||||||
PyObject *result;
|
PyObject *result;
|
||||||
|
PyObject *key;
|
||||||
|
Py_hash_t hash;
|
||||||
setentry *entry;
|
setentry *entry;
|
||||||
Py_ssize_t pos = 0;
|
Py_ssize_t pos = 0;
|
||||||
|
int rv;
|
||||||
|
|
||||||
if (!PyAnySet_Check(other) && !PyDict_CheckExact(other)) {
|
if (!PyAnySet_Check(other) && !PyDict_CheckExact(other)) {
|
||||||
return set_copy_and_difference(so, other);
|
return set_copy_and_difference(so, other);
|
||||||
|
@ -1565,16 +1552,15 @@ set_difference(PySetObject *so, PyObject *other)
|
||||||
|
|
||||||
if (PyDict_CheckExact(other)) {
|
if (PyDict_CheckExact(other)) {
|
||||||
while (set_next(so, &pos, &entry)) {
|
while (set_next(so, &pos, &entry)) {
|
||||||
PyObject *key = entry->key;
|
key = entry->key;
|
||||||
Py_hash_t hash = entry->hash;
|
hash = entry->hash;
|
||||||
int rv;
|
|
||||||
rv = _PyDict_Contains(other, key, hash);
|
rv = _PyDict_Contains(other, key, hash);
|
||||||
if (rv < 0) {
|
if (rv < 0) {
|
||||||
Py_DECREF(result);
|
Py_DECREF(result);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (!rv) {
|
if (!rv) {
|
||||||
if (set_add_key_hash((PySetObject *)result, key, hash)) {
|
if (set_add_entry((PySetObject *)result, key, hash)) {
|
||||||
Py_DECREF(result);
|
Py_DECREF(result);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -1585,13 +1571,15 @@ set_difference(PySetObject *so, PyObject *other)
|
||||||
|
|
||||||
/* Iterate over so, checking for common elements in other. */
|
/* Iterate over so, checking for common elements in other. */
|
||||||
while (set_next(so, &pos, &entry)) {
|
while (set_next(so, &pos, &entry)) {
|
||||||
int rv = set_contains_entry((PySetObject *)other, entry);
|
key = entry->key;
|
||||||
|
hash = entry->hash;
|
||||||
|
rv = set_contains_entry((PySetObject *)other, key, hash);
|
||||||
if (rv < 0) {
|
if (rv < 0) {
|
||||||
Py_DECREF(result);
|
Py_DECREF(result);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (!rv) {
|
if (!rv) {
|
||||||
if (set_add_entry((PySetObject *)result, entry)) {
|
if (set_add_entry((PySetObject *)result, key, hash)) {
|
||||||
Py_DECREF(result);
|
Py_DECREF(result);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -1653,25 +1641,24 @@ set_symmetric_difference_update(PySetObject *so, PyObject *other)
|
||||||
PySetObject *otherset;
|
PySetObject *otherset;
|
||||||
PyObject *key;
|
PyObject *key;
|
||||||
Py_ssize_t pos = 0;
|
Py_ssize_t pos = 0;
|
||||||
|
Py_hash_t hash;
|
||||||
setentry *entry;
|
setentry *entry;
|
||||||
|
int rv;
|
||||||
|
|
||||||
if ((PyObject *)so == other)
|
if ((PyObject *)so == other)
|
||||||
return set_clear(so);
|
return set_clear(so);
|
||||||
|
|
||||||
if (PyDict_CheckExact(other)) {
|
if (PyDict_CheckExact(other)) {
|
||||||
PyObject *value;
|
PyObject *value;
|
||||||
int rv;
|
|
||||||
Py_hash_t hash;
|
|
||||||
while (_PyDict_Next(other, &pos, &key, &value, &hash)) {
|
while (_PyDict_Next(other, &pos, &key, &value, &hash)) {
|
||||||
Py_INCREF(key);
|
Py_INCREF(key);
|
||||||
|
rv = set_discard_entry(so, key, hash);
|
||||||
rv = set_discard_key_hash(so, key, hash);
|
|
||||||
if (rv < 0) {
|
if (rv < 0) {
|
||||||
Py_DECREF(key);
|
Py_DECREF(key);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (rv == DISCARD_NOTFOUND) {
|
if (rv == DISCARD_NOTFOUND) {
|
||||||
if (set_add_key_hash(so, key, hash)) {
|
if (set_add_entry(so, key, hash)) {
|
||||||
Py_DECREF(key);
|
Py_DECREF(key);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -1691,13 +1678,15 @@ set_symmetric_difference_update(PySetObject *so, PyObject *other)
|
||||||
}
|
}
|
||||||
|
|
||||||
while (set_next(otherset, &pos, &entry)) {
|
while (set_next(otherset, &pos, &entry)) {
|
||||||
int rv = set_discard_entry(so, entry);
|
key = entry->key;
|
||||||
|
hash = entry->hash;
|
||||||
|
rv = set_discard_entry(so, key, hash);
|
||||||
if (rv < 0) {
|
if (rv < 0) {
|
||||||
Py_DECREF(otherset);
|
Py_DECREF(otherset);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (rv == DISCARD_NOTFOUND) {
|
if (rv == DISCARD_NOTFOUND) {
|
||||||
if (set_add_entry(so, entry)) {
|
if (set_add_entry(so, key, hash)) {
|
||||||
Py_DECREF(otherset);
|
Py_DECREF(otherset);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -1759,6 +1748,7 @@ set_issubset(PySetObject *so, PyObject *other)
|
||||||
{
|
{
|
||||||
setentry *entry;
|
setentry *entry;
|
||||||
Py_ssize_t pos = 0;
|
Py_ssize_t pos = 0;
|
||||||
|
int rv;
|
||||||
|
|
||||||
if (!PyAnySet_Check(other)) {
|
if (!PyAnySet_Check(other)) {
|
||||||
PyObject *tmp, *result;
|
PyObject *tmp, *result;
|
||||||
|
@ -1773,7 +1763,7 @@ set_issubset(PySetObject *so, PyObject *other)
|
||||||
Py_RETURN_FALSE;
|
Py_RETURN_FALSE;
|
||||||
|
|
||||||
while (set_next(so, &pos, &entry)) {
|
while (set_next(so, &pos, &entry)) {
|
||||||
int rv = set_contains_entry((PySetObject *)other, entry);
|
rv = set_contains_entry((PySetObject *)other, entry->key, entry->hash);
|
||||||
if (rv < 0)
|
if (rv < 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (!rv)
|
if (!rv)
|
||||||
|
|
Loading…
Reference in New Issue