Author: [email protected]
Branch: ep2016sprint
Changeset: r85828:c6b215318bc9
Date: 2016-07-23 16:36 +0200
http://bitbucket.org/pypy/pypy/changeset/c6b215318bc9/
Log: Issue #2346 : Hashing of -1 did not return -2 as cpython
diff --git a/pypy/objspace/descroperation.py b/pypy/objspace/descroperation.py
--- a/pypy/objspace/descroperation.py
+++ b/pypy/objspace/descroperation.py
@@ -433,8 +433,9 @@
return w_result
elif space.is_w(w_resulttype, space.w_long):
# bug 2346 (return -2 for a hashvalue of -1)
- if space.bigint_w(w_result) == -1:
- return space.hash(space.wrap(-2))
+ w_h = space.hash(w_result)
+ if space.int_w(w_h) == -1:
+ return space.wrap(-2)
return space.hash(w_result)
elif space.isinstance_w(w_result, space.w_int):
# be careful about subclasses of 'int'...
@@ -448,9 +449,10 @@
# be careful about subclasses of 'long'...
bigint = space.bigint_w(w_result)
# bug 2346 (return -2 for a hashvalue of -1)
- if bigint == -1:
- bigint = -2
- return space.wrap(bigint.hash())
+ h = bigint.hash()
+ if h == -1:
+ h = -2
+ return space.wrap(h)
else:
raise oefmt(space.w_TypeError,
"__hash__() should return an int or long")
diff --git a/pypy/objspace/test/test_descriptor.py
b/pypy/objspace/test/test_descriptor.py
--- a/pypy/objspace/test/test_descriptor.py
+++ b/pypy/objspace/test/test_descriptor.py
@@ -152,6 +152,12 @@
class myHashClass(object):
def __hash__(self):
return -1
+ class myHashClass2(object):
+ def __hash__(self):
+ return -1L
+ class myHashClass3(object):
+ def __hash__(self):
+ return -10**100
assert hash(-1) == -2
assert hash(-1L) == -2
@@ -161,3 +167,5 @@
assert hash(mylong(-1)) == -2
assert hash(myfloat(-1.0)) == -2
assert hash(myHashClass()) == -2
+ assert hash(myHashClass2()) == -2
+ assert hash(myHashClass3()) == hash(-10**100)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit