FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

Issue #9612: The set object is now 64-bit clean under Windows. · python-emscripten/cpython@671b4d9 · GitHub

Repository navigation

Commit 671b4d9

Browse files
committed
Issue python#9612: The set object is now 64-bit clean under Windows.
1 parent 7ac98ae commit 671b4d9

3 files changed

Lines changed: 17 additions & 11 deletions

File tree

‎Include/setobject.h‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,11 @@ no meaning otherwise.
2222
#define PySet_MINSIZE 8
2323

2424
typedef struct {
25-
long hash; /* cached hash code for the entry key */
25+
/* Cached hash code of the key. Note that hash codes are C longs.
26+
* We have to use Py_ssize_t instead because set_pop() abuses
27+
* the hash field to hold a search finger.
28+
*/
29+
Py_ssize_t hash;
2630
PyObject *key;
2731
} setentry;
2832

‎Misc/NEWS‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ What's New in Python 3.2 Alpha 2?
1212
Core and Builtins
1313
-----------------
1414

15+
- Issue #9612: The set object is now 64-bit clean under Windows.
16+
1517
- Issue #8202: sys.argv[0] is now set to '-m' instead of '-c' when searching
1618
for the module file to be executed with the -m command line option.
1719

‎Objects/setobject.c‎

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ set_table_resize(PySetObject *so, Py_ssize_t minused)
349349
} else {
350350
/* ACTIVE */
351351
--i;
352-
set_insert_clean(so, entry->key, entry->hash);
352+
set_insert_clean(so, entry->key, (long) entry->hash);
353353
}
354354
}
355355

@@ -368,7 +368,7 @@ set_add_entry(register PySetObject *so, setentry *entry)
368368
assert(so->fill <= so->mask); /* at least one empty slot */
369369
n_used = so->used;
370370
Py_INCREF(entry->key);
371-
if (set_insert_key(so, entry->key, entry->hash) == -1) {
371+
if (set_insert_key(so, entry->key, (long) entry->hash) == -1) {
372372
Py_DECREF(entry->key);
373373
return -1;
374374
}
@@ -409,7 +409,7 @@ set_discard_entry(PySetObject *so, setentry *oldentry)
409409
{ register setentry *entry;
410410
PyObject *old_key;
411411

412-
entry = (so->lookup)(so, oldentry->key, oldentry->hash);
412+
entry = (so->lookup)(so, oldentry->key, (long) oldentry->hash);
413413
if (entry == NULL)
414414
return -1;
415415
if (entry->key == NULL || entry->key == dummy)
@@ -660,7 +660,7 @@ set_merge(PySetObject *so, PyObject *otherset)
660660
if (entry->key != NULL &&
661661
entry->key != dummy) {
662662
Py_INCREF(entry->key);
663-
if (set_insert_key(so, entry->key, entry->hash) == -1) {
663+
if (set_insert_key(so, entry->key, (long) entry->hash) == -1) {
664664
Py_DECREF(entry->key);
665665
return -1;
666666
}
@@ -694,7 +694,7 @@ set_contains_entry(PySetObject *so, setentry *entry)
694694
PyObject *key;
695695
setentry *lu_entry;
696696

697-
lu_entry = (so->lookup)(so, entry->key, entry->hash);
697+
lu_entry = (so->lookup)(so, entry->key, (long) entry->hash);
698698
if (lu_entry == NULL)
699699
return -1;
700700
key = lu_entry->key;
@@ -769,14 +769,14 @@ frozenset_hash(PyObject *self)
769769
if (so->hash != -1)
770770
return so->hash;
771771

772-
hash *= PySet_GET_SIZE(self) + 1;
772+
hash *= (long) PySet_GET_SIZE(self) + 1;
773773
while (set_next(so, &pos, &entry)) {
774774
/* Work to increase the bit dispersion for closely spaced hash
775775
values. The is important because some use cases have many
776776
combinations of a small number of elements with nearby
777777
hashes so that many distinct combinations collapse to only
778778
a handful of distinct hash values. */
779-
h = entry->hash;
779+
h = (long) entry->hash;
780780
hash ^= (h ^ (h << 16) ^ 89869747L) * 3644798167u;
781781
}
782782
hash = hash * 69069L + 907133923L;
@@ -816,7 +816,7 @@ setiter_len(setiterobject *si)
816816
Py_ssize_t len = 0;
817817
if (si->si_set != NULL && si->si_used == si->si_set->used)
818818
len = si->len;
819-
return PyLong_FromLong(len);
819+
return PyLong_FromSsize_t(len);
820820
}
821821

822822
PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");
@@ -1547,7 +1547,7 @@ set_difference(PySetObject *so, PyObject *other)
15471547
setentry entrycopy;
15481548
entrycopy.hash = entry->hash;
15491549
entrycopy.key = entry->key;
1550-
if (!_PyDict_Contains(other, entry->key, entry->hash)) {
1550+
if (!_PyDict_Contains(other, entry->key, (long) entry->hash)) {
15511551
if (set_add_entry((PySetObject *)result, &entrycopy) == -1) {
15521552
Py_DECREF(result);
15531553
return NULL;
@@ -2309,7 +2309,7 @@ _PySet_NextEntry(PyObject *set, Py_ssize_t *pos, PyObject **key, long *hash)
23092309
if (set_next((PySetObject *)set, pos, &entry) == 0)
23102310
return 0;
23112311
*key = entry->key;
2312-
*hash = entry->hash;
2312+
*hash = (long) entry->hash;
23132313
return 1;
23142314
}
23152315

0 commit comments

Comments
 (0)

Back | FazBrowse Home | New Git URL