[pypy-commit] pypy cpyext-from: extend the new Py_bufferBuffer object to expose every field from Py_buffer

plan_rich pypy.commits at gmail.com
Fri Jan 6 06:01:13 EST 2017


Author: Richard Plangger <planrichi at gmail.com>
Branch: cpyext-from
Changeset: r89387:09772a8274ba
Date: 2017-01-06 12:00 +0100
http://bitbucket.org/pypy/pypy/changeset/09772a8274ba/

Log:	extend the new Py_bufferBuffer object to expose every field from
	Py_buffer

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
@@ -208,25 +208,53 @@
     py_mview = rffi.cast(PyMemoryViewObject, as_pyobj(space, w_mview))
 
     view = py_mview.c_view
-    fill_Py_buffer(space, buf, view)
+    #_dup_Py_buffer(space, view, buf)
     view.c_buf = rffi.cast(rffi.VOIDP, buf.get_raw_address())
     # the docs say that in PyMemoryView_FromBuffer (and thus FromObject)
     # this object must be NULL
     view.c_obj = make_ref(space, w_obj)
 
     # XXX what about w_mview.base = w_obj (see cpython 2.7 implementation)
-    return py_mview
+    return w_mview
+
+def _dup_Py_buffer(space, dest, src):
+    if src.c_ndim == 1 and src.c_shape != 0:
+        dest.c_shape = dest.smalltable[0]
+        dest.c_shape[0] = src.smalltable[0]
+    if src.c_ndim == 1 and src.c_strides != 0:
+        dest.strides = dest.smalltable[1]
+        dest.strides[0] = src.strides[0]
 
 class Py_bufferBuffer(Buffer):
-    _attrs_ = ['readonly', 'view']
+    _attrs_ = ['view']
     _immutable_ = True
 
     def __init__(self, view):
         self.view = view
-        self.readonly = view.c_readonly
+
+    @property
+    def readonly(self):
+        return rffi.cast(lltype.Signed, self.view.c_readonly)
+
+    def getformat(self):
+        return self.view.c_format[0]
 
     def getlength(self):
-        return self.view.c_len
+        return rffi.cast(lltype.Signed, self.view.c_len)
+
+    def getndim(self):
+        return rffi.cast(lltype.Signed, self.view.c_ndim)
+
+    def getshape(self):
+        shape = self.view.c_shape
+        return [shape[i] for i in range(self.getndim())]
+
+    def getstrides(self):
+        strides = self.view.c_strides
+        return [strides[i] for i in range(self.getndim())]
+
+    def getitemsize(self):
+        return rffi.cast(lltype.Signed, self.view.c_itemsize)
 
     def get_raw_address(self):
         return self.view.c_buf
@@ -237,9 +265,7 @@
     The memoryview object then owns the buffer, which means you shouldn't
     try to release it yourself: it will be released on deallocation of the
     memoryview object."""
-    w_mview = W_MemoryView(Py_bufferBuffer(view))
-    py_mview = rffi.cast(PyMemoryViewObject, as_pyobj(space, w_mview))
-    return py_mview
+    return W_MemoryView(Py_bufferBuffer(view))
 
 @cpython_api([PyObject], PyObject)
 def PyMemoryView_GET_BASE(space, w_obj):
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
@@ -20,9 +20,8 @@
 
     def test_frombuffer(self, space, api):
         w_buf = space.newbuffer(StringBuffer("hello"))
-        py_memoryview = api.PyMemoryView_FromObject(w_buf)
-        w_memoryview = from_ref(space, py_memoryview)
-        view = api.PyMemoryView_GET_BUFFER(py_memoryview)
+        w_memoryview = api.PyMemoryView_FromObject(w_buf)
+        view = api.PyMemoryView_GET_BUFFER(w_memoryview)
         assert view.c_ndim == 1
         f = rffi.charp2str(view.c_format)
         assert f == 'B'
@@ -31,7 +30,7 @@
         assert view.c_len == 5
         o = rffi.charp2str(view.c_buf)
         assert o == 'hello'
-        w_mv = from_ref(space, api.PyMemoryView_FromBuffer(view))
+        w_mv = api.PyMemoryView_FromBuffer(view)
         for f in ('format', 'itemsize', 'ndim', 'readonly', 
                   'shape', 'strides', 'suboffsets'):
             w_f = space.wrap(f)


More information about the pypy-commit mailing list