code.put_finish_refcount_context()
+ if self.entry.is_special and self.entry.name == "__hash__":
+ # Returning -1 for __hash__ is supposed to signal an error
+ # We do as Python instances and coerce -1 into -2.
+ code.putln("if (unlikely(%s == -1) && !PyErr_Occurred()) %s = -2;" % (Naming.retval_cname, Naming.retval_cname))
+
if acquire_gil:
code.putln("PyGILState_Release(_save);")
--- /dev/null
+__doc__ = u"""
+
+ >>> hash(A(5))
+ 5
+ >>> hash(A(-1))
+ -2
+ >>> hash(A(-2))
+ -2
+ >>> hash(A(100))
+ Traceback (most recent call last):
+ ...
+ TypeError: That's kind of a round number...
+
+ >>> __hash__(-1)
+ -1
+"""
+
+cdef class A:
+ cdef long a
+ def __init__(self, a):
+ self.a = a
+ def __hash__(self):
+ if self.a == 100:
+ raise TypeError, "That's kind of a round number..."
+ else:
+ return self.a
+
+cpdef long __hash__(long x):
+ return x