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