[Python-checkins] r51160 - in python/trunk: Doc/ref/ref3.tex Lib/test/test_builtin.py Misc/NEWS Objects/classobject.c Objects/typeobject.c

martin.v.loewis python-checkins at python.org
Wed Aug 9 09:57:42 CEST 2006


Author: martin.v.loewis
Date: Wed Aug 9 09:57:39 2006
New Revision: 51160
Modified:
 python/trunk/Doc/ref/ref3.tex
 python/trunk/Lib/test/test_builtin.py
 python/trunk/Misc/NEWS
 python/trunk/Objects/classobject.c
 python/trunk/Objects/typeobject.c
Log:
__hash__ may now return long int; the final hash
 value is obtained by invoking hash on the long int.
Fixes #1536021.
Modified: python/trunk/Doc/ref/ref3.tex
==============================================================================
--- python/trunk/Doc/ref/ref3.tex	(original)
+++ python/trunk/Doc/ref/ref3.tex	Wed Aug 9 09:57:39 2006
@@ -1307,6 +1307,11 @@
 since the dictionary implementation requires that a key's hash value
 is immutable (if the object's hash value changes, it will be in the
 wrong hash bucket).
+
+\versionchanged[\method{__hash__()} may now also return a long
+integer object; the 32-bit integer is then derived from the hash
+of that object]{2.5}
+
 \withsubitem{(object method)}{\ttindex{__cmp__()}}
 \end{methoddesc}
 
Modified: python/trunk/Lib/test/test_builtin.py
==============================================================================
--- python/trunk/Lib/test/test_builtin.py	(original)
+++ python/trunk/Lib/test/test_builtin.py	Wed Aug 9 09:57:39 2006
@@ -640,6 +640,15 @@
 def f(): pass
 self.assertRaises(TypeError, hash, [])
 self.assertRaises(TypeError, hash, {})
+ # Bug 1536021: Allow hash to return long objects
+ class X:
+ def __hash__(self):
+ return 2**100
+ self.assertEquals(type(hash(X())), int)
+ class Y(object):
+ def __hash__(self):
+ return 2**100
+ self.assertEquals(type(hash(Y())), int)
 
 def test_hex(self):
 self.assertEqual(hex(16), '0x10')
Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Wed Aug 9 09:57:39 2006
@@ -12,6 +12,9 @@
 Core and builtins
 -----------------
 
+- Bug #1536021: __hash__ may now return long int; the final hash
+ value is obtained by invoking hash on the long int.
+
 - Bug #1536786: buffer comparison could emit a RuntimeWarning.
 
 - Bug #1535165: fixed a segfault in input() and raw_input() when
Modified: python/trunk/Objects/classobject.c
==============================================================================
--- python/trunk/Objects/classobject.c	(original)
+++ python/trunk/Objects/classobject.c	Wed Aug 9 09:57:39 2006
@@ -934,11 +934,9 @@
 	Py_DECREF(func);
 	if (res == NULL)
 		return -1;
-	if (PyInt_Check(res)) {
-		outcome = PyInt_AsLong(res);
-		if (outcome == -1)
-			outcome = -2;
-	}
+	if (PyInt_Check(res) || PyLong_Check(res))
+		/* This already converts a -1 result to -2. */
+		outcome = res->ob_type->tp_hash(res);
 	else {
 		PyErr_SetString(PyExc_TypeError,
 				"__hash__() should return an int");
Modified: python/trunk/Objects/typeobject.c
==============================================================================
--- python/trunk/Objects/typeobject.c	(original)
+++ python/trunk/Objects/typeobject.c	Wed Aug 9 09:57:39 2006
@@ -4559,7 +4559,10 @@
 		Py_DECREF(func);
 		if (res == NULL)
 			return -1;
-		h = PyInt_AsLong(res);
+		if (PyLong_Check(res))
+			h = res->ob_type->tp_hash(res);
+		else
+			h = PyInt_AsLong(res);
 		Py_DECREF(res);
 	}
 	else {


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /