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

Reply via email to