Author: Amaury Forgeot d'Arc <[email protected]>
Branch: 
Changeset: r75867:7063d1a5121f
Date: 2015-02-14 13:11 +0100
http://bitbucket.org/pypy/pypy/changeset/7063d1a5121f/

Log:    Add buffer._pypy_raw_address to memoryview as well. This will help
        python3...

diff --git a/pypy/module/_rawffi/test/test__rawffi.py 
b/pypy/module/_rawffi/test/test__rawffi.py
--- a/pypy/module/_rawffi/test/test__rawffi.py
+++ b/pypy/module/_rawffi/test/test__rawffi.py
@@ -1153,6 +1153,11 @@
         assert buffer(s)._pypy_raw_address() == addr
         assert buffer(s, 10)._pypy_raw_address() == addr + 10
 
+        addr = memoryview(s)._pypy_raw_address()
+        assert type(addr) is int
+        assert memoryview(s)._pypy_raw_address() == addr
+        assert memoryview(s)[10:]._pypy_raw_address() == addr + 10
+
     def test_union(self):
         import _rawffi
         longsize = _rawffi.sizeof('l')
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
@@ -121,6 +121,17 @@
         # I've never seen anyone filling this field
         return space.w_None
 
+    def descr_pypy_raw_address(self, space):
+        from rpython.rtyper.lltypesystem import lltype, rffi
+        try:
+            ptr = self.buf.get_raw_address()
+        except ValueError:
+            # report the error using the RPython-level internal repr of 
self.buf
+            msg = ("cannot find the underlying address of buffer that "
+                   "is internally %r" % (self.buf,))
+            raise OperationError(space.w_ValueError, space.wrap(msg))
+        return space.wrap(rffi.cast(lltype.Signed, ptr))
+
 W_MemoryView.typedef = TypeDef(
     "memoryview",
     __doc__ = """\
@@ -145,5 +156,6 @@
     shape       = GetSetProperty(W_MemoryView.w_get_shape),
     strides     = GetSetProperty(W_MemoryView.w_get_strides),
     suboffsets  = GetSetProperty(W_MemoryView.w_get_suboffsets),
+    _pypy_raw_address = interp2app(W_MemoryView.descr_pypy_raw_address),
     )
 W_MemoryView.typedef.acceptable_as_base_class = False
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
@@ -54,3 +54,8 @@
         assert memoryview("abc") != u"abc"
         assert not u"abc" == memoryview("abc")
         assert u"abc" != memoryview("abc")
+
+    def test_pypy_raw_address_base(self):
+        raises(ValueError, memoryview("foobar")._pypy_raw_address)
+        e = raises(ValueError, 
memoryview(bytearray("foobar"))._pypy_raw_address)
+        assert 'BytearrayBuffer' in str(e.value)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to