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