mirror of
https://github.com/python/cpython.git
synced 2025-09-27 02:39:58 +00:00
Issue #9612: The set object is now 64-bit clean under Windows.
This commit is contained in:
parent
7ac98ae3b3
commit
671b4d948e
3 changed files with 17 additions and 11 deletions
|
@ -22,7 +22,11 @@ no meaning otherwise.
|
||||||
#define PySet_MINSIZE 8
|
#define PySet_MINSIZE 8
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
long hash; /* cached hash code for the entry key */
|
/* Cached hash code of the key. Note that hash codes are C longs.
|
||||||
|
* We have to use Py_ssize_t instead because set_pop() abuses
|
||||||
|
* the hash field to hold a search finger.
|
||||||
|
*/
|
||||||
|
Py_ssize_t hash;
|
||||||
PyObject *key;
|
PyObject *key;
|
||||||
} setentry;
|
} setentry;
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,8 @@ What's New in Python 3.2 Alpha 2?
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #9612: The set object is now 64-bit clean under Windows.
|
||||||
|
|
||||||
- Issue #8202: sys.argv[0] is now set to '-m' instead of '-c' when searching
|
- Issue #8202: sys.argv[0] is now set to '-m' instead of '-c' when searching
|
||||||
for the module file to be executed with the -m command line option.
|
for the module file to be executed with the -m command line option.
|
||||||
|
|
||||||
|
|
|
@ -349,7 +349,7 @@ set_table_resize(PySetObject *so, Py_ssize_t minused)
|
||||||
} else {
|
} else {
|
||||||
/* ACTIVE */
|
/* ACTIVE */
|
||||||
--i;
|
--i;
|
||||||
set_insert_clean(so, entry->key, entry->hash);
|
set_insert_clean(so, entry->key, (long) entry->hash);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -368,7 +368,7 @@ set_add_entry(register PySetObject *so, setentry *entry)
|
||||||
assert(so->fill <= so->mask); /* at least one empty slot */
|
assert(so->fill <= so->mask); /* at least one empty slot */
|
||||||
n_used = so->used;
|
n_used = so->used;
|
||||||
Py_INCREF(entry->key);
|
Py_INCREF(entry->key);
|
||||||
if (set_insert_key(so, entry->key, entry->hash) == -1) {
|
if (set_insert_key(so, entry->key, (long) entry->hash) == -1) {
|
||||||
Py_DECREF(entry->key);
|
Py_DECREF(entry->key);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -409,7 +409,7 @@ set_discard_entry(PySetObject *so, setentry *oldentry)
|
||||||
{ register setentry *entry;
|
{ register setentry *entry;
|
||||||
PyObject *old_key;
|
PyObject *old_key;
|
||||||
|
|
||||||
entry = (so->lookup)(so, oldentry->key, oldentry->hash);
|
entry = (so->lookup)(so, oldentry->key, (long) oldentry->hash);
|
||||||
if (entry == NULL)
|
if (entry == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
if (entry->key == NULL || entry->key == dummy)
|
if (entry->key == NULL || entry->key == dummy)
|
||||||
|
@ -660,7 +660,7 @@ set_merge(PySetObject *so, PyObject *otherset)
|
||||||
if (entry->key != NULL &&
|
if (entry->key != NULL &&
|
||||||
entry->key != dummy) {
|
entry->key != dummy) {
|
||||||
Py_INCREF(entry->key);
|
Py_INCREF(entry->key);
|
||||||
if (set_insert_key(so, entry->key, entry->hash) == -1) {
|
if (set_insert_key(so, entry->key, (long) entry->hash) == -1) {
|
||||||
Py_DECREF(entry->key);
|
Py_DECREF(entry->key);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -694,7 +694,7 @@ set_contains_entry(PySetObject *so, setentry *entry)
|
||||||
PyObject *key;
|
PyObject *key;
|
||||||
setentry *lu_entry;
|
setentry *lu_entry;
|
||||||
|
|
||||||
lu_entry = (so->lookup)(so, entry->key, entry->hash);
|
lu_entry = (so->lookup)(so, entry->key, (long) entry->hash);
|
||||||
if (lu_entry == NULL)
|
if (lu_entry == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
key = lu_entry->key;
|
key = lu_entry->key;
|
||||||
|
@ -769,14 +769,14 @@ frozenset_hash(PyObject *self)
|
||||||
if (so->hash != -1)
|
if (so->hash != -1)
|
||||||
return so->hash;
|
return so->hash;
|
||||||
|
|
||||||
hash *= PySet_GET_SIZE(self) + 1;
|
hash *= (long) PySet_GET_SIZE(self) + 1;
|
||||||
while (set_next(so, &pos, &entry)) {
|
while (set_next(so, &pos, &entry)) {
|
||||||
/* Work to increase the bit dispersion for closely spaced hash
|
/* Work to increase the bit dispersion for closely spaced hash
|
||||||
values. The is important because some use cases have many
|
values. The is important because some use cases have many
|
||||||
combinations of a small number of elements with nearby
|
combinations of a small number of elements with nearby
|
||||||
hashes so that many distinct combinations collapse to only
|
hashes so that many distinct combinations collapse to only
|
||||||
a handful of distinct hash values. */
|
a handful of distinct hash values. */
|
||||||
h = entry->hash;
|
h = (long) entry->hash;
|
||||||
hash ^= (h ^ (h << 16) ^ 89869747L) * 3644798167u;
|
hash ^= (h ^ (h << 16) ^ 89869747L) * 3644798167u;
|
||||||
}
|
}
|
||||||
hash = hash * 69069L + 907133923L;
|
hash = hash * 69069L + 907133923L;
|
||||||
|
@ -816,7 +816,7 @@ setiter_len(setiterobject *si)
|
||||||
Py_ssize_t len = 0;
|
Py_ssize_t len = 0;
|
||||||
if (si->si_set != NULL && si->si_used == si->si_set->used)
|
if (si->si_set != NULL && si->si_used == si->si_set->used)
|
||||||
len = si->len;
|
len = si->len;
|
||||||
return PyLong_FromLong(len);
|
return PyLong_FromSsize_t(len);
|
||||||
}
|
}
|
||||||
|
|
||||||
PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
|
PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
|
||||||
|
@ -1547,7 +1547,7 @@ set_difference(PySetObject *so, PyObject *other)
|
||||||
setentry entrycopy;
|
setentry entrycopy;
|
||||||
entrycopy.hash = entry->hash;
|
entrycopy.hash = entry->hash;
|
||||||
entrycopy.key = entry->key;
|
entrycopy.key = entry->key;
|
||||||
if (!_PyDict_Contains(other, entry->key, entry->hash)) {
|
if (!_PyDict_Contains(other, entry->key, (long) entry->hash)) {
|
||||||
if (set_add_entry((PySetObject *)result, &entrycopy) == -1) {
|
if (set_add_entry((PySetObject *)result, &entrycopy) == -1) {
|
||||||
Py_DECREF(result);
|
Py_DECREF(result);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -2309,7 +2309,7 @@ _PySet_NextEntry(PyObject *set, Py_ssize_t *pos, PyObject **key, long *hash)
|
||||||
if (set_next((PySetObject *)set, pos, &entry) == 0)
|
if (set_next((PySetObject *)set, pos, &entry) == 0)
|
||||||
return 0;
|
return 0;
|
||||||
*key = entry->key;
|
*key = entry->key;
|
||||||
*hash = entry->hash;
|
*hash = (long) entry->hash;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue