Author: Ronan Lamy <[email protected]>
Branch: py3.5
Changeset: r91674:1f8f159f1fdf
Date: 2017-07-03 22:34 +0100
http://bitbucket.org/pypy/pypy/changeset/1f8f159f1fdf/
Log: implement PyMemoryView_FromMemory()
diff --git a/pypy/module/cpyext/api.py b/pypy/module/cpyext/api.py
--- a/pypy/module/cpyext/api.py
+++ b/pypy/module/cpyext/api.py
@@ -126,7 +126,7 @@
Py_TPFLAGS_HEAPTYPE
Py_LT Py_LE Py_EQ Py_NE Py_GT Py_GE Py_MAX_NDIMS
Py_CLEANUP_SUPPORTED
-PyBUF_FORMAT PyBUF_ND PyBUF_STRIDES PyBUF_WRITABLE PyBUF_SIMPLE
+PyBUF_FORMAT PyBUF_ND PyBUF_STRIDES PyBUF_WRITABLE PyBUF_SIMPLE PyBUF_WRITE
""".split()
for name in constant_names:
setattr(CConfig_constants, name, rffi_platform.ConstantInteger(name))
diff --git a/pypy/module/cpyext/memoryobject.py
b/pypy/module/cpyext/memoryobject.py
--- a/pypy/module/cpyext/memoryobject.py
+++ b/pypy/module/cpyext/memoryobject.py
@@ -7,6 +7,7 @@
from rpython.rtyper.lltypesystem import lltype, rffi
from rpython.rlib.rarithmetic import widen
from pypy.interpreter.error import oefmt
+from pypy.module.cpyext.api import PyBUF_WRITE
from pypy.objspace.std.memoryobject import W_MemoryView
from pypy.module.cpyext.object import _dealloc
from pypy.module.cpyext.import_ import PyImport_Import
@@ -185,6 +186,20 @@
py_memview = make_ref(space, w_memview, w_obj)
return py_memview
[email protected]("""PyObject *
+ PyMemoryView_FromMemory(char *mem, Py_ssize_t size, int flags)""")
+def PyMemoryView_FromMemory(space, mem, size, flags):
+ """Expose a raw memory area as a view of contiguous bytes. flags can be
+ PyBUF_READ or PyBUF_WRITE. view->format is set to "B" (unsigned bytes).
+ The memoryview has complete buffer information.
+ """
+ from pypy.module.cpyext.slotdefs import CPyBuffer
+ readonly = int(widen(flags) == PyBUF_WRITE)
+ view = CPyBuffer(space, cts.cast('void*', mem), size, None,
+ readonly=readonly)
+ w_mview = W_MemoryView(view)
+ return w_mview
+
@cpython_api([Py_bufferP], PyObject, result_is_ll=True)
def PyMemoryView_FromBuffer(space, view):
"""Create a memoryview object wrapping the given buffer structure view.
diff --git a/pypy/module/cpyext/test/test_memoryobject.py
b/pypy/module/cpyext/test/test_memoryobject.py
--- a/pypy/module/cpyext/test/test_memoryobject.py
+++ b/pypy/module/cpyext/test/test_memoryobject.py
@@ -265,3 +265,12 @@
self.debug_collect()
assert module.get_cnt() == 0
assert module.get_dealloc_cnt() == 1
+
+ def test_FromMemory(self):
+ module = self.import_extension('foo', [
+ ('new', 'METH_NOARGS', """
+ static char s[5] = "hello";
+ return PyMemoryView_FromMemory(s, 4, PyBUF_READ);
+ """)])
+ mv = module.new()
+ assert mv.tobytes() == b'hell'
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit