[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