Author: Kunal Grover <kunalgrove...@gmail.com>
Branch: py3.3-hashfix
Changeset: r83697:7aa21c0ec926
Date: 2016-02-19 00:54 +0530
http://bitbucket.org/pypy/pypy/changeset/7aa21c0ec926/

Log:    Use intobject hash function for specialisedtuple

diff --git a/pypy/objspace/std/intobject.py b/pypy/objspace/std/intobject.py
--- a/pypy/objspace/std/intobject.py
+++ b/pypy/objspace/std/intobject.py
@@ -1028,3 +1028,20 @@
     __pow__ = interpindirect2app(W_AbstractIntObject.descr_pow),
     __rpow__ = interpindirect2app(W_AbstractIntObject.descr_rpow),
 )
+
+
+def _hash_int(space, a):
+    sign = 1
+    if a < 0:
+        sign = -1
+        a = -a
+
+    x = r_uint(a)
+    # efficient x % HASH_MODULUS: as HASH_MODULUS is a Mersenne
+    # prime
+    x = (x & HASH_MODULUS) + (x >> HASH_BITS)
+    if x >= HASH_MODULUS:
+        x -= HASH_MODULUS
+
+    x = intmask(intmask(x) * sign)
+    return -2 if x == -1 else x
diff --git a/pypy/objspace/std/specialisedtupleobject.py 
b/pypy/objspace/std/specialisedtupleobject.py
--- a/pypy/objspace/std/specialisedtupleobject.py
+++ b/pypy/objspace/std/specialisedtupleobject.py
@@ -67,6 +67,11 @@
                     # integer & other less frequent cases
                     from pypy.objspace.std.floatobject import _hash_float
                     y = _hash_float(space, value)
+                elif typetuple[i] == int:
+                    # hash for int which is different from the hash
+                    # given by rpython
+                    from pypy.objspace.std.intobject import _hash_int
+                    y = _hash_int(space, value)
                 else:
                     y = compute_hash(value)
                 x = (x ^ y) * mult
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to