Author: Ronan Lamy <[email protected]>
Branch: py3.5
Changeset: r90316:91d10f04115f
Date: 2017-02-23 04:24 +0000
http://bitbucket.org/pypy/pypy/changeset/91d10f04115f/
Log: Fix handling of C-created 0-D buffers
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
@@ -82,7 +82,7 @@
# Allow subclassing W_MemeoryView
w_type = from_ref(space, rffi.cast(PyObject, obj.c_ob_type))
w_obj = space.allocate_instance(W_MemoryView, w_type)
- w_obj.__init__(buf)
+ w_obj.__init__(buf, itemsize=buf.itemsize)
track_reference(space, obj, w_obj)
return w_obj
diff --git a/pypy/module/cpyext/slotdefs.py b/pypy/module/cpyext/slotdefs.py
--- a/pypy/module/cpyext/slotdefs.py
+++ b/pypy/module/cpyext/slotdefs.py
@@ -320,19 +320,30 @@
self.space = space
self.ptr = ptr
self.size = size
- self.w_obj = w_obj # kept alive
+ self.w_obj = w_obj # kept alive
self.pyobj = make_ref(space, w_obj)
self.format = format
- if shape is None:
- self.shape = [size]
- else:
- self.shape = shape
- if strides is None:
- self.strides = [1]
- else:
- self.strides = strides
self.ndim = ndim
self.itemsize = itemsize
+
+ # cf. Objects/memoryobject.c:init_shape_strides()
+ if ndim == 0:
+ self.shape = []
+ self.strides = []
+ elif ndim == 1:
+ if shape is None:
+ self.shape = [size // itemsize]
+ else:
+ self.shape = shape
+ if strides is None:
+ self.strides = [itemsize]
+ else:
+ self.strides = strides
+ else:
+ assert len(shape) == ndim
+ self.shape = shape
+ # XXX: missing init_strides_from_shape
+ self.strides = strides
self.readonly = readonly
self.releasebufferproc = releasebufferproc
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
@@ -73,6 +73,28 @@
assert b"hello, world." == result
del result
+ def test_0d(self):
+ module = self.import_extension('foo', [
+ ("create_view", "METH_VARARGS",
+ """
+ /* Create an approximation of the buffer for a 0d ndarray */
+ Py_buffer buf;
+ PyObject *str = PyBytes_FromString("hello, world.");
+ buf.buf = PyBytes_AsString(str);
+ buf.obj = str;
+ buf.readonly = 1;
+ buf.len = 13;
+ buf.itemsize = 13;
+ buf.ndim = 0;
+ buf.shape = NULL;
+ PyObject* ret = PyMemoryView_FromBuffer(&buf);
+ return ret;
+ """)])
+ result = module.create_view()
+ assert result.shape == ()
+ assert result.itemsize == 13
+ assert result.tobytes() == b'hello, world.'
+
class AppTestBufferProtocol(AppTestCpythonExtensionBase):
def test_buffer_protocol_app(self):
module = self.import_module(name='buffer_test')
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit