[Numpy-svn] r8133 - trunk/numpy/core/src/multiarray

numpy-svn at scipy.org numpy-svn at scipy.org
Sat Feb 20 13:04:11 EST 2010


Author: ptvirtan
Date: 2010-02-20 12:04:11 -0600 (Sat, 20 Feb 2010)
New Revision: 8133

Modified:
   trunk/numpy/core/src/multiarray/buffer.c
Log:
ENH: core: cleanups in PEP 3118 provider

Modified: trunk/numpy/core/src/multiarray/buffer.c
===================================================================
--- trunk/numpy/core/src/multiarray/buffer.c	2010-02-20 18:03:53 UTC (rev 8132)
+++ trunk/numpy/core/src/multiarray/buffer.c	2010-02-20 18:04:11 UTC (rev 8133)
@@ -327,13 +327,20 @@
 
     /* Fill in shape and strides */
     info->ndim = PyArray_NDIM(arr);
-    info->shape = (Py_ssize_t*)malloc(sizeof(Py_ssize_t)
-                                      * PyArray_NDIM(arr) * 2 + 1);
-    info->strides = info->shape + PyArray_NDIM(arr);
-    for (k = 0; k < PyArray_NDIM(arr); ++k) {
-        info->shape[k] = PyArray_DIMS(arr)[k];
-        info->strides[k] = PyArray_STRIDES(arr)[k];
+
+    if (info->ndim == 0) {
+        info->shape = NULL;
+        info->strides = NULL;
     }
+    else {
+        info->shape = (Py_ssize_t*)malloc(sizeof(Py_ssize_t)
+                                          * PyArray_NDIM(arr) * 2 + 1);
+        info->strides = info->shape + PyArray_NDIM(arr);
+        for (k = 0; k < PyArray_NDIM(arr); ++k) {
+            info->shape[k] = PyArray_DIMS(arr)[k];
+            info->strides[k] = PyArray_STRIDES(arr)[k];
+        }
+    }
 
     return info;
 }
@@ -465,15 +472,13 @@
     self = (PyArrayObject*)obj;
 
     if (view == NULL) {
-        return -1;
+        goto fail;
     }
 
-    view->format = NULL;
-    view->shape = NULL;
-
+    /* Check whether we can provide the wanted properties */
     if ((flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS &&
         !PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)) {
-        PyErr_SetString(PyExc_ValueError, "ndarray is not C contiguous");
+        PyErr_SetString(PyExc_ValueError, "ndarray is not C-contiguous");
         goto fail;
     }
     if ((flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS &&
@@ -486,44 +491,41 @@
         PyErr_SetString(PyExc_ValueError, "ndarray is not contiguous");
         goto fail;
     }
+    if ((flags & PyBUF_STRIDES) != PyBUF_STRIDES &&
+        !PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)) {
+        /* Non-strided buffers must be C-contiguous */
+        PyErr_SetString(PyExc_ValueError, "ndarray is not C-contiguous");
+        goto fail;
+    }
+    if ((flags & PyBUF_WRITEABLE) == PyBUF_WRITEABLE &&
+        !PyArray_ISWRITEABLE(self)) {
+        PyErr_SetString(PyExc_ValueError, "ndarray is not writeable");
+        goto fail;
+    }
 
+    /* Fill in information */
+    info = _buffer_get_info(obj);
+    if (info == NULL) {
+        goto fail;
+    }
+
     view->buf = PyArray_DATA(self);
     view->suboffsets = NULL;
     view->itemsize = PyArray_ITEMSIZE(self);
     view->readonly = !PyArray_ISWRITEABLE(self);
     view->internal = NULL;
     view->len = PyArray_NBYTES(self);
-
-    info = _buffer_get_info(obj);
-    if (info == NULL) {
-        goto fail;
-    }
-
     if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) {
         view->format = info->format;
-    }
-    else {
+    } else {
         view->format = NULL;
     }
+    view->ndim = info->ndim;
+    view->shape = info->shape;
+    view->strides = info->strides;
+    view->obj = (PyObject*)self;
 
-    if ((flags & PyBUF_STRIDED) == PyBUF_STRIDED) {
-        view->ndim = info->ndim;
-        view->shape = info->shape;
-        view->strides = info->strides;
-    }
-    else if (PyArray_ISONESEGMENT(self)) {
-        view->ndim = 0;
-        view->shape = NULL;
-        view->strides = NULL;
-    }
-    else {
-        PyErr_SetString(PyExc_ValueError, "ndarray is not single-segment");
-        goto fail;
-    }
-
-    view->obj = (PyObject*)self;
     Py_INCREF(self);
-
     return 0;
 
 fail:




More information about the Numpy-svn mailing list