[pypy-commit] pypy py3.5-memoryview: hex method for memoryview + tests
plan_rich
pypy.commits at gmail.com
Tue Aug 16 05:14:12 EDT 2016
Author: Richard Plangger <planrichi at gmail.com>
Branch: py3.5-memoryview
Changeset: r86212:8e69fe818876
Date: 2016-08-16 11:13 +0200
http://bitbucket.org/pypy/pypy/changeset/8e69fe818876/
Log: hex method for memoryview + tests
diff --git a/pypy/objspace/std/bytearrayobject.py b/pypy/objspace/std/bytearrayobject.py
--- a/pypy/objspace/std/bytearrayobject.py
+++ b/pypy/objspace/std/bytearrayobject.py
@@ -491,6 +491,24 @@
i += 2
return data
+HEXDIGITS = "0123456789abcdef"
+PY_SIZE_T_MAX = 2**(rffi.sizeof(rffi.SIZE_T)*8)-1
+
+def _array_to_hexstring(space, buf):
+ length = buf.getlength()
+ hexstring = StringBuilder(length*2)
+
+ if length > PY_SIZE_T_MAX/2:
+ raise OperationError(space.w_MemoryError)
+
+ for i in range(length):
+ byte = ord(buf.getitem(i))
+ c = (byte >> 4 & 0xf)
+ hexstring.append(HEXDIGITS[c])
+ c = (byte & 0xf)
+ hexstring.append(HEXDIGITS[c])
+
+ return space.wrap(hexstring.build())
class BytearrayDocstrings:
"""bytearray(iterable_of_ints) -> bytearray
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
@@ -232,6 +232,11 @@
newitemsize = self.get_native_fmtchar(fmt)
return W_MemoryView(self.buf, fmt, newitemsize)
+ def descr_hex(self, space):
+ from pypy.objspace.std.bytearrayobject import _array_to_hexstring
+ self._check_released(space)
+ return _array_to_hexstring(space, self.buf)
+
W_MemoryView.typedef = TypeDef(
"memoryview",
@@ -250,6 +255,7 @@
__exit__ = interp2app(W_MemoryView.descr_exit),
__weakref__ = make_weakref_descr(W_MemoryView),
cast = interp2app(W_MemoryView.descr_cast),
+ hex = interp2app(W_MemoryView.descr_hex),
tobytes = interp2app(W_MemoryView.descr_tobytes),
tolist = interp2app(W_MemoryView.descr_tolist),
release = interp2app(W_MemoryView.descr_release),
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
@@ -18,6 +18,7 @@
assert len(w) == 2
exc = raises(NotImplementedError, "v[0:2:2]")
assert str(exc.value) == ""
+ exc = raises(TypeError, "memoryview('foobar')")
def test_rw(self):
data = bytearray(b'abcefg')
@@ -161,3 +162,6 @@
raises(ValueError, memoryview(b"foobar")._pypy_raw_address)
a = memoryview(bytearray(b"foobar"))._pypy_raw_address()
assert a != 0
+
+ def test_hex(self):
+ assert memoryview(b"abc").hex() == u'616263'
More information about the pypy-commit
mailing list