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