Author: Ronan Lamy <ronan.l...@gmail.com>
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
 
+@cts.decl("""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
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to