Author: Amaury Forgeot d'Arc <[email protected]>
Branch: py3.3
Changeset: r72341:b8bb27a1905f
Date: 2014-06-22 20:34 +0200
http://bitbucket.org/pypy/pypy/changeset/b8bb27a1905f/

Log:    Memoryview objects are now hashable.

diff --git a/pypy/objspace/std/memoryobject.py 
b/pypy/objspace/std/memoryobject.py
--- a/pypy/objspace/std/memoryobject.py
+++ b/pypy/objspace/std/memoryobject.py
@@ -4,6 +4,7 @@
 import operator
 
 from rpython.rlib.buffer import Buffer, SubBuffer
+from rpython.rlib.objectmodel import compute_hash
 from pypy.interpreter.baseobjspace import W_Root
 from pypy.interpreter.error import OperationError, oefmt
 from pypy.interpreter.gateway import interp2app
@@ -34,6 +35,7 @@
     def __init__(self, buf):
         assert isinstance(buf, Buffer)
         self.buf = buf
+        self._hash = -1
 
     def buffer_w(self, space, flags):
         self._check_released(space)
@@ -142,6 +144,15 @@
         else:
             return self.getrepr(space, u'memory')
 
+    def descr_hash(self, space):
+        if self._hash == -1:
+            self._check_released(space)
+            if not self.buf.readonly:
+                raise OperationError(space.w_ValueError, space.wrap(
+                        "cannot hash writable memoryview object"))
+            self._hash = compute_hash(self.buf.as_str())
+        return space.wrap(self._hash)
+
     def descr_release(self, space):
         self.buf = None
 
@@ -171,6 +182,7 @@
     __ne__      = interp2app(W_MemoryView.descr_ne),
     __setitem__ = interp2app(W_MemoryView.descr_setitem),
     __repr__    = interp2app(W_MemoryView.descr_repr),
+    __hash__      = interp2app(W_MemoryView.descr_hash),
     __enter__   = interp2app(W_MemoryView.descr_enter),
     __exit__    = interp2app(W_MemoryView.descr_exit),
     __weakref__ = make_weakref_descr(W_MemoryView),
diff --git a/pypy/objspace/std/test/test_memoryobject.py 
b/pypy/objspace/std/test/test_memoryobject.py
--- a/pypy/objspace/std/test/test_memoryobject.py
+++ b/pypy/objspace/std/test/test_memoryobject.py
@@ -85,7 +85,7 @@
         assert repr(memoryview(b'hello')).startswith('<memory at 0x')
 
     def test_hash(self):
-        raises(TypeError, "hash(memoryview(b'hello'))")
+        assert hash(memoryview(b'hello')) == hash(b'hello')
 
     def test_weakref(self):
         import weakref
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to