Author: Philip Jenvey <pjen...@underboss.org> Branch: py3k Changeset: r83701:32e47f04869f Date: 2016-04-15 18:52 -0700 http://bitbucket.org/pypy/pypy/changeset/32e47f04869f/
Log: merge kunalgrover05/pypy/py3.3-hashfix (pull request #402) 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 @@ -520,21 +520,7 @@ return _new_int(space, w_inttype, w_x, w_base) def descr_hash(self, space): - a = self.intval - 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 wrapint(space, -2 if x == -1 else x) + return space.wrap(_hash_int(self.intval)) def as_w_long(self, space): # XXX: should try smalllong @@ -1028,3 +1014,20 @@ __pow__ = interpindirect2app(W_AbstractIntObject.descr_pow), __rpow__ = interpindirect2app(W_AbstractIntObject.descr_rpow), ) + + +def _hash_int(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 @@ -1,7 +1,7 @@ from pypy.interpreter.error import OperationError from pypy.objspace.std.tupleobject import W_AbstractTupleObject from pypy.objspace.std.util import negate -from rpython.rlib.objectmodel import compute_hash, specialize +from rpython.rlib.objectmodel import specialize from rpython.rlib.rarithmetic import intmask from rpython.rlib.unroll import unrolling_iterable from rpython.tool.sourcetools import func_with_new_name @@ -67,8 +67,14 @@ # 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(value) else: - y = compute_hash(value) + raise NotImplementedError + x = (x ^ y) * mult z -= 1 mult += 82520 + z + z diff --git a/pypy/objspace/std/test/test_specialisedtupleobject.py b/pypy/objspace/std/test/test_specialisedtupleobject.py --- a/pypy/objspace/std/test/test_specialisedtupleobject.py +++ b/pypy/objspace/std/test/test_specialisedtupleobject.py @@ -177,6 +177,11 @@ assert hash(a) == hash((1, 2)) == hash((1.0, 2.0)) == hash((1.0, 2)) + d = tuple([-1, 1]) + e = (-1, 1) + assert d == e + assert hash(d) == hash(e) + def test_getitem(self): t = (5, 3) assert (t)[0] == 5 _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit