From 54b721d2b013db2a8fec7615e10bef81cc5da7ad Mon Sep 17 00:00:00 2001 From: Robert Bradshaw Date: Wed, 3 Jun 2009 03:17:42 -0700 Subject: [PATCH] Ticket #326, coerce -1 to -2 for __hash__ --- Cython/Compiler/Nodes.py | 5 +++++ tests/run/hash_T326.pyx | 29 +++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 tests/run/hash_T326.pyx diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index 0b572e7e..67d8f2c1 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -1228,6 +1228,11 @@ class FuncDefNode(StatNode, BlockNode): 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);") diff --git a/tests/run/hash_T326.pyx b/tests/run/hash_T326.pyx new file mode 100644 index 00000000..bd850e98 --- /dev/null +++ b/tests/run/hash_T326.pyx @@ -0,0 +1,29 @@ +__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 -- 2.26.2