Author: Devin Jeanpierre <[email protected]>
Branch: cpyext-old-buffers
Changeset: r84498:f499c1a2a12f
Date: 2016-05-16 14:29 -0700
http://bitbucket.org/pypy/pypy/changeset/f499c1a2a12f/

Log:    Add writable buffers and mmap support to cpyext.

diff --git a/pypy/module/cpyext/test/test_abstract.py 
b/pypy/module/cpyext/test/test_abstract.py
--- a/pypy/module/cpyext/test/test_abstract.py
+++ b/pypy/module/cpyext/test/test_abstract.py
@@ -57,7 +57,6 @@
         assert raises(TypeError, buffer_support.writebuffer_as_string, buf)
         assert s == buffer_support.charbuffer_as_string(buf)
 
-    @pytest.mark.xfail
     def test_mmap(self):
         import mmap
         buffer_support = self.get_buffer_support()
@@ -71,6 +70,13 @@
         assert s == buffer_support.writebuffer_as_string(mm)
         assert s == buffer_support.charbuffer_as_string(mm)
 
+        s = '\0' * 3
+        ro_mm = mmap.mmap(-1, 3, access=mmap.ACCESS_READ)
+        assert buffer_support.check_readbuffer(ro_mm)
+        assert s == buffer_support.readbuffer_as_string(ro_mm)
+        assert raises(TypeError, buffer_support.writebuffer_as_string, ro_mm)
+        assert s == buffer_support.charbuffer_as_string(ro_mm)
+
     def test_nonbuffer(self):
         # e.g. int
         buffer_support = self.get_buffer_support()
diff --git a/pypy/module/cpyext/typeobject.py b/pypy/module/cpyext/typeobject.py
--- a/pypy/module/cpyext/typeobject.py
+++ b/pypy/module/cpyext/typeobject.py
@@ -453,7 +453,7 @@
 def bf_getreadbuffer(space, w_buf, segment, ref):
     if segment != 0:
         raise oefmt(space.w_SystemError,
-                    "accessing non-existent string segment")
+                    "accessing non-existent buffer segment")
     buf = space.readbuf_w(w_buf)
     try:
         address = buf.get_raw_address()
@@ -480,6 +480,19 @@
 def bf_getcharbuffer(space, w_buf, segment, ref):
     return bf_getreadbuffer(space, w_buf, segment, rffi.cast(rffi.VOIDPP, ref))
 
+
+@cpython_api([PyObject, Py_ssize_t, rffi.VOIDPP], lltype.Signed,
+             header=None, error=-1)
+def bf_getwritebuffer(space, w_buf, segment, ref):
+    if segment != 0:
+        raise oefmt(space.w_SystemError,
+                    "accessing non-existent segment")
+
+    buf = space.writebuf_w(w_buf)
+    ref[0] = buf.get_raw_address()
+    return len(buf)
+
+
 def setup_buffer_procs(space, w_type, pto):
     bufspec = w_type.layout.typedef.buffer
     if bufspec is None:
@@ -494,7 +507,9 @@
     c_buf.c_bf_getcharbuffer = llhelper(bf_getcharbuffer.api_func.functype,
                                  bf_getcharbuffer.api_func.get_wrapper(space))
     if bufspec == 'read-write':
-        pass  # TODO: write buffer here.
+        c_buf.c_bf_getwritebuffer = llhelper(
+            bf_getwritebuffer.api_func.functype,
+            bf_getwritebuffer.api_func.get_wrapper(space))
     pto.c_tp_as_buffer = c_buf
     pto.c_tp_flags |= Py_TPFLAGS_HAVE_GETCHARBUFFER
 
diff --git a/pypy/module/mmap/interp_mmap.py b/pypy/module/mmap/interp_mmap.py
--- a/pypy/module/mmap/interp_mmap.py
+++ b/pypy/module/mmap/interp_mmap.py
@@ -280,7 +280,7 @@
             raise mmap_error(space, e)
         return space.wrap(self)
 
-W_MMap.typedef = TypeDef("mmap.mmap",
+W_MMap.typedef = TypeDef("mmap.mmap", None, None, "read-write",
     __new__ = interp2app(mmap),
     close = interp2app(W_MMap.close),
     read_byte = interp2app(W_MMap.read_byte),
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to