Issue #9612: The set object is now 64-bit clean under Windows.

This commit is contained in:
Antoine Pitrou 2010-08-17 17:55:07 +00:00
parent 7ac98ae3b3
commit 671b4d948e
3 changed files with 17 additions and 11 deletions

View file

@ -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;

View file

@ -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.

View file

@ -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;
} }