]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #14181: Preserve backwards compatibility for getbufferprocs that a) do
authorStefan Krah <skrah@bytereef.org>
Mon, 5 Mar 2012 16:45:17 +0000 (17:45 +0100)
committerStefan Krah <skrah@bytereef.org>
Mon, 5 Mar 2012 16:45:17 +0000 (17:45 +0100)
not adhere to the new documentation and b) manage to clobber view->obj before
returning failure.

Lib/test/test_buffer.py
Modules/_testbuffer.c
Objects/memoryobject.c

index 533338e018f32050cd80b59492cb5c047bcac888..e0006f23ebacc598f3eb012d00d176789841c5bf 100644 (file)
@@ -3609,6 +3609,12 @@ class TestBufferProtocol(unittest.TestCase):
                     lst=lst)
         del x, y, z, m
 
+    def test_memoryview_getbuffer_undefined(self):
+
+        # getbufferproc does not adhere to the new documentation
+        nd = ndarray([1,2,3], [3], flags=ND_GETBUF_FAIL|ND_GETBUF_UNDEFINED)
+        self.assertRaises(BufferError, memoryview, nd)
+
     def test_issue_7385(self):
         x = ndarray([1,2,3], shape=[3], flags=ND_GETBUF_FAIL)
         self.assertRaises(BufferError, memoryview, x)
index 63f6b5315afbdd12af69a8eae64e166d18491437..cc4aea86fb5a735636013334dc170022d4b4c0eb 100644 (file)
@@ -44,23 +44,21 @@ static PyTypeObject NDArray_Type;
 #define ADJUST_PTR(ptr, suboffsets) \
     (HAVE_PTR(suboffsets) ? *((char**)ptr) + suboffsets[0] : ptr)
 
+/* Default: NumPy style (strides), read-only, no var-export, C-style layout */
+#define ND_DEFAULT          0x000
 /* User configurable flags for the ndarray */
-#define ND_VAREXPORT    0x001   /* change layout while buffers are exported */
-
+#define ND_VAREXPORT        0x001   /* change layout while buffers are exported */
 /* User configurable flags for each base buffer */
-#define ND_WRITABLE     0x002   /* mark base buffer as writable */
-#define ND_FORTRAN      0x004   /* Fortran contiguous layout */
-#define ND_SCALAR       0x008   /* scalar: ndim = 0 */
-#define ND_PIL          0x010   /* convert to PIL-style array (suboffsets) */
-#define ND_GETBUF_FAIL  0x020   /* test issue 7385 */
-#define ND_REDIRECT     0x040   /* redirect buffer requests */
-
-/* Default: NumPy style (strides), read-only, no var-export, C-style layout */
-#define ND_DEFAULT      0x0
-
+#define ND_WRITABLE         0x002   /* mark base buffer as writable */
+#define ND_FORTRAN          0x004   /* Fortran contiguous layout */
+#define ND_SCALAR           0x008   /* scalar: ndim = 0 */
+#define ND_PIL              0x010   /* convert to PIL-style array (suboffsets) */
+#define ND_REDIRECT         0x020   /* redirect buffer requests */
+#define ND_GETBUF_FAIL      0x040   /* trigger getbuffer failure */
+#define ND_GETBUF_UNDEFINED 0x080   /* undefined view.obj */
 /* Internal flags for the base buffer */
-#define ND_C            0x080   /* C contiguous layout (default) */
-#define ND_OWN_ARRAYS   0x100   /* consumer owns arrays */
+#define ND_C                0x100   /* C contiguous layout (default) */
+#define ND_OWN_ARRAYS       0x200   /* consumer owns arrays */
 
 /* ndarray properties */
 #define ND_IS_CONSUMER(nd) \
@@ -1449,6 +1447,8 @@ ndarray_getbuf(NDArrayObject *self, Py_buffer *view, int flags)
     if (baseflags & ND_GETBUF_FAIL) {
         PyErr_SetString(PyExc_BufferError,
             "ND_GETBUF_FAIL: forced test exception");
+        if (baseflags & ND_GETBUF_UNDEFINED)
+            view->obj = (PyObject *)0x1; /* wrong but permitted in <= 3.2 */
         return -1;
     }
 
@@ -2782,6 +2782,7 @@ PyInit__testbuffer(void)
     PyModule_AddIntConstant(m, "ND_SCALAR", ND_SCALAR);
     PyModule_AddIntConstant(m, "ND_PIL", ND_PIL);
     PyModule_AddIntConstant(m, "ND_GETBUF_FAIL", ND_GETBUF_FAIL);
+    PyModule_AddIntConstant(m, "ND_GETBUF_UNDEFINED", ND_GETBUF_UNDEFINED);
     PyModule_AddIntConstant(m, "ND_REDIRECT", ND_REDIRECT);
 
     PyModule_AddIntConstant(m, "PyBUF_SIMPLE", PyBUF_SIMPLE);
index 8ffdd413a65028218235a79c4e25412e80c8e3c3..67f7e01fe28c6f95befdc461aab3634c172455ed 100644 (file)
@@ -86,7 +86,7 @@ _PyManagedBuffer_FromObject(PyObject *base)
         return NULL;
 
     if (PyObject_GetBuffer(base, &mbuf->master, PyBUF_FULL_RO) < 0) {
-        /* mbuf->master.obj must be NULL. */
+        mbuf->master.obj = NULL;
         Py_DECREF(mbuf);
         return NULL;
     }