summaryrefslogtreecommitdiff
path: root/numpy/core/src/arrayobject.c
diff options
context:
space:
mode:
authorStefan van der Walt <stefan@sun.ac.za>2007-08-21 18:36:06 +0000
committerStefan van der Walt <stefan@sun.ac.za>2007-08-21 18:36:06 +0000
commitf362b39ddc85a0529196de99b79dbcdce58c77e4 (patch)
treebca178531374771f0685d51decaa03f4d8c8d19e /numpy/core/src/arrayobject.c
parentcffb9714779adc0156c36bb55d0a1e8a29589408 (diff)
downloadnumpy-f362b39ddc85a0529196de99b79dbcdce58c77e4.tar.gz
Fix whitespace to conform to Python 3000 convention.
Diffstat (limited to 'numpy/core/src/arrayobject.c')
-rw-r--r--numpy/core/src/arrayobject.c17507
1 files changed, 8753 insertions, 8754 deletions
diff --git a/numpy/core/src/arrayobject.c b/numpy/core/src/arrayobject.c
index e269195cc..2847b7796 100644
--- a/numpy/core/src/arrayobject.c
+++ b/numpy/core/src/arrayobject.c
@@ -1,142 +1,141 @@
-
/*
Provide multidimensional arrays as a basic object type in python.
-Based on Original Numeric implementation
-Copyright (c) 1995, 1996, 1997 Jim Hugunin, hugunin@mit.edu
+ Based on Original Numeric implementation
+ Copyright (c) 1995, 1996, 1997 Jim Hugunin, hugunin@mit.edu
-with contributions from many Numeric Python developers 1995-2004
+ with contributions from many Numeric Python developers 1995-2004
-Heavily modified in 2005 with inspiration from Numarray
+ Heavily modified in 2005 with inspiration from Numarray
-by
+ by
-Travis Oliphant, oliphant@ee.byu.edu
-Brigham Young Univeristy
+ Travis Oliphant, oliphant@ee.byu.edu
+ Brigham Young Univeristy
-maintainer email: oliphant.travis@ieee.org
+ maintainer email: oliphant.travis@ieee.org
-Numarray design (which provided guidance) by
-Space Science Telescope Institute
+ Numarray design (which provided guidance) by
+ Space Science Telescope Institute
(J. Todd Miller, Perry Greenfield, Rick White)
*/
/*OBJECT_API
- Get Priority from object
+ Get Priority from object
*/
static double
PyArray_GetPriority(PyObject *obj, double default_)
{
- PyObject *ret;
- double priority=PyArray_PRIORITY;
+ PyObject *ret;
+ double priority=PyArray_PRIORITY;
- if (PyArray_CheckExact(obj))
- return priority;
-
- ret = PyObject_GetAttrString(obj, "__array_priority__");
- if (ret != NULL) priority = PyFloat_AsDouble(ret);
- if (PyErr_Occurred()) {
- PyErr_Clear();
- priority = default_;
- }
- Py_XDECREF(ret);
+ if (PyArray_CheckExact(obj))
return priority;
+
+ ret = PyObject_GetAttrString(obj, "__array_priority__");
+ if (ret != NULL) priority = PyFloat_AsDouble(ret);
+ if (PyErr_Occurred()) {
+ PyErr_Clear();
+ priority = default_;
+ }
+ Py_XDECREF(ret);
+ return priority;
}
static int
_check_object_rec(PyArray_Descr *descr)
{
- if (PyDataType_HASFIELDS(descr) && PyDataType_REFCHK(descr)) {
- PyErr_SetString(PyExc_TypeError, "Not supported for this data-type.");
- return -1;
- }
- return 0;
+ if (PyDataType_HASFIELDS(descr) && PyDataType_REFCHK(descr)) {
+ PyErr_SetString(PyExc_TypeError, "Not supported for this data-type.");
+ return -1;
+ }
+ return 0;
}
/* Backward compatibility only */
/* In both Zero and One
- ***You must free the memory once you are done with it
- using PyDataMem_FREE(ptr) or you create a memory leak***
+***You must free the memory once you are done with it
+using PyDataMem_FREE(ptr) or you create a memory leak***
- If arr is an Object array you are getting a
- BORROWED reference to Zero or One.
- Do not DECREF.
- Please INCREF if you will be hanging on to it.
+If arr is an Object array you are getting a
+BORROWED reference to Zero or One.
+Do not DECREF.
+Please INCREF if you will be hanging on to it.
- The memory for the ptr still must be freed in any case;
+The memory for the ptr still must be freed in any case;
*/
/*OBJECT_API
- Get pointer to zero of correct type for array.
+ Get pointer to zero of correct type for array.
*/
static char *
PyArray_Zero(PyArrayObject *arr)
{
- char *zeroval;
- int ret, storeflags;
- PyObject *obj;
+ char *zeroval;
+ int ret, storeflags;
+ PyObject *obj;
- if (_check_object_rec(arr->descr) < 0) return NULL;
- zeroval = PyDataMem_NEW(arr->descr->elsize);
- if (zeroval == NULL) {
- PyErr_SetNone(PyExc_MemoryError);
- return NULL;
- }
+ if (_check_object_rec(arr->descr) < 0) return NULL;
+ zeroval = PyDataMem_NEW(arr->descr->elsize);
+ if (zeroval == NULL) {
+ PyErr_SetNone(PyExc_MemoryError);
+ return NULL;
+ }
- obj=PyInt_FromLong((long) 0);
- if (PyArray_ISOBJECT(arr)) {
- memcpy(zeroval, &obj, sizeof(PyObject *));
- Py_DECREF(obj);
- return zeroval;
- }
- storeflags = arr->flags;
- arr->flags |= BEHAVED;
- ret = arr->descr->f->setitem(obj, zeroval, arr);
- arr->flags = storeflags;
+ obj=PyInt_FromLong((long) 0);
+ if (PyArray_ISOBJECT(arr)) {
+ memcpy(zeroval, &obj, sizeof(PyObject *));
Py_DECREF(obj);
- if (ret < 0) {
- PyDataMem_FREE(zeroval);
- return NULL;
- }
return zeroval;
+ }
+ storeflags = arr->flags;
+ arr->flags |= BEHAVED;
+ ret = arr->descr->f->setitem(obj, zeroval, arr);
+ arr->flags = storeflags;
+ Py_DECREF(obj);
+ if (ret < 0) {
+ PyDataMem_FREE(zeroval);
+ return NULL;
+ }
+ return zeroval;
}
/*OBJECT_API
- Get pointer to one of correct type for array
+ Get pointer to one of correct type for array
*/
static char *
PyArray_One(PyArrayObject *arr)
{
- char *oneval;
- int ret, storeflags;
- PyObject *obj;
-
- if (_check_object_rec(arr->descr) < 0) return NULL;
- oneval = PyDataMem_NEW(arr->descr->elsize);
- if (oneval == NULL) {
- PyErr_SetNone(PyExc_MemoryError);
- return NULL;
- }
+ char *oneval;
+ int ret, storeflags;
+ PyObject *obj;
- obj = PyInt_FromLong((long) 1);
- if (PyArray_ISOBJECT(arr)) {
- memcpy(oneval, &obj, sizeof(PyObject *));
- Py_DECREF(obj);
- return oneval;
- }
+ if (_check_object_rec(arr->descr) < 0) return NULL;
+ oneval = PyDataMem_NEW(arr->descr->elsize);
+ if (oneval == NULL) {
+ PyErr_SetNone(PyExc_MemoryError);
+ return NULL;
+ }
- storeflags = arr->flags;
- arr->flags |= BEHAVED;
- ret = arr->descr->f->setitem(obj, oneval, arr);
- arr->flags = storeflags;
+ obj = PyInt_FromLong((long) 1);
+ if (PyArray_ISOBJECT(arr)) {
+ memcpy(oneval, &obj, sizeof(PyObject *));
Py_DECREF(obj);
- if (ret < 0) {
- PyDataMem_FREE(oneval);
- return NULL;
- }
return oneval;
+ }
+
+ storeflags = arr->flags;
+ arr->flags |= BEHAVED;
+ ret = arr->descr->f->setitem(obj, oneval, arr);
+ arr->flags = storeflags;
+ Py_DECREF(obj);
+ if (ret < 0) {
+ PyDataMem_FREE(oneval);
+ return NULL;
+ }
+ return oneval;
}
/* End deprecated */
@@ -152,26 +151,26 @@ static PyObject *PyArray_New(PyTypeObject *, int nd, intp *,
static void
PyArray_Item_INCREF(char *data, PyArray_Descr *descr)
{
- PyObject **temp;
+ PyObject **temp;
- if (!PyDataType_REFCHK(descr)) return;
+ if (!PyDataType_REFCHK(descr)) return;
- if (descr->type_num == PyArray_OBJECT) {
- temp = (PyObject **)data;
- Py_XINCREF(*temp);
- }
- else if (PyDescr_HASFIELDS(descr)) {
- PyObject *key, *value, *title=NULL;
- PyArray_Descr *new;
- int offset;
- Py_ssize_t pos=0;
- while (PyDict_Next(descr->fields, &pos, &key, &value)) {
- if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset,
- &title)) return;
- PyArray_Item_INCREF(data + offset, new);
- }
+ if (descr->type_num == PyArray_OBJECT) {
+ temp = (PyObject **)data;
+ Py_XINCREF(*temp);
+ }
+ else if (PyDescr_HASFIELDS(descr)) {
+ PyObject *key, *value, *title=NULL;
+ PyArray_Descr *new;
+ int offset;
+ Py_ssize_t pos=0;
+ while (PyDict_Next(descr->fields, &pos, &key, &value)) {
+ if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset,
+ &title)) return;
+ PyArray_Item_INCREF(data + offset, new);
}
- return;
+ }
+ return;
}
/* XDECREF all objects found at this record */
@@ -180,26 +179,26 @@ PyArray_Item_INCREF(char *data, PyArray_Descr *descr)
static void
PyArray_Item_XDECREF(char *data, PyArray_Descr *descr)
{
- PyObject **temp;
+ PyObject **temp;
- if (!PyDataType_REFCHK(descr)) return;
+ if (!PyDataType_REFCHK(descr)) return;
- if (descr->type_num == PyArray_OBJECT) {
- temp = (PyObject **)data;
- Py_XDECREF(*temp);
- }
- else if PyDescr_HASFIELDS(descr) {
- PyObject *key, *value, *title=NULL;
- PyArray_Descr *new;
- int offset;
- Py_ssize_t pos=0;
- while (PyDict_Next(descr->fields, &pos, &key, &value)) {
- if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset,
- &title)) return;
- PyArray_Item_XDECREF(data + offset, new);
- }
+ if (descr->type_num == PyArray_OBJECT) {
+ temp = (PyObject **)data;
+ Py_XDECREF(*temp);
+ }
+ else if PyDescr_HASFIELDS(descr) {
+ PyObject *key, *value, *title=NULL;
+ PyArray_Descr *new;
+ int offset;
+ Py_ssize_t pos=0;
+ while (PyDict_Next(descr->fields, &pos, &key, &value)) {
+ if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset,
+ &title)) return;
+ PyArray_Item_XDECREF(data + offset, new);
+ }
}
- return;
+ return;
}
/* C-API functions */
@@ -207,147 +206,147 @@ PyArray_Item_XDECREF(char *data, PyArray_Descr *descr)
/* Used for arrays of python objects to increment the reference count of */
/* every python object in the array. */
/*OBJECT_API
- For object arrays, increment all internal references.
+ For object arrays, increment all internal references.
*/
static int
PyArray_INCREF(PyArrayObject *mp)
{
- intp i, n;
- PyObject **data, **temp;
- PyArrayIterObject *it;
+ intp i, n;
+ PyObject **data, **temp;
+ PyArrayIterObject *it;
- if (!PyDataType_REFCHK(mp->descr)) return 0;
+ if (!PyDataType_REFCHK(mp->descr)) return 0;
- if (mp->descr->type_num != PyArray_OBJECT) {
- it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)mp);
- if (it == NULL) return -1;
- while(it->index < it->size) {
- PyArray_Item_INCREF(it->dataptr, mp->descr);
- PyArray_ITER_NEXT(it);
- }
- Py_DECREF(it);
- return 0;
+ if (mp->descr->type_num != PyArray_OBJECT) {
+ it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)mp);
+ if (it == NULL) return -1;
+ while(it->index < it->size) {
+ PyArray_Item_INCREF(it->dataptr, mp->descr);
+ PyArray_ITER_NEXT(it);
}
+ Py_DECREF(it);
+ return 0;
+ }
- if (PyArray_ISONESEGMENT(mp)) {
- data = (PyObject **)mp->data;
- n = PyArray_SIZE(mp);
- if (PyArray_ISALIGNED(mp)) {
- for(i=0; i<n; i++, data++) Py_XINCREF(*data);
- }
- else {
- for (i=0; i<n; i++, data++) {
- temp = data;
- Py_XINCREF(*temp);
- }
- }
+ if (PyArray_ISONESEGMENT(mp)) {
+ data = (PyObject **)mp->data;
+ n = PyArray_SIZE(mp);
+ if (PyArray_ISALIGNED(mp)) {
+ for(i=0; i<n; i++, data++) Py_XINCREF(*data);
}
- else { /* handles misaligned data too */
- it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)mp);
- if (it == NULL) return -1;
- while(it->index < it->size) {
- temp = (PyObject **)it->dataptr;
- Py_XINCREF(*temp);
- PyArray_ITER_NEXT(it);
- }
- Py_DECREF(it);
+ else {
+ for (i=0; i<n; i++, data++) {
+ temp = data;
+ Py_XINCREF(*temp);
+ }
}
- return 0;
+ }
+ else { /* handles misaligned data too */
+ it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)mp);
+ if (it == NULL) return -1;
+ while(it->index < it->size) {
+ temp = (PyObject **)it->dataptr;
+ Py_XINCREF(*temp);
+ PyArray_ITER_NEXT(it);
+ }
+ Py_DECREF(it);
+ }
+ return 0;
}
/*OBJECT_API
- Decrement all internal references for object arrays.
- (or arrays with object fields)
+ Decrement all internal references for object arrays.
+ (or arrays with object fields)
*/
static int
PyArray_XDECREF(PyArrayObject *mp)
{
- intp i, n;
- PyObject **data;
- PyObject **temp;
- PyArrayIterObject *it;
+ intp i, n;
+ PyObject **data;
+ PyObject **temp;
+ PyArrayIterObject *it;
- if (!PyDataType_REFCHK(mp->descr)) return 0;
+ if (!PyDataType_REFCHK(mp->descr)) return 0;
- if (mp->descr->type_num != PyArray_OBJECT) {
- it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)mp);
- if (it == NULL) return -1;
- while(it->index < it->size) {
- PyArray_Item_XDECREF(it->dataptr, mp->descr);
- PyArray_ITER_NEXT(it);
- }
- Py_DECREF(it);
- return 0;
+ if (mp->descr->type_num != PyArray_OBJECT) {
+ it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)mp);
+ if (it == NULL) return -1;
+ while(it->index < it->size) {
+ PyArray_Item_XDECREF(it->dataptr, mp->descr);
+ PyArray_ITER_NEXT(it);
}
+ Py_DECREF(it);
+ return 0;
+ }
- if (PyArray_ISONESEGMENT(mp)) {
- data = (PyObject **)mp->data;
- n = PyArray_SIZE(mp);
- if (PyArray_ISALIGNED(mp)) {
- for(i=0; i<n; i++, data++) Py_XDECREF(*data);
- }
- else {
- for (i=0; i<n; i++, data++) {
- temp = data;
- Py_XDECREF(*temp);
- }
- }
+ if (PyArray_ISONESEGMENT(mp)) {
+ data = (PyObject **)mp->data;
+ n = PyArray_SIZE(mp);
+ if (PyArray_ISALIGNED(mp)) {
+ for(i=0; i<n; i++, data++) Py_XDECREF(*data);
}
- else { /* handles misaligned data too */
- it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)mp);
- if (it == NULL) return -1;
- while(it->index < it->size) {
- temp = (PyObject **)it->dataptr;
- Py_XDECREF(*temp);
- PyArray_ITER_NEXT(it);
- }
- Py_DECREF(it);
+ else {
+ for (i=0; i<n; i++, data++) {
+ temp = data;
+ Py_XDECREF(*temp);
+ }
}
- return 0;
+ }
+ else { /* handles misaligned data too */
+ it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)mp);
+ if (it == NULL) return -1;
+ while(it->index < it->size) {
+ temp = (PyObject **)it->dataptr;
+ Py_XDECREF(*temp);
+ PyArray_ITER_NEXT(it);
+ }
+ Py_DECREF(it);
+ }
+ return 0;
}
static void
_strided_byte_copy(char *dst, intp outstrides, char *src, intp instrides,
intp N, int elsize)
{
- intp i, j;
- char *tout = dst;
- char *tin = src;
-
-#define _FAST_MOVE(_type_) \
- for (i=0; i<N; i++) { \
- ((_type_ *)tout)[0] = ((_type_ *)tin)[0]; \
- tin += instrides; \
- tout += outstrides; \
- } \
- return
-
- switch(elsize) {
- case 8:
- _FAST_MOVE(Int64);
- case 4:
- _FAST_MOVE(Int32);
- case 1:
- _FAST_MOVE(Int8);
- case 2:
- _FAST_MOVE(Int16);
- case 16:
- for (i=0; i<N; i++) {
- ((Int64 *)tout)[0] = ((Int64 *)tin)[0];
- ((Int64 *)tout)[1] = ((Int64 *)tin)[1];
- tin += instrides;
- tout += outstrides;
- }
- return;
- default:
- for (i=0; i<N; i++) {
- for (j=0; j<elsize; j++) {
- *tout++ = *tin++;
- }
- tin = tin + instrides - elsize;
- tout = tout + outstrides - elsize;
- }
+ intp i, j;
+ char *tout = dst;
+ char *tin = src;
+
+#define _FAST_MOVE(_type_) \
+ for (i=0; i<N; i++) { \
+ ((_type_ *)tout)[0] = ((_type_ *)tin)[0]; \
+ tin += instrides; \
+ tout += outstrides; \
+ } \
+ return
+
+ switch(elsize) {
+ case 8:
+ _FAST_MOVE(Int64);
+ case 4:
+ _FAST_MOVE(Int32);
+ case 1:
+ _FAST_MOVE(Int8);
+ case 2:
+ _FAST_MOVE(Int16);
+ case 16:
+ for (i=0; i<N; i++) {
+ ((Int64 *)tout)[0] = ((Int64 *)tin)[0];
+ ((Int64 *)tout)[1] = ((Int64 *)tin)[1];
+ tin += instrides;
+ tout += outstrides;
}
+ return;
+ default:
+ for (i=0; i<N; i++) {
+ for (j=0; j<elsize; j++) {
+ *tout++ = *tin++;
+ }
+ tin = tin + instrides - elsize;
+ tout = tout + outstrides - elsize;
+ }
+ }
#undef _FAST_MOVE
}
@@ -357,33 +356,33 @@ static void
_unaligned_strided_byte_move(char *dst, intp outstrides, char *src,
intp instrides, intp N, int elsize)
{
- intp i;
- char *tout = dst;
- char *tin = src;
-
-
-#define _MOVE_N_SIZE(size) \
- for (i=0; i<N; i++) { \
- memmove(tout, tin, size); \
- tin += instrides; \
- tout += outstrides; \
- } \
- return
-
- switch(elsize) {
- case 8:
- _MOVE_N_SIZE(8);
- case 4:
- _MOVE_N_SIZE(4);
- case 1:
- _MOVE_N_SIZE(1);
- case 2:
- _MOVE_N_SIZE(2);
- case 16:
- _MOVE_N_SIZE(16);
- default:
- _MOVE_N_SIZE(elsize);
- }
+ intp i;
+ char *tout = dst;
+ char *tin = src;
+
+
+#define _MOVE_N_SIZE(size) \
+ for (i=0; i<N; i++) { \
+ memmove(tout, tin, size); \
+ tin += instrides; \
+ tout += outstrides; \
+ } \
+ return
+
+ switch(elsize) {
+ case 8:
+ _MOVE_N_SIZE(8);
+ case 4:
+ _MOVE_N_SIZE(4);
+ case 1:
+ _MOVE_N_SIZE(1);
+ case 2:
+ _MOVE_N_SIZE(2);
+ case 16:
+ _MOVE_N_SIZE(16);
+ default:
+ _MOVE_N_SIZE(elsize);
+ }
#undef _MOVE_N_SIZE
}
@@ -392,32 +391,32 @@ static void
_unaligned_strided_byte_copy(char *dst, intp outstrides, char *src,
intp instrides, intp N, int elsize)
{
- intp i;
- char *tout = dst;
- char *tin = src;
-
-#define _COPY_N_SIZE(size) \
- for (i=0; i<N; i++) { \
- memcpy(tout, tin, size); \
- tin += instrides; \
- tout += outstrides; \
- } \
- return
-
- switch(elsize) {
- case 8:
- _COPY_N_SIZE(8);
- case 4:
- _COPY_N_SIZE(4);
- case 1:
- _COPY_N_SIZE(1);
- case 2:
- _COPY_N_SIZE(2);
- case 16:
- _COPY_N_SIZE(16);
- default:
- _COPY_N_SIZE(elsize);
- }
+ intp i;
+ char *tout = dst;
+ char *tin = src;
+
+#define _COPY_N_SIZE(size) \
+ for (i=0; i<N; i++) { \
+ memcpy(tout, tin, size); \
+ tin += instrides; \
+ tout += outstrides; \
+ } \
+ return
+
+ switch(elsize) {
+ case 8:
+ _COPY_N_SIZE(8);
+ case 4:
+ _COPY_N_SIZE(4);
+ case 1:
+ _COPY_N_SIZE(1);
+ case 2:
+ _COPY_N_SIZE(2);
+ case 16:
+ _COPY_N_SIZE(16);
+ default:
+ _COPY_N_SIZE(elsize);
+ }
#undef _COPY_N_SIZE
}
@@ -425,51 +424,51 @@ _unaligned_strided_byte_copy(char *dst, intp outstrides, char *src,
static void
_strided_byte_swap(void *p, intp stride, intp n, int size)
{
- char *a, *b, c=0;
- int j,m;
-
- switch(size) {
- case 1: /* no byteswap necessary */
- break;
- case 4:
- for (a = (char*)p ; n > 0; n--, a += stride-1) {
- b = a + 3;
- c = *a; *a++ = *b; *b-- = c;
- c = *a; *a = *b; *b = c;
- }
- break;
- case 8:
- for (a = (char*)p ; n > 0; n--, a += stride-3) {
- b = a + 7;
- c = *a; *a++ = *b; *b-- = c;
- c = *a; *a++ = *b; *b-- = c;
- c = *a; *a++ = *b; *b-- = c;
- c = *a; *a = *b; *b = c;
- }
- break;
- case 2:
- for (a = (char*)p ; n > 0; n--, a += stride) {
- b = a + 1;
- c = *a; *a = *b; *b = c;
- }
- break;
- default:
- m = size / 2;
- for (a = (char *)p ; n > 0; n--, a += stride-m) {
- b = a + (size-1);
- for (j=0; j<m; j++) {
- c=*a; *a++ = *b; *b-- = c;
- }
- }
- break;
+ char *a, *b, c=0;
+ int j,m;
+
+ switch(size) {
+ case 1: /* no byteswap necessary */
+ break;
+ case 4:
+ for (a = (char*)p ; n > 0; n--, a += stride-1) {
+ b = a + 3;
+ c = *a; *a++ = *b; *b-- = c;
+ c = *a; *a = *b; *b = c;
+ }
+ break;
+ case 8:
+ for (a = (char*)p ; n > 0; n--, a += stride-3) {
+ b = a + 7;
+ c = *a; *a++ = *b; *b-- = c;
+ c = *a; *a++ = *b; *b-- = c;
+ c = *a; *a++ = *b; *b-- = c;
+ c = *a; *a = *b; *b = c;
+ }
+ break;
+ case 2:
+ for (a = (char*)p ; n > 0; n--, a += stride) {
+ b = a + 1;
+ c = *a; *a = *b; *b = c;
+ }
+ break;
+ default:
+ m = size / 2;
+ for (a = (char *)p ; n > 0; n--, a += stride-m) {
+ b = a + (size-1);
+ for (j=0; j<m; j++) {
+ c=*a; *a++ = *b; *b-- = c;
+ }
}
+ break;
+ }
}
static void
byte_swap_vector(void *p, intp n, int size)
{
- _strided_byte_swap(p, (intp) size, n, size);
- return;
+ _strided_byte_swap(p, (intp) size, n, size);
+ return;
}
/* If numitems > 1, then dst must be contiguous */
@@ -477,23 +476,23 @@ static void
copy_and_swap(void *dst, void *src, int itemsize, intp numitems,
intp srcstrides, int swap)
{
- int i;
- char *s1 = (char *)src;
- char *d1 = (char *)dst;
+ int i;
+ char *s1 = (char *)src;
+ char *d1 = (char *)dst;
- if ((numitems == 1) || (itemsize == srcstrides))
- memcpy(d1, s1, itemsize*numitems);
- else {
- for (i = 0; i < numitems; i++) {
- memcpy(d1, s1, itemsize);
- d1 += itemsize;
- s1 += srcstrides;
- }
+ if ((numitems == 1) || (itemsize == srcstrides))
+ memcpy(d1, s1, itemsize*numitems);
+ else {
+ for (i = 0; i < numitems; i++) {
+ memcpy(d1, s1, itemsize);
+ d1 += itemsize;
+ s1 += srcstrides;
}
+ }
- if (swap)
- byte_swap_vector(d1, numitems, itemsize);
+ if (swap)
+ byte_swap_vector(d1, numitems, itemsize);
}
@@ -517,97 +516,97 @@ static PyArray_Descr **userdescrs=NULL;
static intp
PyArray_PyIntAsIntp(PyObject *o)
{
- longlong long_value = -1;
- PyObject *obj;
- static char *msg = "an integer is required";
- PyObject *arr;
- PyArray_Descr *descr;
- intp ret;
+ longlong long_value = -1;
+ PyObject *obj;
+ static char *msg = "an integer is required";
+ PyObject *arr;
+ PyArray_Descr *descr;
+ intp ret;
- if (!o) {
- PyErr_SetString(PyExc_TypeError, msg);
- return -1;
- }
+ if (!o) {
+ PyErr_SetString(PyExc_TypeError, msg);
+ return -1;
+ }
- if (PyInt_Check(o)) {
- long_value = (longlong) PyInt_AS_LONG(o);
- goto finish;
- } else if (PyLong_Check(o)) {
- long_value = (longlong) PyLong_AsLongLong(o);
- goto finish;
- }
+ if (PyInt_Check(o)) {
+ long_value = (longlong) PyInt_AS_LONG(o);
+ goto finish;
+ } else if (PyLong_Check(o)) {
+ long_value = (longlong) PyLong_AsLongLong(o);
+ goto finish;
+ }
#if SIZEOF_INTP == SIZEOF_LONG
- descr = &LONG_Descr;
+ descr = &LONG_Descr;
#elif SIZEOF_INTP == SIZEOF_INT
- descr = &INT_Descr;
+ descr = &INT_Descr;
#else
- descr = &LONGLONG_Descr;
+ descr = &LONGLONG_Descr;
#endif
- arr = NULL;
+ arr = NULL;
- if (PyArray_Check(o)) {
- if (PyArray_SIZE(o)!=1 || !PyArray_ISINTEGER(o)) {
- PyErr_SetString(PyExc_TypeError, msg);
- return -1;
- }
- Py_INCREF(descr);
- arr = PyArray_CastToType((PyArrayObject *)o, descr, 0);
- }
- else if (PyArray_IsScalar(o, Integer)) {
- Py_INCREF(descr);
- arr = PyArray_FromScalar(o, descr);
- }
- if (arr != NULL) {
- ret = *((intp *)PyArray_DATA(arr));
- Py_DECREF(arr);
- return ret;
+ if (PyArray_Check(o)) {
+ if (PyArray_SIZE(o)!=1 || !PyArray_ISINTEGER(o)) {
+ PyErr_SetString(PyExc_TypeError, msg);
+ return -1;
}
+ Py_INCREF(descr);
+ arr = PyArray_CastToType((PyArrayObject *)o, descr, 0);
+ }
+ else if (PyArray_IsScalar(o, Integer)) {
+ Py_INCREF(descr);
+ arr = PyArray_FromScalar(o, descr);
+ }
+ if (arr != NULL) {
+ ret = *((intp *)PyArray_DATA(arr));
+ Py_DECREF(arr);
+ return ret;
+ }
#if (PY_VERSION_HEX >= 0x02050000)
- if (PyIndex_Check(o)) {
- PyObject* value = PyNumber_Index(o);
- if (value==NULL) {
- return -1;
- }
- long_value = (longlong) PyInt_AsSsize_t(value);
- goto finish;
- }
-#endif
- if (o->ob_type->tp_as_number != NULL && \
- o->ob_type->tp_as_number->nb_long != NULL) {
- obj = o->ob_type->tp_as_number->nb_long(o);
- if (obj != NULL) {
- long_value = (longlong) PyLong_AsLongLong(obj);
- Py_DECREF(obj);
- }
+ if (PyIndex_Check(o)) {
+ PyObject* value = PyNumber_Index(o);
+ if (value==NULL) {
+ return -1;
}
- else if (o->ob_type->tp_as_number != NULL && \
- o->ob_type->tp_as_number->nb_int != NULL) {
- obj = o->ob_type->tp_as_number->nb_int(o);
- if (obj != NULL) {
- long_value = (longlong) PyLong_AsLongLong(obj);
- Py_DECREF(obj);
- }
+ long_value = (longlong) PyInt_AsSsize_t(value);
+ goto finish;
+ }
+#endif
+ if (o->ob_type->tp_as_number != NULL && \
+ o->ob_type->tp_as_number->nb_long != NULL) {
+ obj = o->ob_type->tp_as_number->nb_long(o);
+ if (obj != NULL) {
+ long_value = (longlong) PyLong_AsLongLong(obj);
+ Py_DECREF(obj);
}
- else {
- PyErr_SetString(PyExc_NotImplementedError,"");
+ }
+ else if (o->ob_type->tp_as_number != NULL && \
+ o->ob_type->tp_as_number->nb_int != NULL) {
+ obj = o->ob_type->tp_as_number->nb_int(o);
+ if (obj != NULL) {
+ long_value = (longlong) PyLong_AsLongLong(obj);
+ Py_DECREF(obj);
}
+ }
+ else {
+ PyErr_SetString(PyExc_NotImplementedError,"");
+ }
finish:
- if error_converting(long_value) {
- PyErr_SetString(PyExc_TypeError, msg);
- return -1;
+ if error_converting(long_value) {
+ PyErr_SetString(PyExc_TypeError, msg);
+ return -1;
}
#if (SIZEOF_LONGLONG > SIZEOF_INTP)
- if ((long_value < MIN_INTP) || (long_value > MAX_INTP)) {
- PyErr_SetString(PyExc_ValueError,
- "integer won't fit into a C intp");
- return -1;
- }
+ if ((long_value < MIN_INTP) || (long_value > MAX_INTP)) {
+ PyErr_SetString(PyExc_ValueError,
+ "integer won't fit into a C intp");
+ return -1;
+ }
#endif
- return (intp) long_value;
+ return (intp) long_value;
}
@@ -617,267 +616,267 @@ static PyObject *array_int(PyArrayObject *v);
static int
PyArray_PyIntAsInt(PyObject *o)
{
- long long_value = -1;
- PyObject *obj;
- static char *msg = "an integer is required";
- PyObject *arr;
- PyArray_Descr *descr;
- int ret;
+ long long_value = -1;
+ PyObject *obj;
+ static char *msg = "an integer is required";
+ PyObject *arr;
+ PyArray_Descr *descr;
+ int ret;
- if (!o) {
- PyErr_SetString(PyExc_TypeError, msg);
- return -1;
- }
+ if (!o) {
+ PyErr_SetString(PyExc_TypeError, msg);
+ return -1;
+ }
- if (PyInt_Check(o)) {
- long_value = (long) PyInt_AS_LONG(o);
- goto finish;
- } else if (PyLong_Check(o)) {
- long_value = (long) PyLong_AsLong(o);
- goto finish;
- }
+ if (PyInt_Check(o)) {
+ long_value = (long) PyInt_AS_LONG(o);
+ goto finish;
+ } else if (PyLong_Check(o)) {
+ long_value = (long) PyLong_AsLong(o);
+ goto finish;
+ }
- descr = &INT_Descr;
- arr=NULL;
- if (PyArray_Check(o)) {
- if (PyArray_SIZE(o)!=1 || !PyArray_ISINTEGER(o)) {
- PyErr_SetString(PyExc_TypeError, msg);
- return -1;
- }
- Py_INCREF(descr);
- arr = PyArray_CastToType((PyArrayObject *)o, descr, 0);
- }
- if (PyArray_IsScalar(o, Integer)) {
- Py_INCREF(descr);
- arr = PyArray_FromScalar(o, descr);
- }
- if (arr != NULL) {
- ret = *((int *)PyArray_DATA(arr));
- Py_DECREF(arr);
- return ret;
+ descr = &INT_Descr;
+ arr=NULL;
+ if (PyArray_Check(o)) {
+ if (PyArray_SIZE(o)!=1 || !PyArray_ISINTEGER(o)) {
+ PyErr_SetString(PyExc_TypeError, msg);
+ return -1;
}
+ Py_INCREF(descr);
+ arr = PyArray_CastToType((PyArrayObject *)o, descr, 0);
+ }
+ if (PyArray_IsScalar(o, Integer)) {
+ Py_INCREF(descr);
+ arr = PyArray_FromScalar(o, descr);
+ }
+ if (arr != NULL) {
+ ret = *((int *)PyArray_DATA(arr));
+ Py_DECREF(arr);
+ return ret;
+ }
#if (PY_VERSION_HEX >= 0x02050000)
- if (PyIndex_Check(o)) {
- PyObject* value = PyNumber_Index(o);
- long_value = (longlong) PyInt_AsSsize_t(value);
- goto finish;
- }
+ if (PyIndex_Check(o)) {
+ PyObject* value = PyNumber_Index(o);
+ long_value = (longlong) PyInt_AsSsize_t(value);
+ goto finish;
+ }
#endif
- if (o->ob_type->tp_as_number != NULL && \
- o->ob_type->tp_as_number->nb_int != NULL) {
- obj = o->ob_type->tp_as_number->nb_int(o);
- if (obj == NULL) return -1;
- long_value = (long) PyLong_AsLong(obj);
- Py_DECREF(obj);
- }
- else if (o->ob_type->tp_as_number != NULL && \
- o->ob_type->tp_as_number->nb_long != NULL) {
- obj = o->ob_type->tp_as_number->nb_long(o);
- if (obj == NULL) return -1;
- long_value = (long) PyLong_AsLong(obj);
- Py_DECREF(obj);
- }
- else {
- PyErr_SetString(PyExc_NotImplementedError,"");
- }
+ if (o->ob_type->tp_as_number != NULL && \
+ o->ob_type->tp_as_number->nb_int != NULL) {
+ obj = o->ob_type->tp_as_number->nb_int(o);
+ if (obj == NULL) return -1;
+ long_value = (long) PyLong_AsLong(obj);
+ Py_DECREF(obj);
+ }
+ else if (o->ob_type->tp_as_number != NULL && \
+ o->ob_type->tp_as_number->nb_long != NULL) {
+ obj = o->ob_type->tp_as_number->nb_long(o);
+ if (obj == NULL) return -1;
+ long_value = (long) PyLong_AsLong(obj);
+ Py_DECREF(obj);
+ }
+ else {
+ PyErr_SetString(PyExc_NotImplementedError,"");
+ }
finish:
- if error_converting(long_value) {
- PyErr_SetString(PyExc_TypeError, msg);
- return -1;
+ if error_converting(long_value) {
+ PyErr_SetString(PyExc_TypeError, msg);
+ return -1;
}
#if (SIZEOF_LONG > SIZEOF_INT)
- if ((long_value < INT_MIN) || (long_value > INT_MAX)) {
- PyErr_SetString(PyExc_ValueError,
- "integer won't fit into a C int");
- return -1;
- }
+ if ((long_value < INT_MIN) || (long_value > INT_MAX)) {
+ PyErr_SetString(PyExc_ValueError,
+ "integer won't fit into a C int");
+ return -1;
+ }
#endif
- return (int) long_value;
+ return (int) long_value;
}
static char *
index2ptr(PyArrayObject *mp, intp i)
{
- intp dim0;
- if(mp->nd == 0) {
- PyErr_SetString(PyExc_IndexError,
- "0-d arrays can't be indexed");
- return NULL;
- }
- dim0 = mp->dimensions[0];
- if (i<0) i += dim0;
- if (i==0 && dim0 > 0)
- return mp->data;
-
- if (i>0 && i < dim0) {
- return mp->data+i*mp->strides[0];
- }
- PyErr_SetString(PyExc_IndexError,"index out of bounds");
+ intp dim0;
+ if(mp->nd == 0) {
+ PyErr_SetString(PyExc_IndexError,
+ "0-d arrays can't be indexed");
return NULL;
+ }
+ dim0 = mp->dimensions[0];
+ if (i<0) i += dim0;
+ if (i==0 && dim0 > 0)
+ return mp->data;
+
+ if (i>0 && i < dim0) {
+ return mp->data+i*mp->strides[0];
+ }
+ PyErr_SetString(PyExc_IndexError,"index out of bounds");
+ return NULL;
}
/*OBJECT_API
- Compute the size of an array (in number of items)
+ Compute the size of an array (in number of items)
*/
static intp
PyArray_Size(PyObject *op)
{
- if (PyArray_Check(op)) {
- return PyArray_SIZE((PyArrayObject *)op);
- }
- else {
- return 0;
- }
+ if (PyArray_Check(op)) {
+ return PyArray_SIZE((PyArrayObject *)op);
+ }
+ else {
+ return 0;
+ }
}
static int
_copy_from0d(PyArrayObject *dest, PyArrayObject *src, int usecopy, int swap)
{
- char *aligned=NULL;
- char *sptr;
- int numcopies, nbytes;
- void (*myfunc)(char *, intp, char *, intp, intp, int);
- int retval=-1;
+ char *aligned=NULL;
+ char *sptr;
+ int numcopies, nbytes;
+ void (*myfunc)(char *, intp, char *, intp, intp, int);
+ int retval=-1;
- NPY_BEGIN_THREADS_DEF
+ NPY_BEGIN_THREADS_DEF
numcopies = PyArray_SIZE(dest);
- if (numcopies < 1) return 0;
- nbytes = PyArray_ITEMSIZE(src);
-
- if (!PyArray_ISALIGNED(src)) {
- aligned = malloc((size_t)nbytes);
- if (aligned == NULL) {
- PyErr_NoMemory();
- return -1;
- }
- memcpy(aligned, src->data, (size_t) nbytes);
- usecopy = 1;
- sptr = aligned;
- }
- else sptr = src->data;
- if (PyArray_ISALIGNED(dest)) {
- myfunc = _strided_byte_copy;
- }
- else if (usecopy) {
- myfunc = _unaligned_strided_byte_copy;
- }
- else {
- myfunc = _unaligned_strided_byte_move;
- }
+ if (numcopies < 1) return 0;
+ nbytes = PyArray_ITEMSIZE(src);
+
+ if (!PyArray_ISALIGNED(src)) {
+ aligned = malloc((size_t)nbytes);
+ if (aligned == NULL) {
+ PyErr_NoMemory();
+ return -1;
+ }
+ memcpy(aligned, src->data, (size_t) nbytes);
+ usecopy = 1;
+ sptr = aligned;
+ }
+ else sptr = src->data;
+ if (PyArray_ISALIGNED(dest)) {
+ myfunc = _strided_byte_copy;
+ }
+ else if (usecopy) {
+ myfunc = _unaligned_strided_byte_copy;
+ }
+ else {
+ myfunc = _unaligned_strided_byte_move;
+ }
- if ((dest->nd < 2) || PyArray_ISONESEGMENT(dest)) {
- char *dptr;
- intp dstride;
+ if ((dest->nd < 2) || PyArray_ISONESEGMENT(dest)) {
+ char *dptr;
+ intp dstride;
- dptr = dest->data;
- if (dest->nd == 1)
- dstride = dest->strides[0];
- else
- dstride = nbytes;
+ dptr = dest->data;
+ if (dest->nd == 1)
+ dstride = dest->strides[0];
+ else
+ dstride = nbytes;
- PyArray_INCREF(src);
- PyArray_XDECREF(dest);
+ PyArray_INCREF(src);
+ PyArray_XDECREF(dest);
- NPY_BEGIN_THREADS
+ NPY_BEGIN_THREADS
- myfunc(dptr, dstride, sptr, 0, numcopies, (int) nbytes);
- if (swap)
- _strided_byte_swap(dptr, dstride, numcopies, (int) nbytes);
+ myfunc(dptr, dstride, sptr, 0, numcopies, (int) nbytes);
+ if (swap)
+ _strided_byte_swap(dptr, dstride, numcopies, (int) nbytes);
- NPY_END_THREADS
+ NPY_END_THREADS
- }
- else {
- PyArrayIterObject *dit;
- int axis=-1;
- dit = (PyArrayIterObject *)\
- PyArray_IterAllButAxis((PyObject *)dest, &axis);
- if (dit == NULL) goto finish;
- PyArray_INCREF(src);
- PyArray_XDECREF(dest);
- NPY_BEGIN_THREADS
- while(dit->index < dit->size) {
- myfunc(dit->dataptr, PyArray_STRIDE(dest, axis),
- sptr, 0,
- PyArray_DIM(dest, axis), nbytes);
- if (swap)
- _strided_byte_swap(dit->dataptr,
- PyArray_STRIDE(dest, axis),
- PyArray_DIM(dest, axis), nbytes);
- PyArray_ITER_NEXT(dit);
- }
- NPY_END_THREADS
- Py_DECREF(dit);
- }
- retval = 0;
+ }
+ else {
+ PyArrayIterObject *dit;
+ int axis=-1;
+ dit = (PyArrayIterObject *)\
+ PyArray_IterAllButAxis((PyObject *)dest, &axis);
+ if (dit == NULL) goto finish;
+ PyArray_INCREF(src);
+ PyArray_XDECREF(dest);
+ NPY_BEGIN_THREADS
+ while(dit->index < dit->size) {
+ myfunc(dit->dataptr, PyArray_STRIDE(dest, axis),
+ sptr, 0,
+ PyArray_DIM(dest, axis), nbytes);
+ if (swap)
+ _strided_byte_swap(dit->dataptr,
+ PyArray_STRIDE(dest, axis),
+ PyArray_DIM(dest, axis), nbytes);
+ PyArray_ITER_NEXT(dit);
+ }
+ NPY_END_THREADS
+ Py_DECREF(dit);
+ }
+ retval = 0;
finish:
- if (aligned != NULL) free(aligned);
- return retval;
+ if (aligned != NULL) free(aligned);
+ return retval;
}
/* Special-case of PyArray_CopyInto when dst is 1-d
and contiguous (and aligned).
PyArray_CopyInto requires broadcastable arrays while
this one is a flattening operation...
- */
+*/
int _flat_copyinto(PyObject *dst, PyObject *src, NPY_ORDER order) {
- PyArrayIterObject *it;
- void (*myfunc)(char *, intp, char *, intp, intp, int);
- char *dptr;
- int axis;
- int elsize;
- intp nbytes;
- NPY_BEGIN_THREADS_DEF
+ PyArrayIterObject *it;
+ void (*myfunc)(char *, intp, char *, intp, intp, int);
+ char *dptr;
+ int axis;
+ int elsize;
+ intp nbytes;
+ NPY_BEGIN_THREADS_DEF
if (PyArray_NDIM(src) == 0) {
- PyArray_INCREF((PyArrayObject *)src);
- PyArray_XDECREF((PyArrayObject *)dst);
- NPY_BEGIN_THREADS
+ PyArray_INCREF((PyArrayObject *)src);
+ PyArray_XDECREF((PyArrayObject *)dst);
+ NPY_BEGIN_THREADS
memcpy(PyArray_BYTES(dst), PyArray_BYTES(src),
PyArray_ITEMSIZE(src));
- NPY_END_THREADS
+ NPY_END_THREADS
return 0;
}
- if (order == PyArray_FORTRANORDER) {
- axis = 0;
- }
- else {
- axis = PyArray_NDIM(src)-1;
- }
+ if (order == PyArray_FORTRANORDER) {
+ axis = 0;
+ }
+ else {
+ axis = PyArray_NDIM(src)-1;
+ }
- it = (PyArrayIterObject *)PyArray_IterAllButAxis(src, &axis);
- if (it == NULL) return -1;
+ it = (PyArrayIterObject *)PyArray_IterAllButAxis(src, &axis);
+ if (it == NULL) return -1;
- if (PyArray_ISALIGNED(src)) {
- myfunc = _strided_byte_copy;
- }
- else {
- myfunc = _unaligned_strided_byte_copy;
- }
+ if (PyArray_ISALIGNED(src)) {
+ myfunc = _strided_byte_copy;
+ }
+ else {
+ myfunc = _unaligned_strided_byte_copy;
+ }
- dptr = PyArray_BYTES(dst);
- elsize = PyArray_ITEMSIZE(dst);
- nbytes = elsize * PyArray_DIM(src, axis);
- PyArray_INCREF((PyArrayObject *)src);
- PyArray_XDECREF((PyArrayObject *)dst);
- NPY_BEGIN_THREADS
+ dptr = PyArray_BYTES(dst);
+ elsize = PyArray_ITEMSIZE(dst);
+ nbytes = elsize * PyArray_DIM(src, axis);
+ PyArray_INCREF((PyArrayObject *)src);
+ PyArray_XDECREF((PyArrayObject *)dst);
+ NPY_BEGIN_THREADS
while(it->index < it->size) {
- myfunc(dptr, elsize, it->dataptr,
- PyArray_STRIDE(src,axis),
- PyArray_DIM(src,axis), elsize);
- dptr += nbytes;
- PyArray_ITER_NEXT(it);
+ myfunc(dptr, elsize, it->dataptr,
+ PyArray_STRIDE(src,axis),
+ PyArray_DIM(src,axis), elsize);
+ dptr += nbytes;
+ PyArray_ITER_NEXT(it);
}
- NPY_END_THREADS
+ NPY_END_THREADS
Py_DECREF(it);
- return 0;
+ return 0;
}
@@ -886,48 +885,48 @@ _copy_from_same_shape(PyArrayObject *dest, PyArrayObject *src,
void (*myfunc)(char *, intp, char *, intp, intp, int),
int swap)
{
- int maxaxis=-1, elsize;
- intp maxdim;
- PyArrayIterObject *dit, *sit;
- NPY_BEGIN_THREADS_DEF
+ int maxaxis=-1, elsize;
+ intp maxdim;
+ PyArrayIterObject *dit, *sit;
+ NPY_BEGIN_THREADS_DEF
dit = (PyArrayIterObject *) \
- PyArray_IterAllButAxis((PyObject *)dest, &maxaxis);
- sit = (PyArrayIterObject *) \
- PyArray_IterAllButAxis((PyObject *)src, &maxaxis);
+ PyArray_IterAllButAxis((PyObject *)dest, &maxaxis);
+ sit = (PyArrayIterObject *) \
+ PyArray_IterAllButAxis((PyObject *)src, &maxaxis);
- maxdim = dest->dimensions[maxaxis];
+ maxdim = dest->dimensions[maxaxis];
- if ((dit == NULL) || (sit == NULL)) {
- Py_XDECREF(dit);
- Py_XDECREF(sit);
- return -1;
- }
- elsize = PyArray_ITEMSIZE(dest);
+ if ((dit == NULL) || (sit == NULL)) {
+ Py_XDECREF(dit);
+ Py_XDECREF(sit);
+ return -1;
+ }
+ elsize = PyArray_ITEMSIZE(dest);
- PyArray_INCREF(src);
- PyArray_XDECREF(dest);
+ PyArray_INCREF(src);
+ PyArray_XDECREF(dest);
- NPY_BEGIN_THREADS
+ NPY_BEGIN_THREADS
while(dit->index < dit->size) {
- /* strided copy of elsize bytes */
- myfunc(dit->dataptr, dest->strides[maxaxis],
- sit->dataptr, src->strides[maxaxis],
- maxdim, elsize);
- if (swap) {
- _strided_byte_swap(dit->dataptr,
- dest->strides[maxaxis],
- dest->dimensions[maxaxis],
- elsize);
- }
- PyArray_ITER_NEXT(dit);
- PyArray_ITER_NEXT(sit);
+ /* strided copy of elsize bytes */
+ myfunc(dit->dataptr, dest->strides[maxaxis],
+ sit->dataptr, src->strides[maxaxis],
+ maxdim, elsize);
+ if (swap) {
+ _strided_byte_swap(dit->dataptr,
+ dest->strides[maxaxis],
+ dest->dimensions[maxaxis],
+ elsize);
+ }
+ PyArray_ITER_NEXT(dit);
+ PyArray_ITER_NEXT(sit);
}
- NPY_END_THREADS
+ NPY_END_THREADS
Py_DECREF(sit);
- Py_DECREF(dit);
- return 0;
+ Py_DECREF(dit);
+ return 0;
}
static int
@@ -935,57 +934,57 @@ _broadcast_copy(PyArrayObject *dest, PyArrayObject *src,
void (*myfunc)(char *, intp, char *, intp, intp, int),
int swap)
{
- int elsize;
- PyArrayMultiIterObject *multi;
- int maxaxis; intp maxdim;
- NPY_BEGIN_THREADS_DEF
+ int elsize;
+ PyArrayMultiIterObject *multi;
+ int maxaxis; intp maxdim;
+ NPY_BEGIN_THREADS_DEF
elsize = PyArray_ITEMSIZE(dest);
- multi = (PyArrayMultiIterObject *)PyArray_MultiIterNew(2, dest, src);
- if (multi == NULL) return -1;
-
- if (multi->size != PyArray_SIZE(dest)) {
- PyErr_SetString(PyExc_ValueError,
- "array dimensions are not "\
- "compatible for copy");
- Py_DECREF(multi);
- return -1;
- }
+ multi = (PyArrayMultiIterObject *)PyArray_MultiIterNew(2, dest, src);
+ if (multi == NULL) return -1;
- maxaxis = PyArray_RemoveSmallest(multi);
- if (maxaxis < 0) { /* copy 1 0-d array to another */
- PyArray_INCREF(src);
- PyArray_XDECREF(dest);
- memcpy(dest->data, src->data, elsize);
- if (swap) byte_swap_vector(dest->data, 1, elsize);
- return 0;
- }
- maxdim = multi->dimensions[maxaxis];
+ if (multi->size != PyArray_SIZE(dest)) {
+ PyErr_SetString(PyExc_ValueError,
+ "array dimensions are not "\
+ "compatible for copy");
+ Py_DECREF(multi);
+ return -1;
+ }
- /* Increment the source and decrement the destination
- reference counts
- */
+ maxaxis = PyArray_RemoveSmallest(multi);
+ if (maxaxis < 0) { /* copy 1 0-d array to another */
PyArray_INCREF(src);
PyArray_XDECREF(dest);
+ memcpy(dest->data, src->data, elsize);
+ if (swap) byte_swap_vector(dest->data, 1, elsize);
+ return 0;
+ }
+ maxdim = multi->dimensions[maxaxis];
- NPY_BEGIN_THREADS
+ /* Increment the source and decrement the destination
+ reference counts
+ */
+ PyArray_INCREF(src);
+ PyArray_XDECREF(dest);
+
+ NPY_BEGIN_THREADS
while(multi->index < multi->size) {
- myfunc(multi->iters[0]->dataptr,
- multi->iters[0]->strides[maxaxis],
- multi->iters[1]->dataptr,
- multi->iters[1]->strides[maxaxis],
- maxdim, elsize);
- if (swap) {
- _strided_byte_swap(multi->iters[0]->dataptr,
- multi->iters[0]->strides[maxaxis],
- maxdim, elsize);
- }
- PyArray_MultiIter_NEXT(multi);
+ myfunc(multi->iters[0]->dataptr,
+ multi->iters[0]->strides[maxaxis],
+ multi->iters[1]->dataptr,
+ multi->iters[1]->strides[maxaxis],
+ maxdim, elsize);
+ if (swap) {
+ _strided_byte_swap(multi->iters[0]->dataptr,
+ multi->iters[0]->strides[maxaxis],
+ maxdim, elsize);
+ }
+ PyArray_MultiIter_NEXT(multi);
}
- NPY_END_THREADS
+ NPY_END_THREADS
Py_DECREF(multi);
- return 0;
+ return 0;
}
/* If destination is not the right type, then src
@@ -1002,157 +1001,157 @@ _broadcast_copy(PyArrayObject *dest, PyArrayObject *src,
static int
_array_copy_into(PyArrayObject *dest, PyArrayObject *src, int usecopy)
{
- int swap;
- void (*myfunc)(char *, intp, char *, intp, intp, int);
- int simple;
- int same;
- NPY_BEGIN_THREADS_DEF
+ int swap;
+ void (*myfunc)(char *, intp, char *, intp, intp, int);
+ int simple;
+ int same;
+ NPY_BEGIN_THREADS_DEF
if (!PyArray_EquivArrTypes(dest, src)) {
- return PyArray_CastTo(dest, src);
+ return PyArray_CastTo(dest, src);
}
- if (!PyArray_ISWRITEABLE(dest)) {
- PyErr_SetString(PyExc_RuntimeError,
- "cannot write to array");
- return -1;
- }
+ if (!PyArray_ISWRITEABLE(dest)) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "cannot write to array");
+ return -1;
+ }
- same = PyArray_SAMESHAPE(dest, src);
- simple = same && ((PyArray_ISCARRAY_RO(src) && PyArray_ISCARRAY(dest)) ||
- (PyArray_ISFARRAY_RO(src) && PyArray_ISFARRAY(dest)));
+ same = PyArray_SAMESHAPE(dest, src);
+ simple = same && ((PyArray_ISCARRAY_RO(src) && PyArray_ISCARRAY(dest)) ||
+ (PyArray_ISFARRAY_RO(src) && PyArray_ISFARRAY(dest)));
- if (simple) {
- PyArray_INCREF(src);
- PyArray_XDECREF(dest);
- NPY_BEGIN_THREADS
- if (usecopy)
- memcpy(dest->data, src->data, PyArray_NBYTES(dest));
- else
- memmove(dest->data, src->data, PyArray_NBYTES(dest));
- NPY_END_THREADS
- return 0;
- }
+ if (simple) {
+ PyArray_INCREF(src);
+ PyArray_XDECREF(dest);
+ NPY_BEGIN_THREADS
+ if (usecopy)
+ memcpy(dest->data, src->data, PyArray_NBYTES(dest));
+ else
+ memmove(dest->data, src->data, PyArray_NBYTES(dest));
+ NPY_END_THREADS
+ return 0;
+ }
- swap = PyArray_ISNOTSWAPPED(dest) != PyArray_ISNOTSWAPPED(src);
+ swap = PyArray_ISNOTSWAPPED(dest) != PyArray_ISNOTSWAPPED(src);
- if (src->nd == 0) {
- return _copy_from0d(dest, src, usecopy, swap);
- }
+ if (src->nd == 0) {
+ return _copy_from0d(dest, src, usecopy, swap);
+ }
- if (PyArray_ISALIGNED(dest) && PyArray_ISALIGNED(src)) {
- myfunc = _strided_byte_copy;
- }
- else if (usecopy) {
- myfunc = _unaligned_strided_byte_copy;
- }
- else {
- myfunc = _unaligned_strided_byte_move;
- }
+ if (PyArray_ISALIGNED(dest) && PyArray_ISALIGNED(src)) {
+ myfunc = _strided_byte_copy;
+ }
+ else if (usecopy) {
+ myfunc = _unaligned_strided_byte_copy;
+ }
+ else {
+ myfunc = _unaligned_strided_byte_move;
+ }
- /* Could combine these because _broadcasted_copy would work as well.
- But, same-shape copying is so common we want to speed it up.
- */
- if (same) {
- return _copy_from_same_shape(dest, src, myfunc, swap);
- }
- else {
- return _broadcast_copy(dest, src, myfunc, swap);
- }
+ /* Could combine these because _broadcasted_copy would work as well.
+ But, same-shape copying is so common we want to speed it up.
+ */
+ if (same) {
+ return _copy_from_same_shape(dest, src, myfunc, swap);
+ }
+ else {
+ return _broadcast_copy(dest, src, myfunc, swap);
+ }
}
/*OBJECT_API
- Copy an Array into another array -- memory must not overlap
- Does not require src and dest to have "broadcastable" shapes
- (only the same number of elements).
+ Copy an Array into another array -- memory must not overlap
+ Does not require src and dest to have "broadcastable" shapes
+ (only the same number of elements).
*/
static int
PyArray_CopyAnyInto(PyArrayObject *dest, PyArrayObject *src)
{
- int elsize, simple;
- PyArrayIterObject *idest, *isrc;
- void (*myfunc)(char *, intp, char *, intp, intp, int);
- NPY_BEGIN_THREADS_DEF
+ int elsize, simple;
+ PyArrayIterObject *idest, *isrc;
+ void (*myfunc)(char *, intp, char *, intp, intp, int);
+ NPY_BEGIN_THREADS_DEF
if (!PyArray_EquivArrTypes(dest, src)) {
- return PyArray_CastAnyTo(dest, src);
- }
-
- if (!PyArray_ISWRITEABLE(dest)) {
- PyErr_SetString(PyExc_RuntimeError,
- "cannot write to array");
- return -1;
- }
-
- if (PyArray_SIZE(dest) != PyArray_SIZE(src)) {
- PyErr_SetString(PyExc_ValueError,
- "arrays must have the same number of elements"
- " for copy");
- return -1;
+ return PyArray_CastAnyTo(dest, src);
}
- simple = ((PyArray_ISCARRAY_RO(src) && PyArray_ISCARRAY(dest)) ||
- (PyArray_ISFARRAY_RO(src) && PyArray_ISFARRAY(dest)));
+ if (!PyArray_ISWRITEABLE(dest)) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "cannot write to array");
+ return -1;
+ }
- if (simple) {
- PyArray_INCREF(src);
- PyArray_XDECREF(dest);
- NPY_BEGIN_THREADS
- memcpy(dest->data, src->data, PyArray_NBYTES(dest));
- NPY_END_THREADS
- return 0;
- }
+ if (PyArray_SIZE(dest) != PyArray_SIZE(src)) {
+ PyErr_SetString(PyExc_ValueError,
+ "arrays must have the same number of elements"
+ " for copy");
+ return -1;
+ }
- if (PyArray_SAMESHAPE(dest, src)) {
- int swap;
- if (PyArray_ISALIGNED(dest) && PyArray_ISALIGNED(src)) {
- myfunc = _strided_byte_copy;
- }
- else {
- myfunc = _unaligned_strided_byte_copy;
- }
- swap = PyArray_ISNOTSWAPPED(dest) != PyArray_ISNOTSWAPPED(src);
- return _copy_from_same_shape(dest, src, myfunc, swap);
- }
+ simple = ((PyArray_ISCARRAY_RO(src) && PyArray_ISCARRAY(dest)) ||
+ (PyArray_ISFARRAY_RO(src) && PyArray_ISFARRAY(dest)));
- /* Otherwise we have to do an iterator-based copy */
- idest = (PyArrayIterObject *)PyArray_IterNew((PyObject *)dest);
- if (idest == NULL) return -1;
- isrc = (PyArrayIterObject *)PyArray_IterNew((PyObject *)src);
- if (isrc == NULL) {Py_DECREF(idest); return -1;}
- elsize = dest->descr->elsize;
+ if (simple) {
PyArray_INCREF(src);
PyArray_XDECREF(dest);
NPY_BEGIN_THREADS
+ memcpy(dest->data, src->data, PyArray_NBYTES(dest));
+ NPY_END_THREADS
+ return 0;
+ }
+
+ if (PyArray_SAMESHAPE(dest, src)) {
+ int swap;
+ if (PyArray_ISALIGNED(dest) && PyArray_ISALIGNED(src)) {
+ myfunc = _strided_byte_copy;
+ }
+ else {
+ myfunc = _unaligned_strided_byte_copy;
+ }
+ swap = PyArray_ISNOTSWAPPED(dest) != PyArray_ISNOTSWAPPED(src);
+ return _copy_from_same_shape(dest, src, myfunc, swap);
+ }
+
+ /* Otherwise we have to do an iterator-based copy */
+ idest = (PyArrayIterObject *)PyArray_IterNew((PyObject *)dest);
+ if (idest == NULL) return -1;
+ isrc = (PyArrayIterObject *)PyArray_IterNew((PyObject *)src);
+ if (isrc == NULL) {Py_DECREF(idest); return -1;}
+ elsize = dest->descr->elsize;
+ PyArray_INCREF(src);
+ PyArray_XDECREF(dest);
+ NPY_BEGIN_THREADS
while(idest->index < idest->size) {
- memcpy(idest->dataptr, isrc->dataptr, elsize);
- PyArray_ITER_NEXT(idest);
- PyArray_ITER_NEXT(isrc);
+ memcpy(idest->dataptr, isrc->dataptr, elsize);
+ PyArray_ITER_NEXT(idest);
+ PyArray_ITER_NEXT(isrc);
}
- NPY_END_THREADS
+ NPY_END_THREADS
Py_DECREF(idest);
- Py_DECREF(isrc);
- return 0;
+ Py_DECREF(isrc);
+ return 0;
}
/*OBJECT_API
- Copy an Array into another array -- memory must not overlap.
+ Copy an Array into another array -- memory must not overlap.
*/
static int
PyArray_CopyInto(PyArrayObject *dest, PyArrayObject *src)
{
- return _array_copy_into(dest, src, 1);
+ return _array_copy_into(dest, src, 1);
}
/*OBJECT_API
- Move the memory of one array into another.
+ Move the memory of one array into another.
*/
static int
PyArray_MoveInto(PyArrayObject *dest, PyArrayObject *src)
{
- return _array_copy_into(dest, src, 0);
+ return _array_copy_into(dest, src, 0);
}
@@ -1160,54 +1159,54 @@ PyArray_MoveInto(PyArrayObject *dest, PyArrayObject *src)
static int
PyArray_CopyObject(PyArrayObject *dest, PyObject *src_object)
{
- PyArrayObject *src;
- PyObject *r;
- int ret;
-
- /* Special code to mimic Numeric behavior for
- character arrays.
- */
- if (dest->descr->type == PyArray_CHARLTR && dest->nd > 0 \
- && PyString_Check(src_object)) {
- int n_new, n_old;
- char *new_string;
- PyObject *tmp;
- n_new = dest->dimensions[dest->nd-1];
- n_old = PyString_Size(src_object);
- if (n_new > n_old) {
- new_string = (char *)malloc(n_new);
- memmove(new_string,
- PyString_AS_STRING(src_object),
- n_old);
- memset(new_string+n_old, ' ', n_new-n_old);
- tmp = PyString_FromStringAndSize(new_string, n_new);
- free(new_string);
- src_object = tmp;
- }
+ PyArrayObject *src;
+ PyObject *r;
+ int ret;
+
+ /* Special code to mimic Numeric behavior for
+ character arrays.
+ */
+ if (dest->descr->type == PyArray_CHARLTR && dest->nd > 0 \
+ && PyString_Check(src_object)) {
+ int n_new, n_old;
+ char *new_string;
+ PyObject *tmp;
+ n_new = dest->dimensions[dest->nd-1];
+ n_old = PyString_Size(src_object);
+ if (n_new > n_old) {
+ new_string = (char *)malloc(n_new);
+ memmove(new_string,
+ PyString_AS_STRING(src_object),
+ n_old);
+ memset(new_string+n_old, ' ', n_new-n_old);
+ tmp = PyString_FromStringAndSize(new_string, n_new);
+ free(new_string);
+ src_object = tmp;
}
+ }
- if (PyArray_Check(src_object)) {
- src = (PyArrayObject *)src_object;
- Py_INCREF(src);
- }
- else if (!PyArray_IsScalar(src_object, Generic) &&
- PyArray_HasArrayInterface(src_object, r)) {
- src = (PyArrayObject *)r;
- }
- else {
- PyArray_Descr* dtype;
- dtype = dest->descr;
- Py_INCREF(dtype);
- src = (PyArrayObject *)PyArray_FromAny(src_object, dtype, 0,
- dest->nd,
- FORTRAN_IF(dest),
- NULL);
- }
- if (src == NULL) return -1;
-
- ret = PyArray_MoveInto(dest, src);
- Py_DECREF(src);
- return ret;
+ if (PyArray_Check(src_object)) {
+ src = (PyArrayObject *)src_object;
+ Py_INCREF(src);
+ }
+ else if (!PyArray_IsScalar(src_object, Generic) &&
+ PyArray_HasArrayInterface(src_object, r)) {
+ src = (PyArrayObject *)r;
+ }
+ else {
+ PyArray_Descr* dtype;
+ dtype = dest->descr;
+ Py_INCREF(dtype);
+ src = (PyArrayObject *)PyArray_FromAny(src_object, dtype, 0,
+ dest->nd,
+ FORTRAN_IF(dest),
+ NULL);
+ }
+ if (src == NULL) return -1;
+
+ ret = PyArray_MoveInto(dest, src);
+ Py_DECREF(src);
+ return ret;
}
@@ -1217,228 +1216,228 @@ PyArray_CopyObject(PyArrayObject *dest, PyObject *src_object)
/* steals reference to descr -- and enforces native byteorder on it.*/
/*OBJECT_API
- Like FromDimsAndData but uses the Descr structure instead of typecode
- as input.
+ Like FromDimsAndData but uses the Descr structure instead of typecode
+ as input.
*/
static PyObject *
PyArray_FromDimsAndDataAndDescr(int nd, int *d,
PyArray_Descr *descr,
char *data)
{
- PyObject *ret;
+ PyObject *ret;
#if SIZEOF_INTP != SIZEOF_INT
- int i;
- intp newd[MAX_DIMS];
+ int i;
+ intp newd[MAX_DIMS];
#endif
- if (!PyArray_ISNBO(descr->byteorder))
- descr->byteorder = '=';
+ if (!PyArray_ISNBO(descr->byteorder))
+ descr->byteorder = '=';
#if SIZEOF_INTP != SIZEOF_INT
- for (i=0; i<nd; i++) newd[i] = (intp) d[i];
- ret = PyArray_NewFromDescr(&PyArray_Type, descr,
- nd, newd,
- NULL, data,
- (data ? CARRAY : 0), NULL);
+ for (i=0; i<nd; i++) newd[i] = (intp) d[i];
+ ret = PyArray_NewFromDescr(&PyArray_Type, descr,
+ nd, newd,
+ NULL, data,
+ (data ? CARRAY : 0), NULL);
#else
- ret = PyArray_NewFromDescr(&PyArray_Type, descr,
- nd, (intp *)d,
- NULL, data,
- (data ? CARRAY : 0), NULL);
+ ret = PyArray_NewFromDescr(&PyArray_Type, descr,
+ nd, (intp *)d,
+ NULL, data,
+ (data ? CARRAY : 0), NULL);
#endif
- return ret;
+ return ret;
}
/*OBJECT_API
- Construct an empty array from dimensions and typenum
+ Construct an empty array from dimensions and typenum
*/
static PyObject *
PyArray_FromDims(int nd, int *d, int type)
{
- PyObject *ret;
- ret = PyArray_FromDimsAndDataAndDescr(nd, d,
- PyArray_DescrFromType(type),
- NULL);
- /* Old FromDims set memory to zero --- some algorithms
- relied on that. Better keep it the same. If
- Object type, then it's already been set to zero, though.
- */
- if (ret && (PyArray_DESCR(ret)->type_num != PyArray_OBJECT)) {
- memset(PyArray_DATA(ret), 0, PyArray_NBYTES(ret));
- }
- return ret;
+ PyObject *ret;
+ ret = PyArray_FromDimsAndDataAndDescr(nd, d,
+ PyArray_DescrFromType(type),
+ NULL);
+ /* Old FromDims set memory to zero --- some algorithms
+ relied on that. Better keep it the same. If
+ Object type, then it's already been set to zero, though.
+ */
+ if (ret && (PyArray_DESCR(ret)->type_num != PyArray_OBJECT)) {
+ memset(PyArray_DATA(ret), 0, PyArray_NBYTES(ret));
+ }
+ return ret;
}
/* end old calls */
/*OBJECT_API
- Copy an array.
+ Copy an array.
*/
static PyObject *
PyArray_NewCopy(PyArrayObject *m1, NPY_ORDER fortran)
{
- PyArrayObject *ret;
- if (fortran == PyArray_ANYORDER)
- fortran = PyArray_ISFORTRAN(m1);
-
- Py_INCREF(m1->descr);
- ret = (PyArrayObject *)PyArray_NewFromDescr(m1->ob_type,
- m1->descr,
- m1->nd,
- m1->dimensions,
- NULL, NULL,
- fortran,
- (PyObject *)m1);
- if (ret == NULL) return NULL;
- if (PyArray_CopyInto(ret, m1) == -1) {
- Py_DECREF(ret);
- return NULL;
- }
+ PyArrayObject *ret;
+ if (fortran == PyArray_ANYORDER)
+ fortran = PyArray_ISFORTRAN(m1);
+
+ Py_INCREF(m1->descr);
+ ret = (PyArrayObject *)PyArray_NewFromDescr(m1->ob_type,
+ m1->descr,
+ m1->nd,
+ m1->dimensions,
+ NULL, NULL,
+ fortran,
+ (PyObject *)m1);
+ if (ret == NULL) return NULL;
+ if (PyArray_CopyInto(ret, m1) == -1) {
+ Py_DECREF(ret);
+ return NULL;
+ }
- return (PyObject *)ret;
+ return (PyObject *)ret;
}
static PyObject *array_big_item(PyArrayObject *, intp);
/* Does nothing with descr (cannot be NULL) */
/*OBJECT_API
- Get scalar-equivalent to a region of memory described by a descriptor.
+ Get scalar-equivalent to a region of memory described by a descriptor.
*/
static PyObject *
PyArray_Scalar(void *data, PyArray_Descr *descr, PyObject *base)
{
- PyTypeObject *type;
- PyObject *obj;
- void *destptr;
- PyArray_CopySwapFunc *copyswap;
- int type_num;
- int itemsize;
- int swap;
-
- type_num = descr->type_num;
- if (type_num == PyArray_BOOL)
- PyArrayScalar_RETURN_BOOL_FROM_LONG(*(Bool*)data);
- else if (PyDataType_FLAGCHK(descr, NPY_USE_GETITEM)) {
- return descr->f->getitem(data, base);
- }
- itemsize = descr->elsize;
- copyswap = descr->f->copyswap;
- type = descr->typeobj;
- swap = !PyArray_ISNBO(descr->byteorder);
- if PyTypeNum_ISSTRING(type_num) { /* Eliminate NULL bytes */
- char *dptr = data;
- dptr += itemsize-1;
- while(itemsize && *dptr-- == 0) itemsize--;
- if (type_num == PyArray_UNICODE && itemsize) {
- /* make sure itemsize is a multiple of 4 */
- /* so round up to nearest multiple */
- itemsize = (((itemsize-1) >> 2) + 1) << 2;
- }
+ PyTypeObject *type;
+ PyObject *obj;
+ void *destptr;
+ PyArray_CopySwapFunc *copyswap;
+ int type_num;
+ int itemsize;
+ int swap;
+
+ type_num = descr->type_num;
+ if (type_num == PyArray_BOOL)
+ PyArrayScalar_RETURN_BOOL_FROM_LONG(*(Bool*)data);
+ else if (PyDataType_FLAGCHK(descr, NPY_USE_GETITEM)) {
+ return descr->f->getitem(data, base);
+ }
+ itemsize = descr->elsize;
+ copyswap = descr->f->copyswap;
+ type = descr->typeobj;
+ swap = !PyArray_ISNBO(descr->byteorder);
+ if PyTypeNum_ISSTRING(type_num) { /* Eliminate NULL bytes */
+ char *dptr = data;
+ dptr += itemsize-1;
+ while(itemsize && *dptr-- == 0) itemsize--;
+ if (type_num == PyArray_UNICODE && itemsize) {
+ /* make sure itemsize is a multiple of 4 */
+ /* so round up to nearest multiple */
+ itemsize = (((itemsize-1) >> 2) + 1) << 2;
+ }
}
- if (type->tp_itemsize != 0) /* String type */
- obj = type->tp_alloc(type, itemsize);
- else
- obj = type->tp_alloc(type, 0);
- if (obj == NULL) return NULL;
- if PyTypeNum_ISFLEXIBLE(type_num) {
- if (type_num == PyArray_STRING) {
- destptr = PyString_AS_STRING(obj);
- ((PyStringObject *)obj)->ob_shash = -1;
- ((PyStringObject *)obj)->ob_sstate = \
- SSTATE_NOT_INTERNED;
- memcpy(destptr, data, itemsize);
- return obj;
- }
- else if (type_num == PyArray_UNICODE) {
- PyUnicodeObject *uni = (PyUnicodeObject*)obj;
- int length = itemsize >> 2;
+ if (type->tp_itemsize != 0) /* String type */
+ obj = type->tp_alloc(type, itemsize);
+ else
+ obj = type->tp_alloc(type, 0);
+ if (obj == NULL) return NULL;
+ if PyTypeNum_ISFLEXIBLE(type_num) {
+ if (type_num == PyArray_STRING) {
+ destptr = PyString_AS_STRING(obj);
+ ((PyStringObject *)obj)->ob_shash = -1;
+ ((PyStringObject *)obj)->ob_sstate = \
+ SSTATE_NOT_INTERNED;
+ memcpy(destptr, data, itemsize);
+ return obj;
+ }
+ else if (type_num == PyArray_UNICODE) {
+ PyUnicodeObject *uni = (PyUnicodeObject*)obj;
+ int length = itemsize >> 2;
#ifndef Py_UNICODE_WIDE
- char *buffer;
- int alloc=0;
- length *= 2;
+ char *buffer;
+ int alloc=0;
+ length *= 2;
#endif
- /* Need an extra slot and need to use
- Python memory manager */
- uni->str = NULL;
- destptr = PyMem_NEW(Py_UNICODE,length+1);
- if (destptr == NULL) {
- Py_DECREF(obj);
- return PyErr_NoMemory();
- }
- uni->str = (Py_UNICODE *)destptr;
- uni->str[0] = 0;
- uni->str[length] = 0;
- uni->length = length;
- uni->hash = -1;
- uni->defenc = NULL;
+ /* Need an extra slot and need to use
+ Python memory manager */
+ uni->str = NULL;
+ destptr = PyMem_NEW(Py_UNICODE,length+1);
+ if (destptr == NULL) {
+ Py_DECREF(obj);
+ return PyErr_NoMemory();
+ }
+ uni->str = (Py_UNICODE *)destptr;
+ uni->str[0] = 0;
+ uni->str[length] = 0;
+ uni->length = length;
+ uni->hash = -1;
+ uni->defenc = NULL;
#ifdef Py_UNICODE_WIDE
- memcpy(destptr, data, itemsize);
- if (swap)
- byte_swap_vector(destptr, length, 4);
+ memcpy(destptr, data, itemsize);
+ if (swap)
+ byte_swap_vector(destptr, length, 4);
#else
- /* need aligned data buffer */
- if ((swap) || ((((intp)data) % descr->alignment) != 0)) {
- buffer = _pya_malloc(itemsize);
- if (buffer == NULL)
- return PyErr_NoMemory();
- alloc = 1;
- memcpy(buffer, data, itemsize);
- if (swap) {
- byte_swap_vector(buffer,
- itemsize >> 2, 4);
- }
- }
- else buffer = data;
-
- /* Allocated enough for 2-characters per itemsize.
- Now convert from the data-buffer
- */
- length = PyUCS2Buffer_FromUCS4(uni->str,
- (PyArray_UCS4 *)buffer,
- itemsize >> 2);
- if (alloc) _pya_free(buffer);
- /* Resize the unicode result */
- if (MyPyUnicode_Resize(uni, length) < 0) {
- Py_DECREF(obj);
- return NULL;
- }
+ /* need aligned data buffer */
+ if ((swap) || ((((intp)data) % descr->alignment) != 0)) {
+ buffer = _pya_malloc(itemsize);
+ if (buffer == NULL)
+ return PyErr_NoMemory();
+ alloc = 1;
+ memcpy(buffer, data, itemsize);
+ if (swap) {
+ byte_swap_vector(buffer,
+ itemsize >> 2, 4);
+ }
+ }
+ else buffer = data;
+
+ /* Allocated enough for 2-characters per itemsize.
+ Now convert from the data-buffer
+ */
+ length = PyUCS2Buffer_FromUCS4(uni->str,
+ (PyArray_UCS4 *)buffer,
+ itemsize >> 2);
+ if (alloc) _pya_free(buffer);
+ /* Resize the unicode result */
+ if (MyPyUnicode_Resize(uni, length) < 0) {
+ Py_DECREF(obj);
+ return NULL;
+ }
#endif
+ return obj;
+ }
+ else {
+ PyVoidScalarObject *vobj = (PyVoidScalarObject *)obj;
+ vobj->base = NULL;
+ vobj->descr = descr;
+ Py_INCREF(descr);
+ vobj->obval = NULL;
+ vobj->ob_size = itemsize;
+ vobj->flags = BEHAVED | OWNDATA;
+ swap = 0;
+ if (descr->names) {
+ if (base) {
+ Py_INCREF(base);
+ vobj->base = base;
+ vobj->flags = PyArray_FLAGS(base);
+ vobj->flags &= ~OWNDATA;
+ vobj->obval = data;
return obj;
+ }
}
- else {
- PyVoidScalarObject *vobj = (PyVoidScalarObject *)obj;
- vobj->base = NULL;
- vobj->descr = descr;
- Py_INCREF(descr);
- vobj->obval = NULL;
- vobj->ob_size = itemsize;
- vobj->flags = BEHAVED | OWNDATA;
- swap = 0;
- if (descr->names) {
- if (base) {
- Py_INCREF(base);
- vobj->base = base;
- vobj->flags = PyArray_FLAGS(base);
- vobj->flags &= ~OWNDATA;
- vobj->obval = data;
- return obj;
- }
- }
- destptr = PyDataMem_NEW(itemsize);
- if (destptr == NULL) {
- Py_DECREF(obj);
- return PyErr_NoMemory();
- }
- vobj->obval = destptr;
+ destptr = PyDataMem_NEW(itemsize);
+ if (destptr == NULL) {
+ Py_DECREF(obj);
+ return PyErr_NoMemory();
}
+ vobj->obval = destptr;
+ }
}
- else {
- destptr = scalar_value(obj, descr);
- }
- /* copyswap for OBJECT increments the reference count */
- copyswap(destptr, data, swap, base);
- return obj;
+ else {
+ destptr = scalar_value(obj, descr);
+ }
+ /* copyswap for OBJECT increments the reference count */
+ copyswap(destptr, data, swap, base);
+ return obj;
}
/* returns an Array-Scalar Object of the type of arr
@@ -1455,31 +1454,31 @@ PyArray_Scalar(void *data, PyArray_Descr *descr, PyObject *base)
/* Return Array Scalar if 0-d array object is encountered */
/*OBJECT_API
- Return either an array or the appropriate Python object if the array
- is 0d and matches a Python type.
+ Return either an array or the appropriate Python object if the array
+ is 0d and matches a Python type.
*/
static PyObject *
PyArray_Return(PyArrayObject *mp)
{
- if (mp == NULL) return NULL;
+ if (mp == NULL) return NULL;
- if (PyErr_Occurred()) {
- Py_XDECREF(mp);
- return NULL;
- }
+ if (PyErr_Occurred()) {
+ Py_XDECREF(mp);
+ return NULL;
+ }
- if (!PyArray_Check(mp)) return (PyObject *)mp;
+ if (!PyArray_Check(mp)) return (PyObject *)mp;
- if (mp->nd == 0) {
- PyObject *ret;
- ret = PyArray_ToScalar(mp->data, mp);
- Py_DECREF(mp);
- return ret;
- }
- else {
- return (PyObject *)mp;
- }
+ if (mp->nd == 0) {
+ PyObject *ret;
+ ret = PyArray_ToScalar(mp->data, mp);
+ Py_DECREF(mp);
+ return ret;
+ }
+ else {
+ return (PyObject *)mp;
+ }
}
@@ -1489,41 +1488,41 @@ PyArray_Return(PyArrayObject *mp)
static void
PyArray_InitArrFuncs(PyArray_ArrFuncs *f)
{
- int i;
- for (i=0; i<PyArray_NTYPES; i++) {
- f->cast[i] = NULL;
- }
- f->getitem = NULL;
- f->setitem = NULL;
- f->copyswapn = NULL;
- f->copyswap = NULL;
- f->compare = NULL;
- f->argmax = NULL;
- f->dotfunc = NULL;
- f->scanfunc = NULL;
- f->fromstr = NULL;
- f->nonzero = NULL;
- f->fill = NULL;
- f->fillwithscalar = NULL;
- for (i=0; i<PyArray_NSORTS; i++) {
- f->sort[i] = NULL;
- f->argsort[i] = NULL;
- }
- f->castdict = NULL;
- f->scalarkind = NULL;
- f->cancastscalarkindto = NULL;
- f->cancastto = NULL;
+ int i;
+ for (i=0; i<PyArray_NTYPES; i++) {
+ f->cast[i] = NULL;
+ }
+ f->getitem = NULL;
+ f->setitem = NULL;
+ f->copyswapn = NULL;
+ f->copyswap = NULL;
+ f->compare = NULL;
+ f->argmax = NULL;
+ f->dotfunc = NULL;
+ f->scanfunc = NULL;
+ f->fromstr = NULL;
+ f->nonzero = NULL;
+ f->fill = NULL;
+ f->fillwithscalar = NULL;
+ for (i=0; i<PyArray_NSORTS; i++) {
+ f->sort[i] = NULL;
+ f->argsort[i] = NULL;
+ }
+ f->castdict = NULL;
+ f->scalarkind = NULL;
+ f->cancastscalarkindto = NULL;
+ f->cancastto = NULL;
}
static Bool
_default_nonzero(void *ip, void *arr)
{
- int elsize = PyArray_ITEMSIZE(arr);
- char *ptr = ip;
- while (elsize--) {
- if (*ptr++ != 0) return TRUE;
- }
- return FALSE;
+ int elsize = PyArray_ITEMSIZE(arr);
+ char *ptr = ip;
+ while (elsize--) {
+ if (*ptr++ != 0) return TRUE;
+ }
+ return FALSE;
}
/*
@@ -1538,16 +1537,16 @@ _default_nonzero(void *ip, void *arr)
static int
PyArray_TypeNumFromName(char *str)
{
- int i;
- PyArray_Descr *descr;
+ int i;
+ PyArray_Descr *descr;
- for (i=0; i<NPY_NUMUSERTYPES; i++) {
- descr = userdescrs[i];
- if (strcmp(descr->typeobj->tp_name, str) == 0)
- return descr->type_num;
- }
+ for (i=0; i<NPY_NUMUSERTYPES; i++) {
+ descr = userdescrs[i];
+ if (strcmp(descr->typeobj->tp_name, str) == 0)
+ return descr->type_num;
+ }
- return PyArray_NOTYPE;
+ return PyArray_NOTYPE;
}
/*
@@ -1556,52 +1555,52 @@ PyArray_TypeNumFromName(char *str)
defined in arraytypes.inc
*/
/*MULTIARRAY_API
- Register Data type
- Does not change the reference count of descr
+ Register Data type
+ Does not change the reference count of descr
*/
static int
PyArray_RegisterDataType(PyArray_Descr *descr)
{
- PyArray_Descr *descr2;
- int typenum;
- int i;
- PyArray_ArrFuncs *f;
-
- /* See if this type is already registered */
- for (i=0; i<NPY_NUMUSERTYPES; i++) {
- descr2 = userdescrs[i];
- if (descr2 == descr)
- return descr->type_num;
- }
- typenum = PyArray_USERDEF + NPY_NUMUSERTYPES;
- descr->type_num = typenum;
- if (descr->elsize == 0) {
- PyErr_SetString(PyExc_ValueError, "cannot register a" \
- "flexible data-type");
- return -1;
- }
- f = descr->f;
- if (f->nonzero == NULL) {
- f->nonzero = _default_nonzero;
- }
- if (f->copyswap == NULL || f->getitem == NULL ||
- f->copyswapn == NULL || f->setitem == NULL) {
- PyErr_SetString(PyExc_ValueError, "a required array function" \
- " is missing.");
- return -1;
- }
- if (descr->typeobj == NULL) {
- PyErr_SetString(PyExc_ValueError, "missing typeobject");
- return -1;
- }
- userdescrs = realloc(userdescrs,
- (NPY_NUMUSERTYPES+1)*sizeof(void *));
- if (userdescrs == NULL) {
- PyErr_SetString(PyExc_MemoryError, "RegisterDataType");
- return -1;
- }
- userdescrs[NPY_NUMUSERTYPES++] = descr;
- return typenum;
+ PyArray_Descr *descr2;
+ int typenum;
+ int i;
+ PyArray_ArrFuncs *f;
+
+ /* See if this type is already registered */
+ for (i=0; i<NPY_NUMUSERTYPES; i++) {
+ descr2 = userdescrs[i];
+ if (descr2 == descr)
+ return descr->type_num;
+ }
+ typenum = PyArray_USERDEF + NPY_NUMUSERTYPES;
+ descr->type_num = typenum;
+ if (descr->elsize == 0) {
+ PyErr_SetString(PyExc_ValueError, "cannot register a" \
+ "flexible data-type");
+ return -1;
+ }
+ f = descr->f;
+ if (f->nonzero == NULL) {
+ f->nonzero = _default_nonzero;
+ }
+ if (f->copyswap == NULL || f->getitem == NULL ||
+ f->copyswapn == NULL || f->setitem == NULL) {
+ PyErr_SetString(PyExc_ValueError, "a required array function" \
+ " is missing.");
+ return -1;
+ }
+ if (descr->typeobj == NULL) {
+ PyErr_SetString(PyExc_ValueError, "missing typeobject");
+ return -1;
+ }
+ userdescrs = realloc(userdescrs,
+ (NPY_NUMUSERTYPES+1)*sizeof(void *));
+ if (userdescrs == NULL) {
+ PyErr_SetString(PyExc_MemoryError, "RegisterDataType");
+ return -1;
+ }
+ userdescrs[NPY_NUMUSERTYPES++] = descr;
+ return typenum;
}
/*MULTIARRAY_API
@@ -1612,41 +1611,41 @@ static int
PyArray_RegisterCastFunc(PyArray_Descr *descr, int totype,
PyArray_VectorUnaryFunc *castfunc)
{
- PyObject *cobj, *key;
- int ret;
- if (totype < PyArray_NTYPES) {
- descr->f->cast[totype] = castfunc;
- return 0;
- }
- if (!PyTypeNum_ISUSERDEF(totype)) {
- PyErr_SetString(PyExc_TypeError, "invalid type number.");
- return -1;
- }
- if (descr->f->castdict == NULL) {
- descr->f->castdict = PyDict_New();
- if (descr->f->castdict == NULL) return -1;
- }
- key = PyInt_FromLong(totype);
- if (PyErr_Occurred()) return -1;
- cobj = PyCObject_FromVoidPtr((void *)castfunc, NULL);
- if (cobj == NULL) {Py_DECREF(key); return -1;}
- ret = PyDict_SetItem(descr->f->castdict, key, cobj);
- Py_DECREF(key);
- Py_DECREF(cobj);
- return ret;
+ PyObject *cobj, *key;
+ int ret;
+ if (totype < PyArray_NTYPES) {
+ descr->f->cast[totype] = castfunc;
+ return 0;
+ }
+ if (!PyTypeNum_ISUSERDEF(totype)) {
+ PyErr_SetString(PyExc_TypeError, "invalid type number.");
+ return -1;
+ }
+ if (descr->f->castdict == NULL) {
+ descr->f->castdict = PyDict_New();
+ if (descr->f->castdict == NULL) return -1;
+ }
+ key = PyInt_FromLong(totype);
+ if (PyErr_Occurred()) return -1;
+ cobj = PyCObject_FromVoidPtr((void *)castfunc, NULL);
+ if (cobj == NULL) {Py_DECREF(key); return -1;}
+ ret = PyDict_SetItem(descr->f->castdict, key, cobj);
+ Py_DECREF(key);
+ Py_DECREF(cobj);
+ return ret;
}
static int *
_append_new(int *types, int insert)
{
- int n=0;
- int *newtypes;
+ int n=0;
+ int *newtypes;
- while (types[n] != PyArray_NOTYPE) n++;
- newtypes = (int *)realloc(types, (n+2)*sizeof(int));
- newtypes[n] = insert;
- newtypes[n+1] = PyArray_NOTYPE;
- return newtypes;
+ while (types[n] != PyArray_NOTYPE) n++;
+ newtypes = (int *)realloc(types, (n+2)*sizeof(int));
+ newtypes[n] = insert;
+ newtypes[n+1] = PyArray_NOTYPE;
+ return newtypes;
}
/*MULTIARRAY_API
@@ -1657,244 +1656,244 @@ static int
PyArray_RegisterCanCast(PyArray_Descr *descr, int totype,
NPY_SCALARKIND scalar)
{
- if (scalar == PyArray_NOSCALAR) {
- /* register with cancastto */
- /* These lists won't be freed once created
- -- they become part of the data-type */
- if (descr->f->cancastto == NULL) {
- descr->f->cancastto = (int *)malloc(1*sizeof(int));
- descr->f->cancastto[0] = PyArray_NOTYPE;
- }
- descr->f->cancastto = _append_new(descr->f->cancastto,
- totype);
+ if (scalar == PyArray_NOSCALAR) {
+ /* register with cancastto */
+ /* These lists won't be freed once created
+ -- they become part of the data-type */
+ if (descr->f->cancastto == NULL) {
+ descr->f->cancastto = (int *)malloc(1*sizeof(int));
+ descr->f->cancastto[0] = PyArray_NOTYPE;
}
- else {
- /* register with cancastscalarkindto */
- if (descr->f->cancastscalarkindto == NULL) {
- int i;
- descr->f->cancastscalarkindto = \
- (int **)malloc(PyArray_NSCALARKINDS* \
- sizeof(int*));
- for (i=0; i<PyArray_NSCALARKINDS; i++) {
- descr->f->cancastscalarkindto[i] = NULL;
- }
- }
- if (descr->f->cancastscalarkindto[scalar] == NULL) {
- descr->f->cancastscalarkindto[scalar] = \
- (int *)malloc(1*sizeof(int));
- descr->f->cancastscalarkindto[scalar][0] = \
- PyArray_NOTYPE;
- }
- descr->f->cancastscalarkindto[scalar] = \
- _append_new(descr->f->cancastscalarkindto[scalar],
- totype);
+ descr->f->cancastto = _append_new(descr->f->cancastto,
+ totype);
+ }
+ else {
+ /* register with cancastscalarkindto */
+ if (descr->f->cancastscalarkindto == NULL) {
+ int i;
+ descr->f->cancastscalarkindto = \
+ (int **)malloc(PyArray_NSCALARKINDS* \
+ sizeof(int*));
+ for (i=0; i<PyArray_NSCALARKINDS; i++) {
+ descr->f->cancastscalarkindto[i] = NULL;
+ }
}
- return 0;
+ if (descr->f->cancastscalarkindto[scalar] == NULL) {
+ descr->f->cancastscalarkindto[scalar] = \
+ (int *)malloc(1*sizeof(int));
+ descr->f->cancastscalarkindto[scalar][0] = \
+ PyArray_NOTYPE;
+ }
+ descr->f->cancastscalarkindto[scalar] = \
+ _append_new(descr->f->cancastscalarkindto[scalar],
+ totype);
+ }
+ return 0;
}
/*OBJECT_API
- To File
+ To File
*/
static int
PyArray_ToFile(PyArrayObject *self, FILE *fp, char *sep, char *format)
{
- intp size;
- intp n, n2;
- size_t n3, n4;
- PyArrayIterObject *it;
- PyObject *obj, *strobj, *tupobj;
-
- n3 = (sep ? strlen((const char *)sep) : 0);
- if (n3 == 0) { /* binary data */
- if (PyDataType_FLAGCHK(self->descr, NPY_LIST_PICKLE)) {
- PyErr_SetString(PyExc_ValueError, "cannot write " \
- "object arrays to a file in " \
- "binary mode");
- return -1;
+ intp size;
+ intp n, n2;
+ size_t n3, n4;
+ PyArrayIterObject *it;
+ PyObject *obj, *strobj, *tupobj;
+
+ n3 = (sep ? strlen((const char *)sep) : 0);
+ if (n3 == 0) { /* binary data */
+ if (PyDataType_FLAGCHK(self->descr, NPY_LIST_PICKLE)) {
+ PyErr_SetString(PyExc_ValueError, "cannot write " \
+ "object arrays to a file in " \
+ "binary mode");
+ return -1;
+ }
+
+ if (PyArray_ISCONTIGUOUS(self)) {
+ size = PyArray_SIZE(self);
+ NPY_BEGIN_ALLOW_THREADS
+ n=fwrite((const void *)self->data,
+ (size_t) self->descr->elsize,
+ (size_t) size, fp);
+ NPY_END_ALLOW_THREADS
+ if (n < size) {
+ PyErr_Format(PyExc_ValueError,
+ "%ld requested and %ld written",
+ (long) size, (long) n);
+ return -1;
}
+ }
+ else {
+ NPY_BEGIN_THREADS_DEF
- if (PyArray_ISCONTIGUOUS(self)) {
- size = PyArray_SIZE(self);
- NPY_BEGIN_ALLOW_THREADS
- n=fwrite((const void *)self->data,
- (size_t) self->descr->elsize,
- (size_t) size, fp);
- NPY_END_ALLOW_THREADS
- if (n < size) {
- PyErr_Format(PyExc_ValueError,
- "%ld requested and %ld written",
- (long) size, (long) n);
- return -1;
- }
- }
- else {
- NPY_BEGIN_THREADS_DEF
-
- it=(PyArrayIterObject *) \
- PyArray_IterNew((PyObject *)self);
- NPY_BEGIN_THREADS
- while(it->index < it->size) {
- if (fwrite((const void *)it->dataptr,
- (size_t) self->descr->elsize,
- 1, fp) < 1) {
- NPY_END_THREADS
- PyErr_Format(PyExc_IOError,
- "problem writing element"\
- " %d to file",
- (int)it->index);
- Py_DECREF(it);
- return -1;
- }
- PyArray_ITER_NEXT(it);
- }
+ it=(PyArrayIterObject *) \
+ PyArray_IterNew((PyObject *)self);
+ NPY_BEGIN_THREADS
+ while(it->index < it->size) {
+ if (fwrite((const void *)it->dataptr,
+ (size_t) self->descr->elsize,
+ 1, fp) < 1) {
NPY_END_THREADS
+ PyErr_Format(PyExc_IOError,
+ "problem writing element"\
+ " %d to file",
+ (int)it->index);
Py_DECREF(it);
+ return -1;
+ }
+ PyArray_ITER_NEXT(it);
}
+ NPY_END_THREADS
+ Py_DECREF(it);
}
- else { /* text data */
+ }
+ else { /* text data */
- it=(PyArrayIterObject *) \
- PyArray_IterNew((PyObject *)self);
- n4 = (format ? strlen((const char *)format) : 0);
- while(it->index < it->size) {
- obj = self->descr->f->getitem(it->dataptr, self);
- if (obj == NULL) {Py_DECREF(it); return -1;}
- if (n4 == 0) { /* standard writing */
- strobj = PyObject_Str(obj);
- Py_DECREF(obj);
- if (strobj == NULL) {Py_DECREF(it); return -1;}
- }
- else { /* use format string */
- tupobj = PyTuple_New(1);
- if (tupobj == NULL) {Py_DECREF(it); return -1;}
- PyTuple_SET_ITEM(tupobj,0,obj);
- obj = PyString_FromString((const char *)format);
- if (obj == NULL) {Py_DECREF(tupobj);
- Py_DECREF(it); return -1;}
- strobj = PyString_Format(obj, tupobj);
- Py_DECREF(obj);
- Py_DECREF(tupobj);
- if (strobj == NULL) {Py_DECREF(it); return -1;}
- }
- NPY_BEGIN_ALLOW_THREADS
- n=fwrite(PyString_AS_STRING(strobj), 1,
- n2=PyString_GET_SIZE(strobj), fp);
- NPY_END_ALLOW_THREADS
- if (n < n2) {
- PyErr_Format(PyExc_IOError,
- "problem writing element %d"\
- " to file",
- (int) it->index);
- Py_DECREF(strobj);
- Py_DECREF(it);
- return -1;
- }
- /* write separator for all but last one */
- if (it->index != it->size-1)
- if (fwrite(sep, 1, n3, fp) < n3) {
- PyErr_Format(PyExc_IOError,
- "problem writing "\
- "separator to file");
- Py_DECREF(strobj);
- Py_DECREF(it);
- return -1;
- }
- Py_DECREF(strobj);
- PyArray_ITER_NEXT(it);
- }
- Py_DECREF(it);
+ it=(PyArrayIterObject *) \
+ PyArray_IterNew((PyObject *)self);
+ n4 = (format ? strlen((const char *)format) : 0);
+ while(it->index < it->size) {
+ obj = self->descr->f->getitem(it->dataptr, self);
+ if (obj == NULL) {Py_DECREF(it); return -1;}
+ if (n4 == 0) { /* standard writing */
+ strobj = PyObject_Str(obj);
+ Py_DECREF(obj);
+ if (strobj == NULL) {Py_DECREF(it); return -1;}
+ }
+ else { /* use format string */
+ tupobj = PyTuple_New(1);
+ if (tupobj == NULL) {Py_DECREF(it); return -1;}
+ PyTuple_SET_ITEM(tupobj,0,obj);
+ obj = PyString_FromString((const char *)format);
+ if (obj == NULL) {Py_DECREF(tupobj);
+ Py_DECREF(it); return -1;}
+ strobj = PyString_Format(obj, tupobj);
+ Py_DECREF(obj);
+ Py_DECREF(tupobj);
+ if (strobj == NULL) {Py_DECREF(it); return -1;}
+ }
+ NPY_BEGIN_ALLOW_THREADS
+ n=fwrite(PyString_AS_STRING(strobj), 1,
+ n2=PyString_GET_SIZE(strobj), fp);
+ NPY_END_ALLOW_THREADS
+ if (n < n2) {
+ PyErr_Format(PyExc_IOError,
+ "problem writing element %d"\
+ " to file",
+ (int) it->index);
+ Py_DECREF(strobj);
+ Py_DECREF(it);
+ return -1;
+ }
+ /* write separator for all but last one */
+ if (it->index != it->size-1)
+ if (fwrite(sep, 1, n3, fp) < n3) {
+ PyErr_Format(PyExc_IOError,
+ "problem writing "\
+ "separator to file");
+ Py_DECREF(strobj);
+ Py_DECREF(it);
+ return -1;
+ }
+ Py_DECREF(strobj);
+ PyArray_ITER_NEXT(it);
}
- return 0;
+ Py_DECREF(it);
+ }
+ return 0;
}
/*OBJECT_API
- To List
+ To List
*/
static PyObject *
PyArray_ToList(PyArrayObject *self)
{
- PyObject *lp;
- PyArrayObject *v;
- intp sz, i;
+ PyObject *lp;
+ PyArrayObject *v;
+ intp sz, i;
- if (!PyArray_Check(self)) return (PyObject *)self;
+ if (!PyArray_Check(self)) return (PyObject *)self;
- if (self->nd == 0)
- return self->descr->f->getitem(self->data,self);
+ if (self->nd == 0)
+ return self->descr->f->getitem(self->data,self);
- sz = self->dimensions[0];
- lp = PyList_New(sz);
+ sz = self->dimensions[0];
+ lp = PyList_New(sz);
- for (i=0; i<sz; i++) {
- v=(PyArrayObject *)array_big_item(self, i);
- if (v->nd >= self->nd) {
- PyErr_SetString(PyExc_RuntimeError,
- "array_item not returning smaller-" \
- "dimensional array");
- Py_DECREF(v);
- Py_DECREF(lp);
- return NULL;
- }
- PyList_SetItem(lp, i, PyArray_ToList(v));
- Py_DECREF(v);
+ for (i=0; i<sz; i++) {
+ v=(PyArrayObject *)array_big_item(self, i);
+ if (v->nd >= self->nd) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "array_item not returning smaller-" \
+ "dimensional array");
+ Py_DECREF(v);
+ Py_DECREF(lp);
+ return NULL;
}
+ PyList_SetItem(lp, i, PyArray_ToList(v));
+ Py_DECREF(v);
+ }
- return lp;
+ return lp;
}
/*OBJECT_API*/
static PyObject *
PyArray_ToString(PyArrayObject *self, NPY_ORDER order)
{
- intp numbytes;
- intp index;
- char *dptr;
- int elsize;
- PyObject *ret;
- PyArrayIterObject *it;
-
- if (order == NPY_ANYORDER)
- order = PyArray_ISFORTRAN(self);
-
- /* if (PyArray_TYPE(self) == PyArray_OBJECT) {
- PyErr_SetString(PyExc_ValueError, "a string for the data" \
- "in an object array is not appropriate");
- return NULL;
- }
- */
-
- numbytes = PyArray_NBYTES(self);
- if ((PyArray_ISCONTIGUOUS(self) && (order == NPY_CORDER)) || \
- (PyArray_ISFORTRAN(self) && (order == NPY_FORTRANORDER))) {
- ret = PyString_FromStringAndSize(self->data, (int) numbytes);
+ intp numbytes;
+ intp index;
+ char *dptr;
+ int elsize;
+ PyObject *ret;
+ PyArrayIterObject *it;
+
+ if (order == NPY_ANYORDER)
+ order = PyArray_ISFORTRAN(self);
+
+ /* if (PyArray_TYPE(self) == PyArray_OBJECT) {
+ PyErr_SetString(PyExc_ValueError, "a string for the data" \
+ "in an object array is not appropriate");
+ return NULL;
+ }
+ */
+
+ numbytes = PyArray_NBYTES(self);
+ if ((PyArray_ISCONTIGUOUS(self) && (order == NPY_CORDER)) || \
+ (PyArray_ISFORTRAN(self) && (order == NPY_FORTRANORDER))) {
+ ret = PyString_FromStringAndSize(self->data, (int) numbytes);
+ }
+ else {
+ PyObject *new;
+ if (order == NPY_FORTRANORDER) {
+ /* iterators are always in C-order */
+ new = PyArray_Transpose(self, NULL);
+ if (new == NULL) return NULL;
}
else {
- PyObject *new;
- if (order == NPY_FORTRANORDER) {
- /* iterators are always in C-order */
- new = PyArray_Transpose(self, NULL);
- if (new == NULL) return NULL;
- }
- else {
- Py_INCREF(self);
- new = (PyObject *)self;
- }
- it = (PyArrayIterObject *)PyArray_IterNew(new);
- Py_DECREF(new);
- if (it==NULL) return NULL;
- ret = PyString_FromStringAndSize(NULL, (int) numbytes);
- if (ret == NULL) {Py_DECREF(it); return NULL;}
- dptr = PyString_AS_STRING(ret);
- index = it->size;
- elsize = self->descr->elsize;
- while(index--) {
- memcpy(dptr, it->dataptr, elsize);
- dptr += elsize;
- PyArray_ITER_NEXT(it);
- }
- Py_DECREF(it);
+ Py_INCREF(self);
+ new = (PyObject *)self;
}
- return ret;
+ it = (PyArrayIterObject *)PyArray_IterNew(new);
+ Py_DECREF(new);
+ if (it==NULL) return NULL;
+ ret = PyString_FromStringAndSize(NULL, (int) numbytes);
+ if (ret == NULL) {Py_DECREF(it); return NULL;}
+ dptr = PyString_AS_STRING(ret);
+ index = it->size;
+ elsize = self->descr->elsize;
+ while(index--) {
+ memcpy(dptr, it->dataptr, elsize);
+ dptr += elsize;
+ PyArray_ITER_NEXT(it);
+ }
+ Py_DECREF(it);
+ }
+ return ret;
}
@@ -1906,49 +1905,49 @@ PyArray_ToString(PyArrayObject *self, NPY_ORDER order)
static void
array_dealloc(PyArrayObject *self) {
- if (self->weakreflist != NULL)
- PyObject_ClearWeakRefs((PyObject *)self);
+ if (self->weakreflist != NULL)
+ PyObject_ClearWeakRefs((PyObject *)self);
- if(self->base) {
- /* UPDATEIFCOPY means that base points to an
- array that should be updated with the contents
- of this array upon destruction.
- self->base->flags must have been WRITEABLE
- (checked previously) and it was locked here
- thus, unlock it.
- */
- if (self->flags & UPDATEIFCOPY) {
- ((PyArrayObject *)self->base)->flags |= WRITEABLE;
- Py_INCREF(self); /* hold on to self in next call */
- if (PyArray_CopyAnyInto((PyArrayObject *)self->base,
- self) < 0) {
- PyErr_Print();
- PyErr_Clear();
- }
- /* Don't need to DECREF -- because we are deleting
- self already... */
- }
- /* In any case base is pointing to something that we need
- to DECREF -- either a view or a buffer object */
- Py_DECREF(self->base);
- }
-
- if ((self->flags & OWNDATA) && self->data) {
- /* Free internal references if an Object array */
- if (PyDataType_FLAGCHK(self->descr, NPY_ITEM_REFCOUNT)) {
- Py_INCREF(self); /*hold on to self */
- PyArray_XDECREF(self);
- /* Don't need to DECREF -- because we are deleting
- self already... */
- }
- PyDataMem_FREE(self->data);
+ if(self->base) {
+ /* UPDATEIFCOPY means that base points to an
+ array that should be updated with the contents
+ of this array upon destruction.
+ self->base->flags must have been WRITEABLE
+ (checked previously) and it was locked here
+ thus, unlock it.
+ */
+ if (self->flags & UPDATEIFCOPY) {
+ ((PyArrayObject *)self->base)->flags |= WRITEABLE;
+ Py_INCREF(self); /* hold on to self in next call */
+ if (PyArray_CopyAnyInto((PyArrayObject *)self->base,
+ self) < 0) {
+ PyErr_Print();
+ PyErr_Clear();
+ }
+ /* Don't need to DECREF -- because we are deleting
+ self already... */
+ }
+ /* In any case base is pointing to something that we need
+ to DECREF -- either a view or a buffer object */
+ Py_DECREF(self->base);
+ }
+
+ if ((self->flags & OWNDATA) && self->data) {
+ /* Free internal references if an Object array */
+ if (PyDataType_FLAGCHK(self->descr, NPY_ITEM_REFCOUNT)) {
+ Py_INCREF(self); /*hold on to self */
+ PyArray_XDECREF(self);
+ /* Don't need to DECREF -- because we are deleting
+ self already... */
}
+ PyDataMem_FREE(self->data);
+ }
- PyDimMem_FREE(self->dimensions);
+ PyDimMem_FREE(self->dimensions);
- Py_DECREF(self->descr);
+ Py_DECREF(self->descr);
- self->ob_type->tp_free((PyObject *)self);
+ self->ob_type->tp_free((PyObject *)self);
}
/*************************************************************************
@@ -1958,108 +1957,108 @@ array_dealloc(PyArrayObject *self) {
static Py_ssize_t
array_length(PyArrayObject *self)
{
- if (self->nd != 0) {
- return self->dimensions[0];
- } else {
- PyErr_SetString(PyExc_TypeError, "len() of unsized object");
- return -1;
- }
+ if (self->nd != 0) {
+ return self->dimensions[0];
+ } else {
+ PyErr_SetString(PyExc_TypeError, "len() of unsized object");
+ return -1;
+ }
}
static PyObject *
array_big_item(PyArrayObject *self, intp i)
{
- char *item;
- PyArrayObject *r;
-
- if(self->nd == 0) {
- PyErr_SetString(PyExc_IndexError,
- "0-d arrays can't be indexed");
- return NULL;
- }
- if ((item = index2ptr(self, i)) == NULL) return NULL;
+ char *item;
+ PyArrayObject *r;
- Py_INCREF(self->descr);
- r = (PyArrayObject *)PyArray_NewFromDescr(self->ob_type,
- self->descr,
- self->nd-1,
- self->dimensions+1,
- self->strides+1, item,
- self->flags,
- (PyObject *)self);
- if (r == NULL) return NULL;
- Py_INCREF(self);
- r->base = (PyObject *)self;
- PyArray_UpdateFlags(r, CONTIGUOUS | FORTRAN);
- return (PyObject *)r;
+ if(self->nd == 0) {
+ PyErr_SetString(PyExc_IndexError,
+ "0-d arrays can't be indexed");
+ return NULL;
+ }
+ if ((item = index2ptr(self, i)) == NULL) return NULL;
+
+ Py_INCREF(self->descr);
+ r = (PyArrayObject *)PyArray_NewFromDescr(self->ob_type,
+ self->descr,
+ self->nd-1,
+ self->dimensions+1,
+ self->strides+1, item,
+ self->flags,
+ (PyObject *)self);
+ if (r == NULL) return NULL;
+ Py_INCREF(self);
+ r->base = (PyObject *)self;
+ PyArray_UpdateFlags(r, CONTIGUOUS | FORTRAN);
+ return (PyObject *)r;
}
/* contains optimization for 1-d arrays */
static PyObject *
array_item_nice(PyArrayObject *self, Py_ssize_t i)
{
- if (self->nd == 1) {
- char *item;
- if ((item = index2ptr(self, i)) == NULL) return NULL;
- return PyArray_Scalar(item, self->descr, (PyObject *)self);
- }
- else {
- return PyArray_Return((PyArrayObject *)\
- array_big_item(self, (intp) i));
- }
+ if (self->nd == 1) {
+ char *item;
+ if ((item = index2ptr(self, i)) == NULL) return NULL;
+ return PyArray_Scalar(item, self->descr, (PyObject *)self);
+ }
+ else {
+ return PyArray_Return((PyArrayObject *)\
+ array_big_item(self, (intp) i));
+ }
}
static int
array_ass_big_item(PyArrayObject *self, intp i, PyObject *v)
{
- PyArrayObject *tmp;
- char *item;
- int ret;
+ PyArrayObject *tmp;
+ char *item;
+ int ret;
- if (v == NULL) {
- PyErr_SetString(PyExc_ValueError,
- "can't delete array elements");
- return -1;
- }
- if (!PyArray_ISWRITEABLE(self)) {
- PyErr_SetString(PyExc_RuntimeError,
- "array is not writeable");
- return -1;
- }
- if (self->nd == 0) {
- PyErr_SetString(PyExc_IndexError,
- "0-d arrays can't be indexed.");
- return -1;
- }
+ if (v == NULL) {
+ PyErr_SetString(PyExc_ValueError,
+ "can't delete array elements");
+ return -1;
+ }
+ if (!PyArray_ISWRITEABLE(self)) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "array is not writeable");
+ return -1;
+ }
+ if (self->nd == 0) {
+ PyErr_SetString(PyExc_IndexError,
+ "0-d arrays can't be indexed.");
+ return -1;
+ }
- if (self->nd > 1) {
- if((tmp = (PyArrayObject *)array_big_item(self, i)) == NULL)
- return -1;
- ret = PyArray_CopyObject(tmp, v);
- Py_DECREF(tmp);
- return ret;
- }
+ if (self->nd > 1) {
+ if((tmp = (PyArrayObject *)array_big_item(self, i)) == NULL)
+ return -1;
+ ret = PyArray_CopyObject(tmp, v);
+ Py_DECREF(tmp);
+ return ret;
+ }
- if ((item = index2ptr(self, i)) == NULL) return -1;
- if (self->descr->f->setitem(v, item, self) == -1) return -1;
- return 0;
+ if ((item = index2ptr(self, i)) == NULL) return -1;
+ if (self->descr->f->setitem(v, item, self) == -1) return -1;
+ return 0;
}
#if PY_VERSION_HEX < 0x02050000
- #if SIZEOF_INT == SIZEOF_INTP
- #define array_ass_item array_ass_big_item
- #endif
+#if SIZEOF_INT == SIZEOF_INTP
+#define array_ass_item array_ass_big_item
+#endif
#else
- #if SIZEOF_SIZE_T == SIZEOF_INTP
- #define array_ass_item array_ass_big_item
- #endif
+#if SIZEOF_SIZE_T == SIZEOF_INTP
+#define array_ass_item array_ass_big_item
+#endif
#endif
#ifndef array_ass_item
static int
array_ass_item(PyArrayObject *self, Py_ssize_t i, PyObject *v)
{
- return array_ass_big_item(self, (intp) i, v);
+ return array_ass_big_item(self, (intp) i, v);
}
#endif
@@ -2068,12 +2067,12 @@ array_ass_item(PyArrayObject *self, Py_ssize_t i, PyObject *v)
static int
slice_coerce_index(PyObject *o, intp *v)
{
- *v = PyArray_PyIntAsIntp(o);
- if (error_converting(*v)) {
- PyErr_Clear();
- return 0;
- }
- return 1;
+ *v = PyArray_PyIntAsIntp(o);
+ if (error_converting(*v)) {
+ PyErr_Clear();
+ return 0;
+ }
+ return 1;
}
@@ -2084,52 +2083,52 @@ slice_GetIndices(PySliceObject *r, intp length,
intp *start, intp *stop, intp *step,
intp *slicelength)
{
- intp defstop;
+ intp defstop;
- if (r->step == Py_None) {
- *step = 1;
- } else {
- if (!slice_coerce_index(r->step, step)) return -1;
- if (*step == 0) {
- PyErr_SetString(PyExc_ValueError,
- "slice step cannot be zero");
- return -1;
- }
+ if (r->step == Py_None) {
+ *step = 1;
+ } else {
+ if (!slice_coerce_index(r->step, step)) return -1;
+ if (*step == 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "slice step cannot be zero");
+ return -1;
}
- /* defstart = *step < 0 ? length - 1 : 0; */
+ }
+ /* defstart = *step < 0 ? length - 1 : 0; */
- defstop = *step < 0 ? -1 : length;
+ defstop = *step < 0 ? -1 : length;
- if (r->start == Py_None) {
- *start = *step < 0 ? length-1 : 0;
- } else {
- if (!slice_coerce_index(r->start, start)) return -1;
- if (*start < 0) *start += length;
- if (*start < 0) *start = (*step < 0) ? -1 : 0;
- if (*start >= length) {
- *start = (*step < 0) ? length - 1 : length;
- }
+ if (r->start == Py_None) {
+ *start = *step < 0 ? length-1 : 0;
+ } else {
+ if (!slice_coerce_index(r->start, start)) return -1;
+ if (*start < 0) *start += length;
+ if (*start < 0) *start = (*step < 0) ? -1 : 0;
+ if (*start >= length) {
+ *start = (*step < 0) ? length - 1 : length;
}
+ }
- if (r->stop == Py_None) {
- *stop = defstop;
- } else {
- if (!slice_coerce_index(r->stop, stop)) return -1;
- if (*stop < 0) *stop += length;
+ if (r->stop == Py_None) {
+ *stop = defstop;
+ } else {
+ if (!slice_coerce_index(r->stop, stop)) return -1;
+ if (*stop < 0) *stop += length;
if (*stop < 0) *stop = -1;
if (*stop > length) *stop = length;
- }
+ }
- if ((*step < 0 && *stop >= *start) || \
- (*step > 0 && *start >= *stop)) {
- *slicelength = 0;
- } else if (*step < 0) {
- *slicelength = (*stop - *start + 1) / (*step) + 1;
- } else {
- *slicelength = (*stop - *start - 1) / (*step) + 1;
- }
+ if ((*step < 0 && *stop >= *start) || \
+ (*step > 0 && *start >= *stop)) {
+ *slicelength = 0;
+ } else if (*step < 0) {
+ *slicelength = (*stop - *start + 1) / (*step) + 1;
+ } else {
+ *slicelength = (*stop - *start - 1) / (*step) + 1;
+ }
- return 0;
+ return 0;
}
#define PseudoIndex -1
@@ -2139,49 +2138,49 @@ slice_GetIndices(PySliceObject *r, intp length,
static intp
parse_subindex(PyObject *op, intp *step_size, intp *n_steps, intp max)
{
- intp index;
-
- if (op == Py_None) {
- *n_steps = PseudoIndex;
- index = 0;
- } else if (op == Py_Ellipsis) {
- *n_steps = RubberIndex;
- index = 0;
- } else if (PySlice_Check(op)) {
- intp stop;
- if (slice_GetIndices((PySliceObject *)op, max,
- &index, &stop, step_size, n_steps) < 0) {
- if (!PyErr_Occurred()) {
- PyErr_SetString(PyExc_IndexError,
- "invalid slice");
- }
- goto fail;
- }
- if (*n_steps <= 0) {
- *n_steps = 0;
- *step_size = 1;
- index = 0;
- }
- } else {
- index = PyArray_PyIntAsIntp(op);
- if (error_converting(index)) {
- PyErr_SetString(PyExc_IndexError,
- "each subindex must be either a "\
- "slice, an integer, Ellipsis, or "\
- "newaxis");
- goto fail;
- }
- *n_steps = SingleIndex;
- *step_size = 0;
- if (index < 0) index += max;
- if (index >= max || index < 0) {
- PyErr_SetString(PyExc_IndexError, "invalid index");
- goto fail;
- }
+ intp index;
+
+ if (op == Py_None) {
+ *n_steps = PseudoIndex;
+ index = 0;
+ } else if (op == Py_Ellipsis) {
+ *n_steps = RubberIndex;
+ index = 0;
+ } else if (PySlice_Check(op)) {
+ intp stop;
+ if (slice_GetIndices((PySliceObject *)op, max,
+ &index, &stop, step_size, n_steps) < 0) {
+ if (!PyErr_Occurred()) {
+ PyErr_SetString(PyExc_IndexError,
+ "invalid slice");
+ }
+ goto fail;
+ }
+ if (*n_steps <= 0) {
+ *n_steps = 0;
+ *step_size = 1;
+ index = 0;
+ }
+ } else {
+ index = PyArray_PyIntAsIntp(op);
+ if (error_converting(index)) {
+ PyErr_SetString(PyExc_IndexError,
+ "each subindex must be either a "\
+ "slice, an integer, Ellipsis, or "\
+ "newaxis");
+ goto fail;
+ }
+ *n_steps = SingleIndex;
+ *step_size = 0;
+ if (index < 0) index += max;
+ if (index >= max || index < 0) {
+ PyErr_SetString(PyExc_IndexError, "invalid index");
+ goto fail;
}
- return index;
+ }
+ return index;
fail:
- return -1;
+ return -1;
}
@@ -2189,168 +2188,168 @@ static int
parse_index(PyArrayObject *self, PyObject *op,
intp *dimensions, intp *strides, intp *offset_ptr)
{
- int i, j, n;
- int nd_old, nd_new, n_add, n_pseudo;
- intp n_steps, start, offset, step_size;
- PyObject *op1=NULL;
- int is_slice;
+ int i, j, n;
+ int nd_old, nd_new, n_add, n_pseudo;
+ intp n_steps, start, offset, step_size;
+ PyObject *op1=NULL;
+ int is_slice;
- if (PySlice_Check(op) || op == Py_Ellipsis || op == Py_None) {
- n = 1;
- op1 = op;
- Py_INCREF(op);
- /* this relies on the fact that n==1 for loop below */
- is_slice = 1;
- }
- else {
- if (!PySequence_Check(op)) {
- PyErr_SetString(PyExc_IndexError,
- "index must be either an int "\
- "or a sequence");
- return -1;
- }
- n = PySequence_Length(op);
- is_slice = 0;
- }
+ if (PySlice_Check(op) || op == Py_Ellipsis || op == Py_None) {
+ n = 1;
+ op1 = op;
+ Py_INCREF(op);
+ /* this relies on the fact that n==1 for loop below */
+ is_slice = 1;
+ }
+ else {
+ if (!PySequence_Check(op)) {
+ PyErr_SetString(PyExc_IndexError,
+ "index must be either an int "\
+ "or a sequence");
+ return -1;
+ }
+ n = PySequence_Length(op);
+ is_slice = 0;
+ }
- nd_old = nd_new = 0;
+ nd_old = nd_new = 0;
- offset = 0;
- for(i=0; i<n; i++) {
- if (!is_slice) {
- if (!(op1=PySequence_GetItem(op, i))) {
- PyErr_SetString(PyExc_IndexError,
- "invalid index");
- return -1;
- }
- }
+ offset = 0;
+ for(i=0; i<n; i++) {
+ if (!is_slice) {
+ if (!(op1=PySequence_GetItem(op, i))) {
+ PyErr_SetString(PyExc_IndexError,
+ "invalid index");
+ return -1;
+ }
+ }
- start = parse_subindex(op1, &step_size, &n_steps,
- nd_old < self->nd ? \
- self->dimensions[nd_old] : 0);
- Py_DECREF(op1);
- if (start == -1) break;
+ start = parse_subindex(op1, &step_size, &n_steps,
+ nd_old < self->nd ? \
+ self->dimensions[nd_old] : 0);
+ Py_DECREF(op1);
+ if (start == -1) break;
- if (n_steps == PseudoIndex) {
- dimensions[nd_new] = 1; strides[nd_new] = 0;
- nd_new++;
- } else {
- if (n_steps == RubberIndex) {
- for(j=i+1, n_pseudo=0; j<n; j++) {
- op1 = PySequence_GetItem(op, j);
- if (op1 == Py_None) n_pseudo++;
- Py_DECREF(op1);
- }
- n_add = self->nd-(n-i-n_pseudo-1+nd_old);
- if (n_add < 0) {
- PyErr_SetString(PyExc_IndexError,
- "too many indices");
- return -1;
- }
- for(j=0; j<n_add; j++) {
- dimensions[nd_new] = \
- self->dimensions[nd_old];
- strides[nd_new] = \
- self->strides[nd_old];
- nd_new++; nd_old++;
- }
- } else {
- if (nd_old >= self->nd) {
- PyErr_SetString(PyExc_IndexError,
- "too many indices");
- return -1;
- }
- offset += self->strides[nd_old]*start;
- nd_old++;
- if (n_steps != SingleIndex) {
- dimensions[nd_new] = n_steps;
- strides[nd_new] = step_size * \
- self->strides[nd_old-1];
- nd_new++;
- }
- }
+ if (n_steps == PseudoIndex) {
+ dimensions[nd_new] = 1; strides[nd_new] = 0;
+ nd_new++;
+ } else {
+ if (n_steps == RubberIndex) {
+ for(j=i+1, n_pseudo=0; j<n; j++) {
+ op1 = PySequence_GetItem(op, j);
+ if (op1 == Py_None) n_pseudo++;
+ Py_DECREF(op1);
+ }
+ n_add = self->nd-(n-i-n_pseudo-1+nd_old);
+ if (n_add < 0) {
+ PyErr_SetString(PyExc_IndexError,
+ "too many indices");
+ return -1;
+ }
+ for(j=0; j<n_add; j++) {
+ dimensions[nd_new] = \
+ self->dimensions[nd_old];
+ strides[nd_new] = \
+ self->strides[nd_old];
+ nd_new++; nd_old++;
}
+ } else {
+ if (nd_old >= self->nd) {
+ PyErr_SetString(PyExc_IndexError,
+ "too many indices");
+ return -1;
+ }
+ offset += self->strides[nd_old]*start;
+ nd_old++;
+ if (n_steps != SingleIndex) {
+ dimensions[nd_new] = n_steps;
+ strides[nd_new] = step_size * \
+ self->strides[nd_old-1];
+ nd_new++;
+ }
+ }
}
- if (i < n) return -1;
- n_add = self->nd-nd_old;
- for(j=0; j<n_add; j++) {
- dimensions[nd_new] = self->dimensions[nd_old];
- strides[nd_new] = self->strides[nd_old];
- nd_new++; nd_old++;
- }
- *offset_ptr = offset;
- return nd_new;
+ }
+ if (i < n) return -1;
+ n_add = self->nd-nd_old;
+ for(j=0; j<n_add; j++) {
+ dimensions[nd_new] = self->dimensions[nd_old];
+ strides[nd_new] = self->strides[nd_old];
+ nd_new++; nd_old++;
+ }
+ *offset_ptr = offset;
+ return nd_new;
}
static void
_swap_axes(PyArrayMapIterObject *mit, PyArrayObject **ret, int getmap)
{
- PyObject *new;
- int n1, n2, n3, val, bnd;
- int i;
- PyArray_Dims permute;
- intp d[MAX_DIMS];
- PyArrayObject *arr;
-
- permute.ptr = d;
- permute.len = mit->nd;
-
- /* arr might not have the right number of dimensions
- and need to be reshaped first by pre-pending ones */
- arr = *ret;
- if (arr->nd != mit->nd) {
- for (i=1; i<=arr->nd; i++) {
- permute.ptr[mit->nd-i] = arr->dimensions[arr->nd-i];
- }
- for (i=0; i<mit->nd-arr->nd; i++) {
- permute.ptr[i] = 1;
- }
- new = PyArray_Newshape(arr, &permute, PyArray_ANYORDER);
- Py_DECREF(arr);
- *ret = (PyArrayObject *)new;
- if (new == NULL) return;
- }
-
- /* Setting and getting need to have different permutations.
- On the get we are permuting the returned object, but on
- setting we are permuting the object-to-be-set.
- The set permutation is the inverse of the get permutation.
- */
+ PyObject *new;
+ int n1, n2, n3, val, bnd;
+ int i;
+ PyArray_Dims permute;
+ intp d[MAX_DIMS];
+ PyArrayObject *arr;
- /* For getting the array the tuple for transpose is
- (n1,...,n1+n2-1,0,...,n1-1,n1+n2,...,n3-1)
- n1 is the number of dimensions of
- the broadcasted index array
- n2 is the number of dimensions skipped at the
- start
- n3 is the number of dimensions of the
- result
- */
+ permute.ptr = d;
+ permute.len = mit->nd;
- /* For setting the array the tuple for transpose is
- (n2,...,n1+n2-1,0,...,n2-1,n1+n2,...n3-1)
- */
- n1 = mit->iters[0]->nd_m1 + 1;
- n2 = mit->iteraxes[0];
- n3 = mit->nd;
-
- bnd = (getmap ? n1 : n2); /* use n1 as the boundary if getting
- but n2 if setting */
-
- val = bnd;
- i = 0;
- while(val < n1+n2)
- permute.ptr[i++] = val++;
- val = 0;
- while(val < bnd)
- permute.ptr[i++] = val++;
- val = n1+n2;
- while(val < n3)
- permute.ptr[i++] = val++;
-
- new = PyArray_Transpose(*ret, &permute);
- Py_DECREF(*ret);
+ /* arr might not have the right number of dimensions
+ and need to be reshaped first by pre-pending ones */
+ arr = *ret;
+ if (arr->nd != mit->nd) {
+ for (i=1; i<=arr->nd; i++) {
+ permute.ptr[mit->nd-i] = arr->dimensions[arr->nd-i];
+ }
+ for (i=0; i<mit->nd-arr->nd; i++) {
+ permute.ptr[i] = 1;
+ }
+ new = PyArray_Newshape(arr, &permute, PyArray_ANYORDER);
+ Py_DECREF(arr);
*ret = (PyArrayObject *)new;
+ if (new == NULL) return;
+ }
+
+ /* Setting and getting need to have different permutations.
+ On the get we are permuting the returned object, but on
+ setting we are permuting the object-to-be-set.
+ The set permutation is the inverse of the get permutation.
+ */
+
+ /* For getting the array the tuple for transpose is
+ (n1,...,n1+n2-1,0,...,n1-1,n1+n2,...,n3-1)
+ n1 is the number of dimensions of
+ the broadcasted index array
+ n2 is the number of dimensions skipped at the
+ start
+ n3 is the number of dimensions of the
+ result
+ */
+
+ /* For setting the array the tuple for transpose is
+ (n2,...,n1+n2-1,0,...,n2-1,n1+n2,...n3-1)
+ */
+ n1 = mit->iters[0]->nd_m1 + 1;
+ n2 = mit->iteraxes[0];
+ n3 = mit->nd;
+
+ bnd = (getmap ? n1 : n2); /* use n1 as the boundary if getting
+ but n2 if setting */
+
+ val = bnd;
+ i = 0;
+ while(val < n1+n2)
+ permute.ptr[i++] = val++;
+ val = 0;
+ while(val < bnd)
+ permute.ptr[i++] = val++;
+ val = n1+n2;
+ while(val < n3)
+ permute.ptr[i++] = val++;
+
+ new = PyArray_Transpose(*ret, &permute);
+ Py_DECREF(*ret);
+ *ret = (PyArrayObject *)new;
}
/* Prototypes for Mapping calls --- not part of the C-API
@@ -2366,175 +2365,175 @@ static PyObject *
PyArray_GetMap(PyArrayMapIterObject *mit)
{
- PyArrayObject *ret, *temp;
- PyArrayIterObject *it;
- int index;
- int swap;
- PyArray_CopySwapFunc *copyswap;
-
- /* Unbound map iterator --- Bind should have been called */
- if (mit->ait == NULL) return NULL;
-
- /* This relies on the map iterator object telling us the shape
- of the new array in nd and dimensions.
- */
- temp = mit->ait->ao;
- Py_INCREF(temp->descr);
- ret = (PyArrayObject *)\
- PyArray_NewFromDescr(temp->ob_type,
- temp->descr,
- mit->nd, mit->dimensions,
- NULL, NULL,
- PyArray_ISFORTRAN(temp),
- (PyObject *)temp);
- if (ret == NULL) return NULL;
-
- /* Now just iterate through the new array filling it in
- with the next object from the original array as
- defined by the mapping iterator */
-
- if ((it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ret))
- == NULL) {
- Py_DECREF(ret);
- return NULL;
- }
- index = it->size;
- swap = (PyArray_ISNOTSWAPPED(temp) != PyArray_ISNOTSWAPPED(ret));
- copyswap = ret->descr->f->copyswap;
- PyArray_MapIterReset(mit);
- while (index--) {
- copyswap(it->dataptr, mit->dataptr, swap, ret);
- PyArray_MapIterNext(mit);
- PyArray_ITER_NEXT(it);
- }
- Py_DECREF(it);
+ PyArrayObject *ret, *temp;
+ PyArrayIterObject *it;
+ int index;
+ int swap;
+ PyArray_CopySwapFunc *copyswap;
+
+ /* Unbound map iterator --- Bind should have been called */
+ if (mit->ait == NULL) return NULL;
+
+ /* This relies on the map iterator object telling us the shape
+ of the new array in nd and dimensions.
+ */
+ temp = mit->ait->ao;
+ Py_INCREF(temp->descr);
+ ret = (PyArrayObject *)\
+ PyArray_NewFromDescr(temp->ob_type,
+ temp->descr,
+ mit->nd, mit->dimensions,
+ NULL, NULL,
+ PyArray_ISFORTRAN(temp),
+ (PyObject *)temp);
+ if (ret == NULL) return NULL;
+
+ /* Now just iterate through the new array filling it in
+ with the next object from the original array as
+ defined by the mapping iterator */
+
+ if ((it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ret))
+ == NULL) {
+ Py_DECREF(ret);
+ return NULL;
+ }
+ index = it->size;
+ swap = (PyArray_ISNOTSWAPPED(temp) != PyArray_ISNOTSWAPPED(ret));
+ copyswap = ret->descr->f->copyswap;
+ PyArray_MapIterReset(mit);
+ while (index--) {
+ copyswap(it->dataptr, mit->dataptr, swap, ret);
+ PyArray_MapIterNext(mit);
+ PyArray_ITER_NEXT(it);
+ }
+ Py_DECREF(it);
- /* check for consecutive axes */
- if ((mit->subspace != NULL) && (mit->consec)) {
- if (mit->iteraxes[0] > 0) { /* then we need to swap */
- _swap_axes(mit, &ret, 1);
- }
+ /* check for consecutive axes */
+ if ((mit->subspace != NULL) && (mit->consec)) {
+ if (mit->iteraxes[0] > 0) { /* then we need to swap */
+ _swap_axes(mit, &ret, 1);
}
- return (PyObject *)ret;
+ }
+ return (PyObject *)ret;
}
static int
PyArray_SetMap(PyArrayMapIterObject *mit, PyObject *op)
{
- PyObject *arr=NULL;
- PyArrayIterObject *it;
- int index;
- int swap;
- PyArray_CopySwapFunc *copyswap;
- PyArray_Descr *descr;
+ PyObject *arr=NULL;
+ PyArrayIterObject *it;
+ int index;
+ int swap;
+ PyArray_CopySwapFunc *copyswap;
+ PyArray_Descr *descr;
- /* Unbound Map Iterator */
- if (mit->ait == NULL) return -1;
+ /* Unbound Map Iterator */
+ if (mit->ait == NULL) return -1;
- descr = mit->ait->ao->descr;
- Py_INCREF(descr);
- arr = PyArray_FromAny(op, descr, 0, 0, FORCECAST, NULL);
- if (arr == NULL) return -1;
+ descr = mit->ait->ao->descr;
+ Py_INCREF(descr);
+ arr = PyArray_FromAny(op, descr, 0, 0, FORCECAST, NULL);
+ if (arr == NULL) return -1;
- if ((mit->subspace != NULL) && (mit->consec)) {
- if (mit->iteraxes[0] > 0) { /* then we need to swap */
- _swap_axes(mit, (PyArrayObject **)&arr, 0);
- if (arr == NULL) return -1;
- }
+ if ((mit->subspace != NULL) && (mit->consec)) {
+ if (mit->iteraxes[0] > 0) { /* then we need to swap */
+ _swap_axes(mit, (PyArrayObject **)&arr, 0);
+ if (arr == NULL) return -1;
}
+ }
- /* Be sure values array is "broadcastable"
- to shape of mit->dimensions, mit->nd */
+ /* Be sure values array is "broadcastable"
+ to shape of mit->dimensions, mit->nd */
- if ((it = (PyArrayIterObject *)\
- PyArray_BroadcastToShape(arr, mit->dimensions, mit->nd))==NULL) {
- Py_DECREF(arr);
- return -1;
- }
+ if ((it = (PyArrayIterObject *)\
+ PyArray_BroadcastToShape(arr, mit->dimensions, mit->nd))==NULL) {
+ Py_DECREF(arr);
+ return -1;
+ }
- index = mit->size;
- swap = (PyArray_ISNOTSWAPPED(mit->ait->ao) != \
- (PyArray_ISNOTSWAPPED(arr)));
- copyswap = PyArray_DESCR(arr)->f->copyswap;
- PyArray_MapIterReset(mit);
- /* Need to decref hasobject arrays */
- if (PyDataType_FLAGCHK(descr, NPY_ITEM_REFCOUNT)) {
- while (index--) {
- PyArray_Item_XDECREF(mit->dataptr, PyArray_DESCR(arr));
- PyArray_Item_INCREF(it->dataptr, PyArray_DESCR(arr));
- memmove(mit->dataptr, it->dataptr, sizeof(PyObject *));
- /* ignored unless VOID array with object's */
- if (swap)
- copyswap(mit->dataptr, NULL, swap, arr);
- PyArray_MapIterNext(mit);
- PyArray_ITER_NEXT(it);
- }
- Py_DECREF(arr);
- Py_DECREF(it);
- return 0;
- }
- while(index--) {
- memmove(mit->dataptr, it->dataptr, PyArray_ITEMSIZE(arr));
- if (swap)
- copyswap(mit->dataptr, NULL, swap, arr);
- PyArray_MapIterNext(mit);
- PyArray_ITER_NEXT(it);
+ index = mit->size;
+ swap = (PyArray_ISNOTSWAPPED(mit->ait->ao) != \
+ (PyArray_ISNOTSWAPPED(arr)));
+ copyswap = PyArray_DESCR(arr)->f->copyswap;
+ PyArray_MapIterReset(mit);
+ /* Need to decref hasobject arrays */
+ if (PyDataType_FLAGCHK(descr, NPY_ITEM_REFCOUNT)) {
+ while (index--) {
+ PyArray_Item_XDECREF(mit->dataptr, PyArray_DESCR(arr));
+ PyArray_Item_INCREF(it->dataptr, PyArray_DESCR(arr));
+ memmove(mit->dataptr, it->dataptr, sizeof(PyObject *));
+ /* ignored unless VOID array with object's */
+ if (swap)
+ copyswap(mit->dataptr, NULL, swap, arr);
+ PyArray_MapIterNext(mit);
+ PyArray_ITER_NEXT(it);
}
Py_DECREF(arr);
Py_DECREF(it);
return 0;
+ }
+ while(index--) {
+ memmove(mit->dataptr, it->dataptr, PyArray_ITEMSIZE(arr));
+ if (swap)
+ copyswap(mit->dataptr, NULL, swap, arr);
+ PyArray_MapIterNext(mit);
+ PyArray_ITER_NEXT(it);
+ }
+ Py_DECREF(arr);
+ Py_DECREF(it);
+ return 0;
}
int
count_new_axes_0d(PyObject *tuple)
{
- int i, argument_count;
- int ellipsis_count = 0;
- int newaxis_count = 0;
+ int i, argument_count;
+ int ellipsis_count = 0;
+ int newaxis_count = 0;
- argument_count = PyTuple_GET_SIZE(tuple);
+ argument_count = PyTuple_GET_SIZE(tuple);
- for (i = 0; i < argument_count; ++i) {
- PyObject *arg = PyTuple_GET_ITEM(tuple, i);
- if (arg == Py_Ellipsis && !ellipsis_count) ellipsis_count++;
- else if (arg == Py_None) newaxis_count++;
- else break;
- }
- if (i < argument_count) {
- PyErr_SetString(PyExc_IndexError,
- "0-d arrays can only use a single ()"
- " or a list of newaxes (and a single ...)"
- " as an index");
- return -1;
- }
- if (newaxis_count > MAX_DIMS) {
- PyErr_SetString(PyExc_IndexError,
- "too many dimensions");
- return -1;
- }
- return newaxis_count;
+ for (i = 0; i < argument_count; ++i) {
+ PyObject *arg = PyTuple_GET_ITEM(tuple, i);
+ if (arg == Py_Ellipsis && !ellipsis_count) ellipsis_count++;
+ else if (arg == Py_None) newaxis_count++;
+ else break;
+ }
+ if (i < argument_count) {
+ PyErr_SetString(PyExc_IndexError,
+ "0-d arrays can only use a single ()"
+ " or a list of newaxes (and a single ...)"
+ " as an index");
+ return -1;
+ }
+ if (newaxis_count > MAX_DIMS) {
+ PyErr_SetString(PyExc_IndexError,
+ "too many dimensions");
+ return -1;
+ }
+ return newaxis_count;
}
static PyObject *
add_new_axes_0d(PyArrayObject *arr, int newaxis_count)
{
- PyArrayObject *other;
- intp dimensions[MAX_DIMS];
- int i;
- for (i = 0; i < newaxis_count; ++i) {
- dimensions[i] = 1;
- }
- Py_INCREF(arr->descr);
- if ((other = (PyArrayObject *)
- PyArray_NewFromDescr(arr->ob_type, arr->descr,
- newaxis_count, dimensions,
- NULL, arr->data,
- arr->flags,
- (PyObject *)arr)) == NULL)
- return NULL;
- other->base = (PyObject *)arr;
- Py_INCREF(arr);
- return (PyObject *)other;
+ PyArrayObject *other;
+ intp dimensions[MAX_DIMS];
+ int i;
+ for (i = 0; i < newaxis_count; ++i) {
+ dimensions[i] = 1;
+ }
+ Py_INCREF(arr->descr);
+ if ((other = (PyArrayObject *)
+ PyArray_NewFromDescr(arr->ob_type, arr->descr,
+ newaxis_count, dimensions,
+ NULL, arr->data,
+ arr->flags,
+ (PyObject *)arr)) == NULL)
+ return NULL;
+ other->base = (PyObject *)arr;
+ Py_INCREF(arr);
+ return (PyObject *)other;
}
@@ -2549,67 +2548,67 @@ add_new_axes_0d(PyArrayObject *arr, int newaxis_count)
static int
fancy_indexing_check(PyObject *args)
{
- int i, n;
- PyObject *obj;
- int retval = SOBJ_NOTFANCY;
-
- if (PyTuple_Check(args)) {
- n = PyTuple_GET_SIZE(args);
- if (n >= MAX_DIMS) return SOBJ_TOOMANY;
- for (i=0; i<n; i++) {
- obj = PyTuple_GET_ITEM(args,i);
- if (PyArray_Check(obj)) {
- if (PyArray_ISINTEGER(obj) ||
- PyArray_ISBOOL(obj))
- retval = SOBJ_ISFANCY;
- else {
- retval = SOBJ_BADARRAY;
- break;
- }
- }
- else if (PySequence_Check(obj)) {
- retval = SOBJ_ISFANCY;
- }
+ int i, n;
+ PyObject *obj;
+ int retval = SOBJ_NOTFANCY;
+
+ if (PyTuple_Check(args)) {
+ n = PyTuple_GET_SIZE(args);
+ if (n >= MAX_DIMS) return SOBJ_TOOMANY;
+ for (i=0; i<n; i++) {
+ obj = PyTuple_GET_ITEM(args,i);
+ if (PyArray_Check(obj)) {
+ if (PyArray_ISINTEGER(obj) ||
+ PyArray_ISBOOL(obj))
+ retval = SOBJ_ISFANCY;
+ else {
+ retval = SOBJ_BADARRAY;
+ break;
}
+ }
+ else if (PySequence_Check(obj)) {
+ retval = SOBJ_ISFANCY;
+ }
}
- else if (PyArray_Check(args)) {
- if ((PyArray_TYPE(args)==PyArray_BOOL) ||
- (PyArray_ISINTEGER(args)))
- return SOBJ_ISFANCY;
+ }
+ else if (PyArray_Check(args)) {
+ if ((PyArray_TYPE(args)==PyArray_BOOL) ||
+ (PyArray_ISINTEGER(args)))
+ return SOBJ_ISFANCY;
+ else
+ return SOBJ_BADARRAY;
+ }
+ else if (PySequence_Check(args)) {
+ /* Sequences < MAX_DIMS with any slice objects
+ or newaxis, or Ellipsis is considered standard
+ as long as there are also no Arrays and or additional
+ sequences embedded.
+ */
+ retval = SOBJ_ISFANCY;
+ n = PySequence_Size(args);
+ if (n<0 || n>=MAX_DIMS) return SOBJ_ISFANCY;
+ for (i=0; i<n; i++) {
+ obj = PySequence_GetItem(args, i);
+ if (obj == NULL) return SOBJ_ISFANCY;
+ if (PyArray_Check(obj)) {
+ if (PyArray_ISINTEGER(obj) ||
+ PyArray_ISBOOL(obj))
+ retval = SOBJ_LISTTUP;
else
- return SOBJ_BADARRAY;
- }
- else if (PySequence_Check(args)) {
- /* Sequences < MAX_DIMS with any slice objects
- or newaxis, or Ellipsis is considered standard
- as long as there are also no Arrays and or additional
- sequences embedded.
- */
- retval = SOBJ_ISFANCY;
- n = PySequence_Size(args);
- if (n<0 || n>=MAX_DIMS) return SOBJ_ISFANCY;
- for (i=0; i<n; i++) {
- obj = PySequence_GetItem(args, i);
- if (obj == NULL) return SOBJ_ISFANCY;
- if (PyArray_Check(obj)) {
- if (PyArray_ISINTEGER(obj) ||
- PyArray_ISBOOL(obj))
- retval = SOBJ_LISTTUP;
- else
- retval = SOBJ_BADARRAY;
- }
- else if (PySequence_Check(obj)) {
- retval = SOBJ_LISTTUP;
- }
- else if (PySlice_Check(obj) || obj == Py_Ellipsis ||
- obj == Py_None) {
- retval = SOBJ_NOTFANCY;
- }
- Py_DECREF(obj);
- if (retval > SOBJ_ISFANCY) return retval;
- }
+ retval = SOBJ_BADARRAY;
+ }
+ else if (PySequence_Check(obj)) {
+ retval = SOBJ_LISTTUP;
+ }
+ else if (PySlice_Check(obj) || obj == Py_Ellipsis ||
+ obj == Py_None) {
+ retval = SOBJ_NOTFANCY;
+ }
+ Py_DECREF(obj);
+ if (retval > SOBJ_ISFANCY) return retval;
}
- return retval;
+ }
+ return retval;
}
/* Called when treating array object like a mapping -- called first from
@@ -2620,11 +2619,11 @@ fancy_indexing_check(PyObject *args)
/* There are two situations:
- 1 - the subscript is a standard view and a reference to the
- array can be returned
+ 1 - the subscript is a standard view and a reference to the
+ array can be returned
- 2 - the subscript uses Boolean masks or integer indexing and
- therefore a new array is created and returned.
+ 2 - the subscript uses Boolean masks or integer indexing and
+ therefore a new array is created and returned.
*/
@@ -2636,143 +2635,143 @@ static PyObject *iter_subscript(PyArrayIterObject *, PyObject *);
static PyObject *
array_subscript_simple(PyArrayObject *self, PyObject *op)
{
- intp dimensions[MAX_DIMS], strides[MAX_DIMS];
- intp offset;
- int nd;
- PyArrayObject *other;
- intp value;
-
- value = PyArray_PyIntAsIntp(op);
- if (!PyErr_Occurred()) {
- return array_big_item(self, value);
- }
- PyErr_Clear();
+ intp dimensions[MAX_DIMS], strides[MAX_DIMS];
+ intp offset;
+ int nd;
+ PyArrayObject *other;
+ intp value;
- /* Standard (view-based) Indexing */
- if ((nd = parse_index(self, op, dimensions, strides, &offset))
- == -1) return NULL;
-
- /* This will only work if new array will be a view */
- Py_INCREF(self->descr);
- if ((other = (PyArrayObject *) \
- PyArray_NewFromDescr(self->ob_type, self->descr,
- nd, dimensions,
- strides, self->data+offset,
- self->flags,
- (PyObject *)self)) == NULL)
- return NULL;
+ value = PyArray_PyIntAsIntp(op);
+ if (!PyErr_Occurred()) {
+ return array_big_item(self, value);
+ }
+ PyErr_Clear();
+
+ /* Standard (view-based) Indexing */
+ if ((nd = parse_index(self, op, dimensions, strides, &offset))
+ == -1) return NULL;
+
+ /* This will only work if new array will be a view */
+ Py_INCREF(self->descr);
+ if ((other = (PyArrayObject *) \
+ PyArray_NewFromDescr(self->ob_type, self->descr,
+ nd, dimensions,
+ strides, self->data+offset,
+ self->flags,
+ (PyObject *)self)) == NULL)
+ return NULL;
- other->base = (PyObject *)self;
- Py_INCREF(self);
+ other->base = (PyObject *)self;
+ Py_INCREF(self);
- PyArray_UpdateFlags(other, UPDATE_ALL);
+ PyArray_UpdateFlags(other, UPDATE_ALL);
- return (PyObject *)other;
+ return (PyObject *)other;
}
static PyObject *
array_subscript(PyArrayObject *self, PyObject *op)
{
- int nd, fancy;
- PyArrayObject *other;
- PyArrayMapIterObject *mit;
+ int nd, fancy;
+ PyArrayObject *other;
+ PyArrayMapIterObject *mit;
- if (PyString_Check(op) || PyUnicode_Check(op)) {
- if (self->descr->names) {
- PyObject *obj;
- obj = PyDict_GetItem(self->descr->fields, op);
- if (obj != NULL) {
- PyArray_Descr *descr;
- int offset;
- PyObject *title;
-
- if (PyArg_ParseTuple(obj, "Oi|O",
- &descr, &offset, &title)) {
- Py_INCREF(descr);
- return PyArray_GetField(self, descr,
- offset);
- }
- }
- }
+ if (PyString_Check(op) || PyUnicode_Check(op)) {
+ if (self->descr->names) {
+ PyObject *obj;
+ obj = PyDict_GetItem(self->descr->fields, op);
+ if (obj != NULL) {
+ PyArray_Descr *descr;
+ int offset;
+ PyObject *title;
- PyErr_Format(PyExc_ValueError,
- "field named %s not found.",
- PyString_AsString(op));
- return NULL;
+ if (PyArg_ParseTuple(obj, "Oi|O",
+ &descr, &offset, &title)) {
+ Py_INCREF(descr);
+ return PyArray_GetField(self, descr,
+ offset);
+ }
+ }
}
- if (self->nd == 0) {
- if (op == Py_Ellipsis) {
- /* XXX: This leads to a small inconsistency
- XXX: with the nd>0 case where (x[...] is x)
- XXX: is false for nd>0 case. */
- Py_INCREF(self);
- return (PyObject *)self;
- }
- if (op == Py_None)
- return add_new_axes_0d(self, 1);
- if (PyTuple_Check(op)) {
- if (0 == PyTuple_GET_SIZE(op)) {
- Py_INCREF(self);
- return (PyObject *)self;
- }
- if ((nd = count_new_axes_0d(op)) == -1)
- return NULL;
- return add_new_axes_0d(self, nd);
- }
- /* Allow Boolean mask selection also */
- if (PyBool_Check(op) || PyArray_IsScalar(op, Bool) ||
- (PyArray_Check(op) && (PyArray_DIMS(op)==0) &&
- PyArray_ISBOOL(op))) {
- if (PyObject_IsTrue(op)) {
- Py_INCREF(self);
- return (PyObject *)self;
- }
- else {
- intp oned = 0;
- Py_INCREF(self->descr);
- return PyArray_NewFromDescr(self->ob_type,
- self->descr,
- 1, &oned,
- NULL, NULL,
- NPY_DEFAULT,
- NULL);
- }
- }
- PyErr_SetString(PyExc_IndexError,
- "0-d arrays can't be indexed.");
+ PyErr_Format(PyExc_ValueError,
+ "field named %s not found.",
+ PyString_AsString(op));
+ return NULL;
+ }
+
+ if (self->nd == 0) {
+ if (op == Py_Ellipsis) {
+ /* XXX: This leads to a small inconsistency
+ XXX: with the nd>0 case where (x[...] is x)
+ XXX: is false for nd>0 case. */
+ Py_INCREF(self);
+ return (PyObject *)self;
+ }
+ if (op == Py_None)
+ return add_new_axes_0d(self, 1);
+ if (PyTuple_Check(op)) {
+ if (0 == PyTuple_GET_SIZE(op)) {
+ Py_INCREF(self);
+ return (PyObject *)self;
+ }
+ if ((nd = count_new_axes_0d(op)) == -1)
return NULL;
+ return add_new_axes_0d(self, nd);
}
-
- fancy = fancy_indexing_check(op);
-
- if (fancy != SOBJ_NOTFANCY) {
- int oned;
- oned = ((self->nd == 1) &&
- !(PyTuple_Check(op) && PyTuple_GET_SIZE(op) > 1));
-
- /* wrap arguments into a mapiter object */
- mit = (PyArrayMapIterObject *)\
- PyArray_MapIterNew(op, oned, fancy);
- if (mit == NULL) return NULL;
- if (oned) {
- PyArrayIterObject *it;
- PyObject *rval;
- it = (PyArrayIterObject *)\
- PyArray_IterNew((PyObject *)self);
- if (it == NULL) {Py_DECREF(mit); return NULL;}
- rval = iter_subscript(it, mit->indexobj);
- Py_DECREF(it);
- Py_DECREF(mit);
- return rval;
- }
- PyArray_MapIterBind(mit, self);
- other = (PyArrayObject *)PyArray_GetMap(mit);
- Py_DECREF(mit);
- return (PyObject *)other;
+ /* Allow Boolean mask selection also */
+ if (PyBool_Check(op) || PyArray_IsScalar(op, Bool) ||
+ (PyArray_Check(op) && (PyArray_DIMS(op)==0) &&
+ PyArray_ISBOOL(op))) {
+ if (PyObject_IsTrue(op)) {
+ Py_INCREF(self);
+ return (PyObject *)self;
+ }
+ else {
+ intp oned = 0;
+ Py_INCREF(self->descr);
+ return PyArray_NewFromDescr(self->ob_type,
+ self->descr,
+ 1, &oned,
+ NULL, NULL,
+ NPY_DEFAULT,
+ NULL);
+ }
}
+ PyErr_SetString(PyExc_IndexError,
+ "0-d arrays can't be indexed.");
+ return NULL;
+ }
+
+ fancy = fancy_indexing_check(op);
+
+ if (fancy != SOBJ_NOTFANCY) {
+ int oned;
+ oned = ((self->nd == 1) &&
+ !(PyTuple_Check(op) && PyTuple_GET_SIZE(op) > 1));
+
+ /* wrap arguments into a mapiter object */
+ mit = (PyArrayMapIterObject *)\
+ PyArray_MapIterNew(op, oned, fancy);
+ if (mit == NULL) return NULL;
+ if (oned) {
+ PyArrayIterObject *it;
+ PyObject *rval;
+ it = (PyArrayIterObject *)\
+ PyArray_IterNew((PyObject *)self);
+ if (it == NULL) {Py_DECREF(mit); return NULL;}
+ rval = iter_subscript(it, mit->indexobj);
+ Py_DECREF(it);
+ Py_DECREF(mit);
+ return rval;
+ }
+ PyArray_MapIterBind(mit, self);
+ other = (PyArrayObject *)PyArray_GetMap(mit);
+ Py_DECREF(mit);
+ return (PyObject *)other;
+ }
- return array_subscript_simple(self, op);
+ return array_subscript_simple(self, op);
}
@@ -2790,43 +2789,43 @@ static int iter_ass_subscript(PyArrayIterObject *, PyObject *, PyObject *);
static int
array_ass_sub_simple(PyArrayObject *self, PyObject *index, PyObject *op)
{
- int ret;
- PyArrayObject *tmp;
- intp value;
+ int ret;
+ PyArrayObject *tmp;
+ intp value;
- value = PyArray_PyIntAsIntp(index);
- if (!error_converting(value)) {
- return array_ass_big_item(self, value, op);
- }
- PyErr_Clear();
+ value = PyArray_PyIntAsIntp(index);
+ if (!error_converting(value)) {
+ return array_ass_big_item(self, value, op);
+ }
+ PyErr_Clear();
- /* Rest of standard (view-based) indexing */
+ /* Rest of standard (view-based) indexing */
- if (PyArray_CheckExact(self)) {
- tmp = (PyArrayObject *)array_subscript_simple(self, index);
- if (tmp == NULL) return -1;
- }
- else {
- PyObject *tmp0;
- tmp0 = PyObject_GetItem((PyObject *)self, index);
- if (tmp0 == NULL) return -1;
- if (!PyArray_Check(tmp0)) {
- PyErr_SetString(PyExc_RuntimeError,
- "Getitem not returning array.");
- Py_DECREF(tmp0);
- return -1;
- }
- tmp = (PyArrayObject *)tmp0;
- }
+ if (PyArray_CheckExact(self)) {
+ tmp = (PyArrayObject *)array_subscript_simple(self, index);
+ if (tmp == NULL) return -1;
+ }
+ else {
+ PyObject *tmp0;
+ tmp0 = PyObject_GetItem((PyObject *)self, index);
+ if (tmp0 == NULL) return -1;
+ if (!PyArray_Check(tmp0)) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "Getitem not returning array.");
+ Py_DECREF(tmp0);
+ return -1;
+ }
+ tmp = (PyArrayObject *)tmp0;
+ }
- if (PyArray_ISOBJECT(self) && (tmp->nd == 0)) {
- ret = tmp->descr->f->setitem(op, tmp->data, tmp);
- }
- else {
- ret = PyArray_CopyObject(tmp, op);
- }
- Py_DECREF(tmp);
- return ret;
+ if (PyArray_ISOBJECT(self) && (tmp->nd == 0)) {
+ ret = tmp->descr->f->setitem(op, tmp->data, tmp);
+ }
+ else {
+ ret = PyArray_CopyObject(tmp, op);
+ }
+ Py_DECREF(tmp);
+ return ret;
}
@@ -2836,150 +2835,150 @@ array_ass_sub_simple(PyArrayObject *self, PyObject *index, PyObject *op)
static int
_tuple_of_integers(PyObject *seq, intp *vals, int maxvals)
{
- int i;
- PyObject *obj;
- intp temp;
-
- for (i=0; i<maxvals; i++) {
- obj = PyTuple_GET_ITEM(seq, i);
- if ((PyArray_Check(obj) && PyArray_NDIM(obj) > 0) ||
- PyList_Check(obj)) return -1;
- temp = PyArray_PyIntAsIntp(obj);
- if (error_converting(temp)) return -1;
- vals[i] = temp;
- }
- return 0;
+ int i;
+ PyObject *obj;
+ intp temp;
+
+ for (i=0; i<maxvals; i++) {
+ obj = PyTuple_GET_ITEM(seq, i);
+ if ((PyArray_Check(obj) && PyArray_NDIM(obj) > 0) ||
+ PyList_Check(obj)) return -1;
+ temp = PyArray_PyIntAsIntp(obj);
+ if (error_converting(temp)) return -1;
+ vals[i] = temp;
+ }
+ return 0;
}
static int
array_ass_sub(PyArrayObject *self, PyObject *index, PyObject *op)
{
- int ret, oned, fancy;
- PyArrayMapIterObject *mit;
- intp vals[MAX_DIMS];
-
- if (op == NULL) {
- PyErr_SetString(PyExc_ValueError,
- "cannot delete array elements");
- return -1;
- }
- if (!PyArray_ISWRITEABLE(self)) {
- PyErr_SetString(PyExc_RuntimeError,
- "array is not writeable");
- return -1;
- }
+ int ret, oned, fancy;
+ PyArrayMapIterObject *mit;
+ intp vals[MAX_DIMS];
- if (PyInt_Check(index) || PyArray_IsScalar(index, Integer) ||
- PyLong_Check(index) || (PyIndex_Check(index) &&
- !PySequence_Check(index))) {
- intp value;
- value = PyArray_PyIntAsIntp(index);
- if (PyErr_Occurred())
- PyErr_Clear();
- else
- return array_ass_big_item(self, value, op);
- }
-
- if (PyString_Check(index) || PyUnicode_Check(index)) {
- if (self->descr->names) {
- PyObject *obj;
- obj = PyDict_GetItem(self->descr->fields, index);
- if (obj != NULL) {
- PyArray_Descr *descr;
- int offset;
- PyObject *title;
-
- if (PyArg_ParseTuple(obj, "Oi|O",
- &descr, &offset, &title)) {
- Py_INCREF(descr);
- return PyArray_SetField(self, descr,
- offset, op);
- }
- }
- }
+ if (op == NULL) {
+ PyErr_SetString(PyExc_ValueError,
+ "cannot delete array elements");
+ return -1;
+ }
+ if (!PyArray_ISWRITEABLE(self)) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "array is not writeable");
+ return -1;
+ }
- PyErr_Format(PyExc_ValueError,
- "field named %s not found.",
- PyString_AsString(index));
- return -1;
- }
+ if (PyInt_Check(index) || PyArray_IsScalar(index, Integer) ||
+ PyLong_Check(index) || (PyIndex_Check(index) &&
+ !PySequence_Check(index))) {
+ intp value;
+ value = PyArray_PyIntAsIntp(index);
+ if (PyErr_Occurred())
+ PyErr_Clear();
+ else
+ return array_ass_big_item(self, value, op);
+ }
- if (self->nd == 0) {
- /* Several different exceptions to the 0-d no-indexing rule
+ if (PyString_Check(index) || PyUnicode_Check(index)) {
+ if (self->descr->names) {
+ PyObject *obj;
+ obj = PyDict_GetItem(self->descr->fields, index);
+ if (obj != NULL) {
+ PyArray_Descr *descr;
+ int offset;
+ PyObject *title;
- 1) ellipses
- 2) empty tuple
- 3) Using newaxis (None)
- 4) Boolean mask indexing
- */
- if (index == Py_Ellipsis || index == Py_None || \
- (PyTuple_Check(index) && (0 == PyTuple_GET_SIZE(index) || \
- count_new_axes_0d(index) > 0)))
- return self->descr->f->setitem(op, self->data, self);
- if (PyBool_Check(index) || PyArray_IsScalar(index, Bool) ||
- (PyArray_Check(index) && (PyArray_DIMS(index)==0) &&
- PyArray_ISBOOL(index))) {
- if (PyObject_IsTrue(index)) {
- return self->descr->f->setitem(op, self->data, self);
- }
- else { /* don't do anything */
- return 0;
- }
+ if (PyArg_ParseTuple(obj, "Oi|O",
+ &descr, &offset, &title)) {
+ Py_INCREF(descr);
+ return PyArray_SetField(self, descr,
+ offset, op);
}
- PyErr_SetString(PyExc_IndexError,
- "0-d arrays can't be indexed.");
- return -1;
+ }
}
-
- /* optimization for integer-tuple */
- if (self->nd > 1 &&
- (PyTuple_Check(index) && (PyTuple_GET_SIZE(index) == self->nd))
- && (_tuple_of_integers(index, vals, self->nd) >= 0)) {
- int i;
- char *item;
- for (i=0; i<self->nd; i++) {
- if (vals[i] < 0) vals[i] += self->dimensions[i];
- if ((vals[i] < 0) || (vals[i] >= self->dimensions[i])) {
- PyErr_Format(PyExc_IndexError,
- "index (%"INTP_FMT") out of range "\
- "(0<=index<%"INTP_FMT") in dimension %d",
- vals[i], self->dimensions[i], i);
- return -1;
- }
- }
- item = PyArray_GetPtr(self, vals);
- /* fprintf(stderr, "Here I am...\n");*/
- return self->descr->f->setitem(op, item, self);
+
+ PyErr_Format(PyExc_ValueError,
+ "field named %s not found.",
+ PyString_AsString(index));
+ return -1;
+ }
+
+ if (self->nd == 0) {
+ /* Several different exceptions to the 0-d no-indexing rule
+
+ 1) ellipses
+ 2) empty tuple
+ 3) Using newaxis (None)
+ 4) Boolean mask indexing
+ */
+ if (index == Py_Ellipsis || index == Py_None || \
+ (PyTuple_Check(index) && (0 == PyTuple_GET_SIZE(index) || \
+ count_new_axes_0d(index) > 0)))
+ return self->descr->f->setitem(op, self->data, self);
+ if (PyBool_Check(index) || PyArray_IsScalar(index, Bool) ||
+ (PyArray_Check(index) && (PyArray_DIMS(index)==0) &&
+ PyArray_ISBOOL(index))) {
+ if (PyObject_IsTrue(index)) {
+ return self->descr->f->setitem(op, self->data, self);
+ }
+ else { /* don't do anything */
+ return 0;
+ }
}
- PyErr_Clear();
+ PyErr_SetString(PyExc_IndexError,
+ "0-d arrays can't be indexed.");
+ return -1;
+ }
- fancy = fancy_indexing_check(index);
-
- if (fancy != SOBJ_NOTFANCY) {
- oned = ((self->nd == 1) &&
- !(PyTuple_Check(index) && PyTuple_GET_SIZE(index) > 1));
-
- mit = (PyArrayMapIterObject *) \
- PyArray_MapIterNew(index, oned, fancy);
- if (mit == NULL) return -1;
- if (oned) {
- PyArrayIterObject *it;
- int rval;
- it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);
- if (it == NULL) {Py_DECREF(mit); return -1;}
- rval = iter_ass_subscript(it, mit->indexobj, op);
- Py_DECREF(it);
- Py_DECREF(mit);
- return rval;
- }
- PyArray_MapIterBind(mit, self);
- ret = PyArray_SetMap(mit, op);
- Py_DECREF(mit);
- return ret;
+ /* optimization for integer-tuple */
+ if (self->nd > 1 &&
+ (PyTuple_Check(index) && (PyTuple_GET_SIZE(index) == self->nd))
+ && (_tuple_of_integers(index, vals, self->nd) >= 0)) {
+ int i;
+ char *item;
+ for (i=0; i<self->nd; i++) {
+ if (vals[i] < 0) vals[i] += self->dimensions[i];
+ if ((vals[i] < 0) || (vals[i] >= self->dimensions[i])) {
+ PyErr_Format(PyExc_IndexError,
+ "index (%"INTP_FMT") out of range "\
+ "(0<=index<%"INTP_FMT") in dimension %d",
+ vals[i], self->dimensions[i], i);
+ return -1;
+ }
}
+ item = PyArray_GetPtr(self, vals);
+ /* fprintf(stderr, "Here I am...\n");*/
+ return self->descr->f->setitem(op, item, self);
+ }
+ PyErr_Clear();
+
+ fancy = fancy_indexing_check(index);
+
+ if (fancy != SOBJ_NOTFANCY) {
+ oned = ((self->nd == 1) &&
+ !(PyTuple_Check(index) && PyTuple_GET_SIZE(index) > 1));
+
+ mit = (PyArrayMapIterObject *) \
+ PyArray_MapIterNew(index, oned, fancy);
+ if (mit == NULL) return -1;
+ if (oned) {
+ PyArrayIterObject *it;
+ int rval;
+ it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);
+ if (it == NULL) {Py_DECREF(mit); return -1;}
+ rval = iter_ass_subscript(it, mit->indexobj, op);
+ Py_DECREF(it);
+ Py_DECREF(mit);
+ return rval;
+ }
+ PyArray_MapIterBind(mit, self);
+ ret = PyArray_SetMap(mit, op);
+ Py_DECREF(mit);
+ return ret;
+ }
- return array_ass_sub_simple(self, index, op);
+ return array_ass_sub_simple(self, index, op);
}
@@ -2993,94 +2992,94 @@ static PyObject *
array_subscript_nice(PyArrayObject *self, PyObject *op)
{
- PyArrayObject *mp;
- intp vals[MAX_DIMS];
+ PyArrayObject *mp;
+ intp vals[MAX_DIMS];
- if (PyInt_Check(op) || PyArray_IsScalar(op, Integer) || \
- PyLong_Check(op) || (PyIndex_Check(op) &&
- !PySequence_Check(op))) {
- intp value;
- value = PyArray_PyIntAsIntp(op);
- if (PyErr_Occurred())
- PyErr_Clear();
- else {
- return array_item_nice(self, (Py_ssize_t) value);
- }
+ if (PyInt_Check(op) || PyArray_IsScalar(op, Integer) || \
+ PyLong_Check(op) || (PyIndex_Check(op) &&
+ !PySequence_Check(op))) {
+ intp value;
+ value = PyArray_PyIntAsIntp(op);
+ if (PyErr_Occurred())
+ PyErr_Clear();
+ else {
+ return array_item_nice(self, (Py_ssize_t) value);
}
- /* optimization for a tuple of integers */
- if (self->nd > 1 && PyTuple_Check(op) &&
- (PyTuple_GET_SIZE(op) == self->nd)
- && (_tuple_of_integers(op, vals, self->nd) >= 0)) {
- int i;
- char *item;
- for (i=0; i<self->nd; i++) {
- if (vals[i] < 0) vals[i] += self->dimensions[i];
- if ((vals[i] < 0) || (vals[i] >= self->dimensions[i])) {
- PyErr_Format(PyExc_IndexError,
- "index (%"INTP_FMT") out of range "\
- "(0<=index<=%"INTP_FMT") in dimension %d",
- vals[i], self->dimensions[i], i);
- return NULL;
- }
- }
- item = PyArray_GetPtr(self, vals);
- return PyArray_Scalar(item, self->descr, (PyObject *)self);
+ }
+ /* optimization for a tuple of integers */
+ if (self->nd > 1 && PyTuple_Check(op) &&
+ (PyTuple_GET_SIZE(op) == self->nd)
+ && (_tuple_of_integers(op, vals, self->nd) >= 0)) {
+ int i;
+ char *item;
+ for (i=0; i<self->nd; i++) {
+ if (vals[i] < 0) vals[i] += self->dimensions[i];
+ if ((vals[i] < 0) || (vals[i] >= self->dimensions[i])) {
+ PyErr_Format(PyExc_IndexError,
+ "index (%"INTP_FMT") out of range "\
+ "(0<=index<=%"INTP_FMT") in dimension %d",
+ vals[i], self->dimensions[i], i);
+ return NULL;
+ }
}
- PyErr_Clear();
+ item = PyArray_GetPtr(self, vals);
+ return PyArray_Scalar(item, self->descr, (PyObject *)self);
+ }
+ PyErr_Clear();
- mp = (PyArrayObject *)array_subscript(self, op);
+ mp = (PyArrayObject *)array_subscript(self, op);
- /* The following is just a copy of PyArray_Return with an
- additional logic in the nd == 0 case.
- */
+ /* The following is just a copy of PyArray_Return with an
+ additional logic in the nd == 0 case.
+ */
- if (mp == NULL) return NULL;
+ if (mp == NULL) return NULL;
- if (PyErr_Occurred()) {
- Py_XDECREF(mp);
- return NULL;
- }
+ if (PyErr_Occurred()) {
+ Py_XDECREF(mp);
+ return NULL;
+ }
- if (mp->nd == 0) {
- Bool noellipses = TRUE;
- if ((op == Py_Ellipsis) || PyString_Check(op) || PyUnicode_Check(op))
- noellipses = FALSE;
- else if (PyBool_Check(op) || PyArray_IsScalar(op, Bool) ||
- (PyArray_Check(op) && (PyArray_DIMS(op)==0) &&
- PyArray_ISBOOL(op)))
- noellipses = FALSE;
- else if (PySequence_Check(op)) {
- int n, i;
- PyObject *temp;
- n = PySequence_Size(op);
- i=0;
- while (i<n && noellipses) {
- temp = PySequence_GetItem(op, i);
- if (temp == Py_Ellipsis)
- noellipses = FALSE;
- Py_DECREF(temp);
- i++;
- }
- }
- if (noellipses) {
- PyObject *ret;
- ret = PyArray_ToScalar(mp->data, mp);
- Py_DECREF(mp);
- return ret;
- }
+ if (mp->nd == 0) {
+ Bool noellipses = TRUE;
+ if ((op == Py_Ellipsis) || PyString_Check(op) || PyUnicode_Check(op))
+ noellipses = FALSE;
+ else if (PyBool_Check(op) || PyArray_IsScalar(op, Bool) ||
+ (PyArray_Check(op) && (PyArray_DIMS(op)==0) &&
+ PyArray_ISBOOL(op)))
+ noellipses = FALSE;
+ else if (PySequence_Check(op)) {
+ int n, i;
+ PyObject *temp;
+ n = PySequence_Size(op);
+ i=0;
+ while (i<n && noellipses) {
+ temp = PySequence_GetItem(op, i);
+ if (temp == Py_Ellipsis)
+ noellipses = FALSE;
+ Py_DECREF(temp);
+ i++;
+ }
}
- return (PyObject *)mp;
+ if (noellipses) {
+ PyObject *ret;
+ ret = PyArray_ToScalar(mp->data, mp);
+ Py_DECREF(mp);
+ return ret;
+ }
+ }
+ return (PyObject *)mp;
}
static PyMappingMethods array_as_mapping = {
#if PY_VERSION_HEX >= 0x02050000
- (lenfunc)array_length, /*mp_length*/
+ (lenfunc)array_length, /*mp_length*/
#else
- (inquiry)array_length, /*mp_length*/
+ (inquiry)array_length, /*mp_length*/
#endif
- (binaryfunc)array_subscript_nice, /*mp_subscript*/
- (objobjargproc)array_ass_sub, /*mp_ass_subscript*/
+ (binaryfunc)array_subscript_nice, /*mp_subscript*/
+ (objobjargproc)array_ass_sub, /*mp_ass_subscript*/
};
/****************** End of Mapping Protocol ******************************/
@@ -3095,75 +3094,75 @@ static PyMappingMethods array_as_mapping = {
static Py_ssize_t
array_getsegcount(PyArrayObject *self, Py_ssize_t *lenp)
{
- if (lenp)
- *lenp = PyArray_NBYTES(self);
+ if (lenp)
+ *lenp = PyArray_NBYTES(self);
- if (PyArray_ISONESEGMENT(self)) {
- return 1;
- }
+ if (PyArray_ISONESEGMENT(self)) {
+ return 1;
+ }
- if (lenp)
- *lenp = 0;
- return 0;
+ if (lenp)
+ *lenp = 0;
+ return 0;
}
static Py_ssize_t
array_getreadbuf(PyArrayObject *self, Py_ssize_t segment, void **ptrptr)
{
- if (segment != 0) {
- PyErr_SetString(PyExc_ValueError,
- "accessing non-existing array segment");
- return -1;
- }
-
- if (PyArray_ISONESEGMENT(self)) {
- *ptrptr = self->data;
- return PyArray_NBYTES(self);
- }
- PyErr_SetString(PyExc_ValueError, "array is not a single segment");
- *ptrptr = NULL;
+ if (segment != 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "accessing non-existing array segment");
return -1;
+ }
+
+ if (PyArray_ISONESEGMENT(self)) {
+ *ptrptr = self->data;
+ return PyArray_NBYTES(self);
+ }
+ PyErr_SetString(PyExc_ValueError, "array is not a single segment");
+ *ptrptr = NULL;
+ return -1;
}
static Py_ssize_t
array_getwritebuf(PyArrayObject *self, Py_ssize_t segment, void **ptrptr)
{
- if (PyArray_CHKFLAGS(self, WRITEABLE))
- return array_getreadbuf(self, segment, (void **) ptrptr);
- else {
- PyErr_SetString(PyExc_ValueError, "array cannot be "\
- "accessed as a writeable buffer");
- return -1;
- }
+ if (PyArray_CHKFLAGS(self, WRITEABLE))
+ return array_getreadbuf(self, segment, (void **) ptrptr);
+ else {
+ PyErr_SetString(PyExc_ValueError, "array cannot be "\
+ "accessed as a writeable buffer");
+ return -1;
+ }
}
static Py_ssize_t
array_getcharbuf(PyArrayObject *self, Py_ssize_t segment, constchar **ptrptr)
{
- if (self->descr->type_num == PyArray_STRING || \
- self->descr->type_num == PyArray_UNICODE || \
- self->descr->elsize == 1)
- return array_getreadbuf(self, segment, (void **) ptrptr);
- else {
- PyErr_SetString(PyExc_TypeError,
- "non-character (or 8-bit) array cannot be "\
- "interpreted as character buffer");
- return -1;
- }
+ if (self->descr->type_num == PyArray_STRING || \
+ self->descr->type_num == PyArray_UNICODE || \
+ self->descr->elsize == 1)
+ return array_getreadbuf(self, segment, (void **) ptrptr);
+ else {
+ PyErr_SetString(PyExc_TypeError,
+ "non-character (or 8-bit) array cannot be "\
+ "interpreted as character buffer");
+ return -1;
+ }
}
static PyBufferProcs array_as_buffer = {
#if PY_VERSION_HEX >= 0x02050000
- (readbufferproc)array_getreadbuf, /*bf_getreadbuffer*/
- (writebufferproc)array_getwritebuf, /*bf_getwritebuffer*/
- (segcountproc)array_getsegcount, /*bf_getsegcount*/
- (charbufferproc)array_getcharbuf, /*bf_getcharbuffer*/
+ (readbufferproc)array_getreadbuf, /*bf_getreadbuffer*/
+ (writebufferproc)array_getwritebuf, /*bf_getwritebuffer*/
+ (segcountproc)array_getsegcount, /*bf_getsegcount*/
+ (charbufferproc)array_getcharbuf, /*bf_getcharbuffer*/
#else
- (getreadbufferproc)array_getreadbuf, /*bf_getreadbuffer*/
- (getwritebufferproc)array_getwritebuf, /*bf_getwritebuffer*/
- (getsegcountproc)array_getsegcount, /*bf_getsegcount*/
- (getcharbufferproc)array_getcharbuf, /*bf_getcharbuffer*/
+ (getreadbufferproc)array_getreadbuf, /*bf_getreadbuffer*/
+ (getwritebufferproc)array_getwritebuf, /*bf_getwritebuffer*/
+ (getsegcountproc)array_getsegcount, /*bf_getsegcount*/
+ (getcharbufferproc)array_getcharbuf, /*bf_getcharbuffer*/
#endif
};
@@ -3176,197 +3175,197 @@ static PyBufferProcs array_as_buffer = {
typedef struct {
- PyObject *add,
- *subtract,
- *multiply,
- *divide,
- *remainder,
- *power,
- *square,
- *reciprocal,
- *ones_like,
- *sqrt,
- *negative,
- *absolute,
- *invert,
- *left_shift,
- *right_shift,
- *bitwise_and,
- *bitwise_xor,
- *bitwise_or,
- *less,
- *less_equal,
- *equal,
- *not_equal,
- *greater,
- *greater_equal,
- *floor_divide,
- *true_divide,
- *logical_or,
- *logical_and,
- *floor,
- *ceil,
- *maximum,
- *minimum,
- *rint,
- *conjugate;
+ PyObject *add,
+ *subtract,
+ *multiply,
+ *divide,
+ *remainder,
+ *power,
+ *square,
+ *reciprocal,
+ *ones_like,
+ *sqrt,
+ *negative,
+ *absolute,
+ *invert,
+ *left_shift,
+ *right_shift,
+ *bitwise_and,
+ *bitwise_xor,
+ *bitwise_or,
+ *less,
+ *less_equal,
+ *equal,
+ *not_equal,
+ *greater,
+ *greater_equal,
+ *floor_divide,
+ *true_divide,
+ *logical_or,
+ *logical_and,
+ *floor,
+ *ceil,
+ *maximum,
+ *minimum,
+ *rint,
+ *conjugate;
} NumericOps;
static NumericOps n_ops; /* NB: static objects inlitialized to zero */
/* Dictionary can contain any of the numeric operations, by name.
- Those not present will not be changed
- */
+ Those not present will not be changed
+*/
#define SET(op) temp=PyDict_GetItemString(dict, #op); \
- if (temp != NULL) { \
- if (!(PyCallable_Check(temp))) return -1; \
- Py_XDECREF(n_ops.op); \
- n_ops.op = temp; \
- }
+ if (temp != NULL) { \
+ if (!(PyCallable_Check(temp))) return -1; \
+ Py_XDECREF(n_ops.op); \
+ n_ops.op = temp; \
+ }
/*OBJECT_API
- Set internal structure with number functions that all arrays will use
+ Set internal structure with number functions that all arrays will use
*/
int
PyArray_SetNumericOps(PyObject *dict)
{
- PyObject *temp = NULL;
- SET(add);
- SET(subtract);
- SET(multiply);
- SET(divide);
- SET(remainder);
- SET(power);
- SET(square);
- SET(reciprocal);
- SET(ones_like);
- SET(sqrt);
- SET(negative);
- SET(absolute);
- SET(invert);
- SET(left_shift);
- SET(right_shift);
- SET(bitwise_and);
- SET(bitwise_or);
- SET(bitwise_xor);
- SET(less);
- SET(less_equal);
- SET(equal);
- SET(not_equal);
- SET(greater);
- SET(greater_equal);
- SET(floor_divide);
- SET(true_divide);
- SET(logical_or);
- SET(logical_and);
- SET(floor);
- SET(ceil);
- SET(maximum);
- SET(minimum);
- SET(rint);
- SET(conjugate);
- return 0;
+ PyObject *temp = NULL;
+ SET(add);
+ SET(subtract);
+ SET(multiply);
+ SET(divide);
+ SET(remainder);
+ SET(power);
+ SET(square);
+ SET(reciprocal);
+ SET(ones_like);
+ SET(sqrt);
+ SET(negative);
+ SET(absolute);
+ SET(invert);
+ SET(left_shift);
+ SET(right_shift);
+ SET(bitwise_and);
+ SET(bitwise_or);
+ SET(bitwise_xor);
+ SET(less);
+ SET(less_equal);
+ SET(equal);
+ SET(not_equal);
+ SET(greater);
+ SET(greater_equal);
+ SET(floor_divide);
+ SET(true_divide);
+ SET(logical_or);
+ SET(logical_and);
+ SET(floor);
+ SET(ceil);
+ SET(maximum);
+ SET(minimum);
+ SET(rint);
+ SET(conjugate);
+ return 0;
}
#define GET(op) if (n_ops.op && \
(PyDict_SetItemString(dict, #op, n_ops.op)==-1)) \
- goto fail;
+ goto fail;
/*OBJECT_API
- Get dictionary showing number functions that all arrays will use
+ Get dictionary showing number functions that all arrays will use
*/
static PyObject *
PyArray_GetNumericOps(void)
{
- PyObject *dict;
- if ((dict = PyDict_New())==NULL)
- return NULL;
- GET(add);
- GET(subtract);
- GET(multiply);
- GET(divide);
- GET(remainder);
- GET(power);
- GET(square);
- GET(reciprocal);
- GET(ones_like);
- GET(sqrt);
- GET(negative);
- GET(absolute);
- GET(invert);
- GET(left_shift);
- GET(right_shift);
- GET(bitwise_and);
- GET(bitwise_or);
- GET(bitwise_xor);
- GET(less);
- GET(less_equal);
- GET(equal);
- GET(not_equal);
- GET(greater);
- GET(greater_equal);
- GET(floor_divide);
- GET(true_divide);
- GET(logical_or);
- GET(logical_and);
- GET(floor);
- GET(ceil);
- GET(maximum);
- GET(minimum);
- GET(rint);
- GET(conjugate);
- return dict;
+ PyObject *dict;
+ if ((dict = PyDict_New())==NULL)
+ return NULL;
+ GET(add);
+ GET(subtract);
+ GET(multiply);
+ GET(divide);
+ GET(remainder);
+ GET(power);
+ GET(square);
+ GET(reciprocal);
+ GET(ones_like);
+ GET(sqrt);
+ GET(negative);
+ GET(absolute);
+ GET(invert);
+ GET(left_shift);
+ GET(right_shift);
+ GET(bitwise_and);
+ GET(bitwise_or);
+ GET(bitwise_xor);
+ GET(less);
+ GET(less_equal);
+ GET(equal);
+ GET(not_equal);
+ GET(greater);
+ GET(greater_equal);
+ GET(floor_divide);
+ GET(true_divide);
+ GET(logical_or);
+ GET(logical_and);
+ GET(floor);
+ GET(ceil);
+ GET(maximum);
+ GET(minimum);
+ GET(rint);
+ GET(conjugate);
+ return dict;
fail:
- Py_DECREF(dict);
- return NULL;
+ Py_DECREF(dict);
+ return NULL;
}
static PyObject *
_get_keywords(int rtype, PyArrayObject *out)
{
- PyObject *kwds=NULL;
- if (rtype != PyArray_NOTYPE || out != NULL) {
- kwds = PyDict_New();
- if (rtype != PyArray_NOTYPE) {
- PyArray_Descr *descr;
- descr = PyArray_DescrFromType(rtype);
- if (descr) {
- PyDict_SetItemString(kwds, "dtype",
- (PyObject *)descr);
- Py_DECREF(descr);
- }
- }
- if (out != NULL) {
- PyDict_SetItemString(kwds, "out",
- (PyObject *)out);
- }
+ PyObject *kwds=NULL;
+ if (rtype != PyArray_NOTYPE || out != NULL) {
+ kwds = PyDict_New();
+ if (rtype != PyArray_NOTYPE) {
+ PyArray_Descr *descr;
+ descr = PyArray_DescrFromType(rtype);
+ if (descr) {
+ PyDict_SetItemString(kwds, "dtype",
+ (PyObject *)descr);
+ Py_DECREF(descr);
+ }
+ }
+ if (out != NULL) {
+ PyDict_SetItemString(kwds, "out",
+ (PyObject *)out);
}
- return kwds;
+ }
+ return kwds;
}
static PyObject *
PyArray_GenericReduceFunction(PyArrayObject *m1, PyObject *op, int axis,
int rtype, PyArrayObject *out)
{
- PyObject *args, *ret=NULL, *meth;
- PyObject *kwds;
- if (op == NULL) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
- args = Py_BuildValue("(Oi)", m1, axis);
- kwds = _get_keywords(rtype, out);
- meth = PyObject_GetAttrString(op, "reduce");
- if (meth && PyCallable_Check(meth)) {
- ret = PyObject_Call(meth, args, kwds);
- }
- Py_DECREF(args);
- Py_DECREF(meth);
- Py_XDECREF(kwds);
- return ret;
+ PyObject *args, *ret=NULL, *meth;
+ PyObject *kwds;
+ if (op == NULL) {
+ Py_INCREF(Py_NotImplemented);
+ return Py_NotImplemented;
+ }
+ args = Py_BuildValue("(Oi)", m1, axis);
+ kwds = _get_keywords(rtype, out);
+ meth = PyObject_GetAttrString(op, "reduce");
+ if (meth && PyCallable_Check(meth)) {
+ ret = PyObject_Call(meth, args, kwds);
+ }
+ Py_DECREF(args);
+ Py_DECREF(meth);
+ Py_XDECREF(kwds);
+ return ret;
}
@@ -3374,94 +3373,94 @@ static PyObject *
PyArray_GenericAccumulateFunction(PyArrayObject *m1, PyObject *op, int axis,
int rtype, PyArrayObject *out)
{
- PyObject *args, *ret=NULL, *meth;
- PyObject *kwds;
- if (op == NULL) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
- args = Py_BuildValue("(Oi)", m1, axis);
- kwds = _get_keywords(rtype, out);
- meth = PyObject_GetAttrString(op, "accumulate");
- if (meth && PyCallable_Check(meth)) {
- ret = PyObject_Call(meth, args, kwds);
- }
- Py_DECREF(args);
- Py_DECREF(meth);
- Py_XDECREF(kwds);
- return ret;
+ PyObject *args, *ret=NULL, *meth;
+ PyObject *kwds;
+ if (op == NULL) {
+ Py_INCREF(Py_NotImplemented);
+ return Py_NotImplemented;
+ }
+ args = Py_BuildValue("(Oi)", m1, axis);
+ kwds = _get_keywords(rtype, out);
+ meth = PyObject_GetAttrString(op, "accumulate");
+ if (meth && PyCallable_Check(meth)) {
+ ret = PyObject_Call(meth, args, kwds);
+ }
+ Py_DECREF(args);
+ Py_DECREF(meth);
+ Py_XDECREF(kwds);
+ return ret;
}
static PyObject *
PyArray_GenericBinaryFunction(PyArrayObject *m1, PyObject *m2, PyObject *op)
{
- if (op == NULL) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
- return PyObject_CallFunction(op, "OO", m1, m2);
+ if (op == NULL) {
+ Py_INCREF(Py_NotImplemented);
+ return Py_NotImplemented;
+ }
+ return PyObject_CallFunction(op, "OO", m1, m2);
}
static PyObject *
PyArray_GenericUnaryFunction(PyArrayObject *m1, PyObject *op)
{
- if (op == NULL) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
- return PyObject_CallFunction(op, "(O)", m1);
+ if (op == NULL) {
+ Py_INCREF(Py_NotImplemented);
+ return Py_NotImplemented;
+ }
+ return PyObject_CallFunction(op, "(O)", m1);
}
static PyObject *
PyArray_GenericInplaceBinaryFunction(PyArrayObject *m1,
PyObject *m2, PyObject *op)
{
- if (op == NULL) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
- return PyObject_CallFunction(op, "OOO", m1, m2, m1);
+ if (op == NULL) {
+ Py_INCREF(Py_NotImplemented);
+ return Py_NotImplemented;
+ }
+ return PyObject_CallFunction(op, "OOO", m1, m2, m1);
}
static PyObject *
PyArray_GenericInplaceUnaryFunction(PyArrayObject *m1, PyObject *op)
{
- if (op == NULL) {
- Py_INCREF(Py_NotImplemented);
- return Py_NotImplemented;
- }
- return PyObject_CallFunction(op, "OO", m1, m1);
+ if (op == NULL) {
+ Py_INCREF(Py_NotImplemented);
+ return Py_NotImplemented;
+ }
+ return PyObject_CallFunction(op, "OO", m1, m1);
}
static PyObject *
array_add(PyArrayObject *m1, PyObject *m2)
{
- return PyArray_GenericBinaryFunction(m1, m2, n_ops.add);
+ return PyArray_GenericBinaryFunction(m1, m2, n_ops.add);
}
static PyObject *
array_subtract(PyArrayObject *m1, PyObject *m2)
{
- return PyArray_GenericBinaryFunction(m1, m2, n_ops.subtract);
+ return PyArray_GenericBinaryFunction(m1, m2, n_ops.subtract);
}
static PyObject *
array_multiply(PyArrayObject *m1, PyObject *m2)
{
- return PyArray_GenericBinaryFunction(m1, m2, n_ops.multiply);
+ return PyArray_GenericBinaryFunction(m1, m2, n_ops.multiply);
}
static PyObject *
array_divide(PyArrayObject *m1, PyObject *m2)
{
- return PyArray_GenericBinaryFunction(m1, m2, n_ops.divide);
+ return PyArray_GenericBinaryFunction(m1, m2, n_ops.divide);
}
static PyObject *
array_remainder(PyArrayObject *m1, PyObject *m2)
{
- return PyArray_GenericBinaryFunction(m1, m2, n_ops.remainder);
+ return PyArray_GenericBinaryFunction(m1, m2, n_ops.remainder);
}
static int
@@ -3471,41 +3470,41 @@ array_power_is_scalar(PyObject *o2, double* exp)
const int optimize_fpexps = 1;
if (PyInt_Check(o2)) {
- *exp = (double)PyInt_AsLong(o2);
- return 1;
+ *exp = (double)PyInt_AsLong(o2);
+ return 1;
}
if (optimize_fpexps && PyFloat_Check(o2)) {
- *exp = PyFloat_AsDouble(o2);
- return 1;
+ *exp = PyFloat_AsDouble(o2);
+ return 1;
}
if ((PyArray_IsZeroDim(o2) &&
((PyArray_ISINTEGER(o2) ||
(optimize_fpexps && PyArray_ISFLOAT(o2))))) ||
PyArray_IsScalar(o2, Integer) ||
(optimize_fpexps && PyArray_IsScalar(o2, Floating))) {
- temp = o2->ob_type->tp_as_number->nb_float(o2);
- if (temp != NULL) {
- *exp = PyFloat_AsDouble(o2);
- Py_DECREF(temp);
- return 1;
- }
+ temp = o2->ob_type->tp_as_number->nb_float(o2);
+ if (temp != NULL) {
+ *exp = PyFloat_AsDouble(o2);
+ Py_DECREF(temp);
+ return 1;
+ }
}
#if (PY_VERSION_HEX >= 0x02050000)
if (PyIndex_Check(o2)) {
- PyObject* value = PyNumber_Index(o2);
- Py_ssize_t val;
- if (value==NULL) {
- if (PyErr_Occurred())
- PyErr_Clear();
- return 0;
- }
- val = PyInt_AsSsize_t(value);
- if (val == -1 && PyErr_Occurred()) {
- PyErr_Clear();
- return 0;
- }
- *exp = (double) val;
- return 1;
+ PyObject* value = PyNumber_Index(o2);
+ Py_ssize_t val;
+ if (value==NULL) {
+ if (PyErr_Occurred())
+ PyErr_Clear();
+ return 0;
+ }
+ val = PyInt_AsSsize_t(value);
+ if (val == -1 && PyErr_Occurred()) {
+ PyErr_Clear();
+ return 0;
+ }
+ *exp = (double) val;
+ return 1;
}
#endif
return 0;
@@ -3514,145 +3513,145 @@ array_power_is_scalar(PyObject *o2, double* exp)
/* optimize float array or complex array to a scalar power */
static PyObject *
fast_scalar_power(PyArrayObject *a1, PyObject *o2, int inplace) {
- double exp;
- if (PyArray_Check(a1) && array_power_is_scalar(o2, &exp)) {
- PyObject *fastop = NULL;
- if (PyArray_ISFLOAT(a1) || PyArray_ISCOMPLEX(a1)) {
- if (exp == 1.0) {
- /* we have to do this one special, as the
- "copy" method of array objects isn't set
- up early enough to be added
- by PyArray_SetNumericOps.
- */
- if (inplace) {
- Py_INCREF(a1);
- return (PyObject *)a1;
- } else {
- return PyArray_Copy(a1);
- }
- } else if (exp == -1.0) {
- fastop = n_ops.reciprocal;
- } else if (exp == 0.0) {
- fastop = n_ops.ones_like;
- } else if (exp == 0.5) {
- fastop = n_ops.sqrt;
- } else if (exp == 2.0) {
- fastop = n_ops.square;
- } else {
- return NULL;
- }
- if (inplace) {
- return PyArray_GenericInplaceUnaryFunction(a1,
- fastop);
- } else {
- return PyArray_GenericUnaryFunction(a1,
- fastop);
- }
- }
- else if (exp==2.0) {
- fastop = n_ops.multiply;
- if (inplace) {
- return PyArray_GenericInplaceBinaryFunction \
- (a1, (PyObject *)a1, fastop);
- }
- else {
- return PyArray_GenericBinaryFunction \
- (a1, (PyObject *)a1, fastop);
- }
- }
+ double exp;
+ if (PyArray_Check(a1) && array_power_is_scalar(o2, &exp)) {
+ PyObject *fastop = NULL;
+ if (PyArray_ISFLOAT(a1) || PyArray_ISCOMPLEX(a1)) {
+ if (exp == 1.0) {
+ /* we have to do this one special, as the
+ "copy" method of array objects isn't set
+ up early enough to be added
+ by PyArray_SetNumericOps.
+ */
+ if (inplace) {
+ Py_INCREF(a1);
+ return (PyObject *)a1;
+ } else {
+ return PyArray_Copy(a1);
+ }
+ } else if (exp == -1.0) {
+ fastop = n_ops.reciprocal;
+ } else if (exp == 0.0) {
+ fastop = n_ops.ones_like;
+ } else if (exp == 0.5) {
+ fastop = n_ops.sqrt;
+ } else if (exp == 2.0) {
+ fastop = n_ops.square;
+ } else {
+ return NULL;
+ }
+ if (inplace) {
+ return PyArray_GenericInplaceUnaryFunction(a1,
+ fastop);
+ } else {
+ return PyArray_GenericUnaryFunction(a1,
+ fastop);
+ }
}
- return NULL;
+ else if (exp==2.0) {
+ fastop = n_ops.multiply;
+ if (inplace) {
+ return PyArray_GenericInplaceBinaryFunction \
+ (a1, (PyObject *)a1, fastop);
+ }
+ else {
+ return PyArray_GenericBinaryFunction \
+ (a1, (PyObject *)a1, fastop);
+ }
+ }
+ }
+ return NULL;
}
static PyObject *
array_power(PyArrayObject *a1, PyObject *o2, PyObject *modulo)
{
- /* modulo is ignored! */
- PyObject *value;
- value = fast_scalar_power(a1, o2, 0);
- if (!value) {
- value = PyArray_GenericBinaryFunction(a1, o2, n_ops.power);
- }
- return value;
+ /* modulo is ignored! */
+ PyObject *value;
+ value = fast_scalar_power(a1, o2, 0);
+ if (!value) {
+ value = PyArray_GenericBinaryFunction(a1, o2, n_ops.power);
+ }
+ return value;
}
static PyObject *
array_negative(PyArrayObject *m1)
{
- return PyArray_GenericUnaryFunction(m1, n_ops.negative);
+ return PyArray_GenericUnaryFunction(m1, n_ops.negative);
}
static PyObject *
array_absolute(PyArrayObject *m1)
{
- return PyArray_GenericUnaryFunction(m1, n_ops.absolute);
+ return PyArray_GenericUnaryFunction(m1, n_ops.absolute);
}
static PyObject *
array_invert(PyArrayObject *m1)
{
- return PyArray_GenericUnaryFunction(m1, n_ops.invert);
+ return PyArray_GenericUnaryFunction(m1, n_ops.invert);
}
static PyObject *
array_left_shift(PyArrayObject *m1, PyObject *m2)
{
- return PyArray_GenericBinaryFunction(m1, m2, n_ops.left_shift);
+ return PyArray_GenericBinaryFunction(m1, m2, n_ops.left_shift);
}
static PyObject *
array_right_shift(PyArrayObject *m1, PyObject *m2)
{
- return PyArray_GenericBinaryFunction(m1, m2, n_ops.right_shift);
+ return PyArray_GenericBinaryFunction(m1, m2, n_ops.right_shift);
}
static PyObject *
array_bitwise_and(PyArrayObject *m1, PyObject *m2)
{
- return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_and);
+ return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_and);
}
static PyObject *
array_bitwise_or(PyArrayObject *m1, PyObject *m2)
{
- return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_or);
+ return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_or);
}
static PyObject *
array_bitwise_xor(PyArrayObject *m1, PyObject *m2)
{
- return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_xor);
+ return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_xor);
}
static PyObject *
array_inplace_add(PyArrayObject *m1, PyObject *m2)
{
- return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.add);
+ return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.add);
}
static PyObject *
array_inplace_subtract(PyArrayObject *m1, PyObject *m2)
{
- return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.subtract);
+ return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.subtract);
}
static PyObject *
array_inplace_multiply(PyArrayObject *m1, PyObject *m2)
{
- return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.multiply);
+ return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.multiply);
}
static PyObject *
array_inplace_divide(PyArrayObject *m1, PyObject *m2)
{
- return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.divide);
+ return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.divide);
}
static PyObject *
array_inplace_remainder(PyArrayObject *m1, PyObject *m2)
{
- return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.remainder);
+ return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.remainder);
}
static PyObject *
@@ -3670,99 +3669,99 @@ array_inplace_power(PyArrayObject *a1, PyObject *o2, PyObject *modulo)
static PyObject *
array_inplace_left_shift(PyArrayObject *m1, PyObject *m2)
{
- return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.left_shift);
+ return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.left_shift);
}
static PyObject *
array_inplace_right_shift(PyArrayObject *m1, PyObject *m2)
{
- return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.right_shift);
+ return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.right_shift);
}
static PyObject *
array_inplace_bitwise_and(PyArrayObject *m1, PyObject *m2)
{
- return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_and);
+ return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_and);
}
static PyObject *
array_inplace_bitwise_or(PyArrayObject *m1, PyObject *m2)
{
- return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_or);
+ return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_or);
}
static PyObject *
array_inplace_bitwise_xor(PyArrayObject *m1, PyObject *m2)
{
- return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_xor);
+ return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_xor);
}
static PyObject *
array_floor_divide(PyArrayObject *m1, PyObject *m2)
{
- return PyArray_GenericBinaryFunction(m1, m2, n_ops.floor_divide);
+ return PyArray_GenericBinaryFunction(m1, m2, n_ops.floor_divide);
}
static PyObject *
array_true_divide(PyArrayObject *m1, PyObject *m2)
{
- return PyArray_GenericBinaryFunction(m1, m2, n_ops.true_divide);
+ return PyArray_GenericBinaryFunction(m1, m2, n_ops.true_divide);
}
static PyObject *
array_inplace_floor_divide(PyArrayObject *m1, PyObject *m2)
{
- return PyArray_GenericInplaceBinaryFunction(m1, m2,
- n_ops.floor_divide);
+ return PyArray_GenericInplaceBinaryFunction(m1, m2,
+ n_ops.floor_divide);
}
static PyObject *
array_inplace_true_divide(PyArrayObject *m1, PyObject *m2)
{
- return PyArray_GenericInplaceBinaryFunction(m1, m2,
- n_ops.true_divide);
+ return PyArray_GenericInplaceBinaryFunction(m1, m2,
+ n_ops.true_divide);
}
/* Array evaluates as "TRUE" if any of the elements are non-zero*/
static int
array_any_nonzero(PyArrayObject *mp)
{
- intp index;
- PyArrayIterObject *it;
- Bool anyTRUE = FALSE;
+ intp index;
+ PyArrayIterObject *it;
+ Bool anyTRUE = FALSE;
- it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)mp);
- if (it==NULL) return anyTRUE;
- index = it->size;
- while(index--) {
- if (mp->descr->f->nonzero(it->dataptr, mp)) {
- anyTRUE = TRUE;
- break;
- }
- PyArray_ITER_NEXT(it);
+ it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)mp);
+ if (it==NULL) return anyTRUE;
+ index = it->size;
+ while(index--) {
+ if (mp->descr->f->nonzero(it->dataptr, mp)) {
+ anyTRUE = TRUE;
+ break;
}
- Py_DECREF(it);
- return anyTRUE;
+ PyArray_ITER_NEXT(it);
+ }
+ Py_DECREF(it);
+ return anyTRUE;
}
static int
_array_nonzero(PyArrayObject *mp)
{
- intp n;
- n = PyArray_SIZE(mp);
- if (n == 1) {
- return mp->descr->f->nonzero(mp->data, mp);
- }
- else if (n == 0) {
- return 0;
- }
- else {
- PyErr_SetString(PyExc_ValueError,
- "The truth value of an array " \
- "with more than one element is ambiguous. " \
- "Use a.any() or a.all()");
- return -1;
- }
+ intp n;
+ n = PyArray_SIZE(mp);
+ if (n == 1) {
+ return mp->descr->f->nonzero(mp->data, mp);
+ }
+ else if (n == 0) {
+ return 0;
+ }
+ else {
+ PyErr_SetString(PyExc_ValueError,
+ "The truth value of an array " \
+ "with more than one element is ambiguous. " \
+ "Use a.any() or a.all()");
+ return -1;
+ }
}
@@ -3770,221 +3769,221 @@ _array_nonzero(PyArrayObject *mp)
static PyObject *
array_divmod(PyArrayObject *op1, PyObject *op2)
{
- PyObject *divp, *modp, *result;
+ PyObject *divp, *modp, *result;
- divp = array_floor_divide(op1, op2);
- if (divp == NULL) return NULL;
- modp = array_remainder(op1, op2);
- if (modp == NULL) {
- Py_DECREF(divp);
- return NULL;
- }
- result = Py_BuildValue("OO", divp, modp);
+ divp = array_floor_divide(op1, op2);
+ if (divp == NULL) return NULL;
+ modp = array_remainder(op1, op2);
+ if (modp == NULL) {
Py_DECREF(divp);
- Py_DECREF(modp);
- return result;
+ return NULL;
+ }
+ result = Py_BuildValue("OO", divp, modp);
+ Py_DECREF(divp);
+ Py_DECREF(modp);
+ return result;
}
static PyObject *
array_int(PyArrayObject *v)
{
- PyObject *pv, *pv2;
- if (PyArray_SIZE(v) != 1) {
- PyErr_SetString(PyExc_TypeError, "only length-1 arrays can be"\
- " converted to Python scalars");
- return NULL;
- }
- pv = v->descr->f->getitem(v->data, v);
- if (pv == NULL) return NULL;
- if (pv->ob_type->tp_as_number == 0) {
- PyErr_SetString(PyExc_TypeError, "cannot convert to an int; "\
- "scalar object is not a number");
- Py_DECREF(pv);
- return NULL;
- }
- if (pv->ob_type->tp_as_number->nb_int == 0) {
- PyErr_SetString(PyExc_TypeError, "don't know how to convert "\
- "scalar number to int");
- Py_DECREF(pv);
- return NULL;
- }
-
- pv2 = pv->ob_type->tp_as_number->nb_int(pv);
+ PyObject *pv, *pv2;
+ if (PyArray_SIZE(v) != 1) {
+ PyErr_SetString(PyExc_TypeError, "only length-1 arrays can be"\
+ " converted to Python scalars");
+ return NULL;
+ }
+ pv = v->descr->f->getitem(v->data, v);
+ if (pv == NULL) return NULL;
+ if (pv->ob_type->tp_as_number == 0) {
+ PyErr_SetString(PyExc_TypeError, "cannot convert to an int; "\
+ "scalar object is not a number");
+ Py_DECREF(pv);
+ return NULL;
+ }
+ if (pv->ob_type->tp_as_number->nb_int == 0) {
+ PyErr_SetString(PyExc_TypeError, "don't know how to convert "\
+ "scalar number to int");
Py_DECREF(pv);
- return pv2;
+ return NULL;
+ }
+
+ pv2 = pv->ob_type->tp_as_number->nb_int(pv);
+ Py_DECREF(pv);
+ return pv2;
}
static PyObject *
array_float(PyArrayObject *v)
{
- PyObject *pv, *pv2;
- if (PyArray_SIZE(v) != 1) {
- PyErr_SetString(PyExc_TypeError, "only length-1 arrays can "\
- "be converted to Python scalars");
- return NULL;
- }
- pv = v->descr->f->getitem(v->data, v);
- if (pv == NULL) return NULL;
- if (pv->ob_type->tp_as_number == 0) {
- PyErr_SetString(PyExc_TypeError, "cannot convert to a "\
- "float; scalar object is not a number");
- Py_DECREF(pv);
- return NULL;
- }
- if (pv->ob_type->tp_as_number->nb_float == 0) {
- PyErr_SetString(PyExc_TypeError, "don't know how to convert "\
- "scalar number to float");
- Py_DECREF(pv);
- return NULL;
- }
- pv2 = pv->ob_type->tp_as_number->nb_float(pv);
+ PyObject *pv, *pv2;
+ if (PyArray_SIZE(v) != 1) {
+ PyErr_SetString(PyExc_TypeError, "only length-1 arrays can "\
+ "be converted to Python scalars");
+ return NULL;
+ }
+ pv = v->descr->f->getitem(v->data, v);
+ if (pv == NULL) return NULL;
+ if (pv->ob_type->tp_as_number == 0) {
+ PyErr_SetString(PyExc_TypeError, "cannot convert to a "\
+ "float; scalar object is not a number");
Py_DECREF(pv);
- return pv2;
+ return NULL;
+ }
+ if (pv->ob_type->tp_as_number->nb_float == 0) {
+ PyErr_SetString(PyExc_TypeError, "don't know how to convert "\
+ "scalar number to float");
+ Py_DECREF(pv);
+ return NULL;
+ }
+ pv2 = pv->ob_type->tp_as_number->nb_float(pv);
+ Py_DECREF(pv);
+ return pv2;
}
static PyObject *
array_long(PyArrayObject *v)
{
- PyObject *pv, *pv2;
- if (PyArray_SIZE(v) != 1) {
- PyErr_SetString(PyExc_TypeError, "only length-1 arrays can "\
- "be converted to Python scalars");
- return NULL;
- }
- pv = v->descr->f->getitem(v->data, v);
- if (pv->ob_type->tp_as_number == 0) {
- PyErr_SetString(PyExc_TypeError, "cannot convert to an int; "\
- "scalar object is not a number");
- return NULL;
- }
- if (pv->ob_type->tp_as_number->nb_long == 0) {
- PyErr_SetString(PyExc_TypeError, "don't know how to convert "\
- "scalar number to long");
- return NULL;
- }
- pv2 = pv->ob_type->tp_as_number->nb_long(pv);
- Py_DECREF(pv);
- return pv2;
+ PyObject *pv, *pv2;
+ if (PyArray_SIZE(v) != 1) {
+ PyErr_SetString(PyExc_TypeError, "only length-1 arrays can "\
+ "be converted to Python scalars");
+ return NULL;
+ }
+ pv = v->descr->f->getitem(v->data, v);
+ if (pv->ob_type->tp_as_number == 0) {
+ PyErr_SetString(PyExc_TypeError, "cannot convert to an int; "\
+ "scalar object is not a number");
+ return NULL;
+ }
+ if (pv->ob_type->tp_as_number->nb_long == 0) {
+ PyErr_SetString(PyExc_TypeError, "don't know how to convert "\
+ "scalar number to long");
+ return NULL;
+ }
+ pv2 = pv->ob_type->tp_as_number->nb_long(pv);
+ Py_DECREF(pv);
+ return pv2;
}
static PyObject *
array_oct(PyArrayObject *v)
{
- PyObject *pv, *pv2;
- if (PyArray_SIZE(v) != 1) {
- PyErr_SetString(PyExc_TypeError, "only length-1 arrays can "\
- "be converted to Python scalars");
- return NULL;
- }
- pv = v->descr->f->getitem(v->data, v);
- if (pv->ob_type->tp_as_number == 0) {
- PyErr_SetString(PyExc_TypeError, "cannot convert to an int; "\
- "scalar object is not a number");
- return NULL;
- }
- if (pv->ob_type->tp_as_number->nb_oct == 0) {
- PyErr_SetString(PyExc_TypeError, "don't know how to convert "\
- "scalar number to oct");
- return NULL;
- }
- pv2 = pv->ob_type->tp_as_number->nb_oct(pv);
- Py_DECREF(pv);
- return pv2;
+ PyObject *pv, *pv2;
+ if (PyArray_SIZE(v) != 1) {
+ PyErr_SetString(PyExc_TypeError, "only length-1 arrays can "\
+ "be converted to Python scalars");
+ return NULL;
+ }
+ pv = v->descr->f->getitem(v->data, v);
+ if (pv->ob_type->tp_as_number == 0) {
+ PyErr_SetString(PyExc_TypeError, "cannot convert to an int; "\
+ "scalar object is not a number");
+ return NULL;
+ }
+ if (pv->ob_type->tp_as_number->nb_oct == 0) {
+ PyErr_SetString(PyExc_TypeError, "don't know how to convert "\
+ "scalar number to oct");
+ return NULL;
+ }
+ pv2 = pv->ob_type->tp_as_number->nb_oct(pv);
+ Py_DECREF(pv);
+ return pv2;
}
static PyObject *
array_hex(PyArrayObject *v)
{
- PyObject *pv, *pv2;
- if (PyArray_SIZE(v) != 1) {
- PyErr_SetString(PyExc_TypeError, "only length-1 arrays can "\
- "be converted to Python scalars");
- return NULL;
- }
- pv = v->descr->f->getitem(v->data, v);
- if (pv->ob_type->tp_as_number == 0) {
- PyErr_SetString(PyExc_TypeError, "cannot convert to an int; "\
- "scalar object is not a number");
- return NULL;
- }
- if (pv->ob_type->tp_as_number->nb_hex == 0) {
- PyErr_SetString(PyExc_TypeError, "don't know how to convert "\
- "scalar number to hex");
- return NULL;
- }
- pv2 = pv->ob_type->tp_as_number->nb_hex(pv);
- Py_DECREF(pv);
- return pv2;
+ PyObject *pv, *pv2;
+ if (PyArray_SIZE(v) != 1) {
+ PyErr_SetString(PyExc_TypeError, "only length-1 arrays can "\
+ "be converted to Python scalars");
+ return NULL;
+ }
+ pv = v->descr->f->getitem(v->data, v);
+ if (pv->ob_type->tp_as_number == 0) {
+ PyErr_SetString(PyExc_TypeError, "cannot convert to an int; "\
+ "scalar object is not a number");
+ return NULL;
+ }
+ if (pv->ob_type->tp_as_number->nb_hex == 0) {
+ PyErr_SetString(PyExc_TypeError, "don't know how to convert "\
+ "scalar number to hex");
+ return NULL;
+ }
+ pv2 = pv->ob_type->tp_as_number->nb_hex(pv);
+ Py_DECREF(pv);
+ return pv2;
}
static PyObject *
_array_copy_nice(PyArrayObject *self)
{
- return PyArray_Return((PyArrayObject *) \
- PyArray_Copy(self));
+ return PyArray_Return((PyArrayObject *) \
+ PyArray_Copy(self));
}
#if PY_VERSION_HEX >= 0x02050000
static PyObject *
array_index(PyArrayObject *v)
{
- if (!PyArray_ISINTEGER(v) || PyArray_SIZE(v) != 1) {
- PyErr_SetString(PyExc_TypeError, "only integer arrays with " \
- "one element can be converted to an index");
- return NULL;
- }
- return v->descr->f->getitem(v->data, v);
+ if (!PyArray_ISINTEGER(v) || PyArray_SIZE(v) != 1) {
+ PyErr_SetString(PyExc_TypeError, "only integer arrays with " \
+ "one element can be converted to an index");
+ return NULL;
+ }
+ return v->descr->f->getitem(v->data, v);
}
#endif
static PyNumberMethods array_as_number = {
- (binaryfunc)array_add, /*nb_add*/
- (binaryfunc)array_subtract, /*nb_subtract*/
- (binaryfunc)array_multiply, /*nb_multiply*/
- (binaryfunc)array_divide, /*nb_divide*/
- (binaryfunc)array_remainder, /*nb_remainder*/
- (binaryfunc)array_divmod, /*nb_divmod*/
- (ternaryfunc)array_power, /*nb_power*/
- (unaryfunc)array_negative, /*nb_neg*/
- (unaryfunc)_array_copy_nice, /*nb_pos*/
- (unaryfunc)array_absolute, /*(unaryfunc)array_abs,*/
- (inquiry)_array_nonzero, /*nb_nonzero*/
- (unaryfunc)array_invert, /*nb_invert*/
- (binaryfunc)array_left_shift, /*nb_lshift*/
- (binaryfunc)array_right_shift, /*nb_rshift*/
- (binaryfunc)array_bitwise_and, /*nb_and*/
- (binaryfunc)array_bitwise_xor, /*nb_xor*/
- (binaryfunc)array_bitwise_or, /*nb_or*/
- 0, /*nb_coerce*/
- (unaryfunc)array_int, /*nb_int*/
- (unaryfunc)array_long, /*nb_long*/
- (unaryfunc)array_float, /*nb_float*/
- (unaryfunc)array_oct, /*nb_oct*/
- (unaryfunc)array_hex, /*nb_hex*/
-
- /*This code adds augmented assignment functionality*/
- /*that was made available in Python 2.0*/
- (binaryfunc)array_inplace_add, /*inplace_add*/
- (binaryfunc)array_inplace_subtract, /*inplace_subtract*/
- (binaryfunc)array_inplace_multiply, /*inplace_multiply*/
- (binaryfunc)array_inplace_divide, /*inplace_divide*/
- (binaryfunc)array_inplace_remainder, /*inplace_remainder*/
- (ternaryfunc)array_inplace_power, /*inplace_power*/
- (binaryfunc)array_inplace_left_shift, /*inplace_lshift*/
- (binaryfunc)array_inplace_right_shift, /*inplace_rshift*/
- (binaryfunc)array_inplace_bitwise_and, /*inplace_and*/
- (binaryfunc)array_inplace_bitwise_xor, /*inplace_xor*/
- (binaryfunc)array_inplace_bitwise_or, /*inplace_or*/
-
- (binaryfunc)array_floor_divide, /*nb_floor_divide*/
- (binaryfunc)array_true_divide, /*nb_true_divide*/
- (binaryfunc)array_inplace_floor_divide, /*nb_inplace_floor_divide*/
- (binaryfunc)array_inplace_true_divide, /*nb_inplace_true_divide*/
+ (binaryfunc)array_add, /*nb_add*/
+ (binaryfunc)array_subtract, /*nb_subtract*/
+ (binaryfunc)array_multiply, /*nb_multiply*/
+ (binaryfunc)array_divide, /*nb_divide*/
+ (binaryfunc)array_remainder, /*nb_remainder*/
+ (binaryfunc)array_divmod, /*nb_divmod*/
+ (ternaryfunc)array_power, /*nb_power*/
+ (unaryfunc)array_negative, /*nb_neg*/
+ (unaryfunc)_array_copy_nice, /*nb_pos*/
+ (unaryfunc)array_absolute, /*(unaryfunc)array_abs,*/
+ (inquiry)_array_nonzero, /*nb_nonzero*/
+ (unaryfunc)array_invert, /*nb_invert*/
+ (binaryfunc)array_left_shift, /*nb_lshift*/
+ (binaryfunc)array_right_shift, /*nb_rshift*/
+ (binaryfunc)array_bitwise_and, /*nb_and*/
+ (binaryfunc)array_bitwise_xor, /*nb_xor*/
+ (binaryfunc)array_bitwise_or, /*nb_or*/
+ 0, /*nb_coerce*/
+ (unaryfunc)array_int, /*nb_int*/
+ (unaryfunc)array_long, /*nb_long*/
+ (unaryfunc)array_float, /*nb_float*/
+ (unaryfunc)array_oct, /*nb_oct*/
+ (unaryfunc)array_hex, /*nb_hex*/
+
+ /*This code adds augmented assignment functionality*/
+ /*that was made available in Python 2.0*/
+ (binaryfunc)array_inplace_add, /*inplace_add*/
+ (binaryfunc)array_inplace_subtract, /*inplace_subtract*/
+ (binaryfunc)array_inplace_multiply, /*inplace_multiply*/
+ (binaryfunc)array_inplace_divide, /*inplace_divide*/
+ (binaryfunc)array_inplace_remainder, /*inplace_remainder*/
+ (ternaryfunc)array_inplace_power, /*inplace_power*/
+ (binaryfunc)array_inplace_left_shift, /*inplace_lshift*/
+ (binaryfunc)array_inplace_right_shift, /*inplace_rshift*/
+ (binaryfunc)array_inplace_bitwise_and, /*inplace_and*/
+ (binaryfunc)array_inplace_bitwise_xor, /*inplace_xor*/
+ (binaryfunc)array_inplace_bitwise_or, /*inplace_or*/
+
+ (binaryfunc)array_floor_divide, /*nb_floor_divide*/
+ (binaryfunc)array_true_divide, /*nb_true_divide*/
+ (binaryfunc)array_inplace_floor_divide, /*nb_inplace_floor_divide*/
+ (binaryfunc)array_inplace_true_divide, /*nb_inplace_true_divide*/
#if PY_VERSION_HEX >= 0x02050000
- (unaryfunc)array_index, /* nb_index */
+ (unaryfunc)array_index, /* nb_index */
#endif
};
@@ -4005,108 +4004,108 @@ static PyObject *
array_slice(PyArrayObject *self, Py_ssize_t ilow,
Py_ssize_t ihigh)
{
- PyArrayObject *r;
- Py_ssize_t l;
- char *data;
+ PyArrayObject *r;
+ Py_ssize_t l;
+ char *data;
- if (self->nd == 0) {
- PyErr_SetString(PyExc_ValueError, "cannot slice a 0-d array");
- return NULL;
- }
+ if (self->nd == 0) {
+ PyErr_SetString(PyExc_ValueError, "cannot slice a 0-d array");
+ return NULL;
+ }
- l=self->dimensions[0];
- if (ilow < 0) ilow = 0;
- else if (ilow > l) ilow = l;
- if (ihigh < ilow) ihigh = ilow;
- else if (ihigh > l) ihigh = l;
+ l=self->dimensions[0];
+ if (ilow < 0) ilow = 0;
+ else if (ilow > l) ilow = l;
+ if (ihigh < ilow) ihigh = ilow;
+ else if (ihigh > l) ihigh = l;
+
+ if (ihigh != ilow) {
+ data = index2ptr(self, ilow);
+ if (data == NULL) return NULL;
+ } else {
+ data = self->data;
+ }
- if (ihigh != ilow) {
- data = index2ptr(self, ilow);
- if (data == NULL) return NULL;
- } else {
- data = self->data;
- }
-
- self->dimensions[0] = ihigh-ilow;
- Py_INCREF(self->descr);
- r = (PyArrayObject *) \
- PyArray_NewFromDescr(self->ob_type, self->descr,
- self->nd, self->dimensions,
- self->strides, data,
- self->flags, (PyObject *)self);
- self->dimensions[0] = l;
- if (r == NULL) return NULL;
- r->base = (PyObject *)self;
- Py_INCREF(self);
- PyArray_UpdateFlags(r, UPDATE_ALL);
- return (PyObject *)r;
+ self->dimensions[0] = ihigh-ilow;
+ Py_INCREF(self->descr);
+ r = (PyArrayObject *) \
+ PyArray_NewFromDescr(self->ob_type, self->descr,
+ self->nd, self->dimensions,
+ self->strides, data,
+ self->flags, (PyObject *)self);
+ self->dimensions[0] = l;
+ if (r == NULL) return NULL;
+ r->base = (PyObject *)self;
+ Py_INCREF(self);
+ PyArray_UpdateFlags(r, UPDATE_ALL);
+ return (PyObject *)r;
}
static int
array_ass_slice(PyArrayObject *self, Py_ssize_t ilow,
Py_ssize_t ihigh, PyObject *v) {
- int ret;
- PyArrayObject *tmp;
+ int ret;
+ PyArrayObject *tmp;
- if (v == NULL) {
- PyErr_SetString(PyExc_ValueError,
- "cannot delete array elements");
- return -1;
- }
- if (!PyArray_ISWRITEABLE(self)) {
- PyErr_SetString(PyExc_RuntimeError,
- "array is not writeable");
- return -1;
- }
- if ((tmp = (PyArrayObject *)array_slice(self, ilow, ihigh)) \
- == NULL)
- return -1;
- ret = PyArray_CopyObject(tmp, v);
- Py_DECREF(tmp);
+ if (v == NULL) {
+ PyErr_SetString(PyExc_ValueError,
+ "cannot delete array elements");
+ return -1;
+ }
+ if (!PyArray_ISWRITEABLE(self)) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "array is not writeable");
+ return -1;
+ }
+ if ((tmp = (PyArrayObject *)array_slice(self, ilow, ihigh)) \
+ == NULL)
+ return -1;
+ ret = PyArray_CopyObject(tmp, v);
+ Py_DECREF(tmp);
- return ret;
+ return ret;
}
static int
array_contains(PyArrayObject *self, PyObject *el)
{
- /* equivalent to (self == el).any() */
+ /* equivalent to (self == el).any() */
- PyObject *res;
- int ret;
+ PyObject *res;
+ int ret;
- res = PyArray_EnsureAnyArray(PyObject_RichCompare((PyObject *)self,
- el, Py_EQ));
- if (res == NULL) return -1;
- ret = array_any_nonzero((PyArrayObject *)res);
- Py_DECREF(res);
- return ret;
+ res = PyArray_EnsureAnyArray(PyObject_RichCompare((PyObject *)self,
+ el, Py_EQ));
+ if (res == NULL) return -1;
+ ret = array_any_nonzero((PyArrayObject *)res);
+ Py_DECREF(res);
+ return ret;
}
static PySequenceMethods array_as_sequence = {
#if PY_VERSION_HEX >= 0x02050000
- (lenfunc)array_length, /*sq_length*/
- (binaryfunc)NULL, /* sq_concat is handled by nb_add*/
- (ssizeargfunc)NULL,
- (ssizeargfunc)array_item_nice,
- (ssizessizeargfunc)array_slice,
- (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
- (ssizessizeobjargproc)array_ass_slice, /*sq_ass_slice*/
- (objobjproc) array_contains, /* sq_contains */
- (binaryfunc) NULL, /* sg_inplace_concat */
- (ssizeargfunc)NULL,
+ (lenfunc)array_length, /*sq_length*/
+ (binaryfunc)NULL, /* sq_concat is handled by nb_add*/
+ (ssizeargfunc)NULL,
+ (ssizeargfunc)array_item_nice,
+ (ssizessizeargfunc)array_slice,
+ (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
+ (ssizessizeobjargproc)array_ass_slice, /*sq_ass_slice*/
+ (objobjproc) array_contains, /* sq_contains */
+ (binaryfunc) NULL, /* sg_inplace_concat */
+ (ssizeargfunc)NULL,
#else
- (inquiry)array_length, /*sq_length*/
- (binaryfunc)NULL, /* sq_concat is handled by nb_add*/
- (intargfunc)NULL, /* sq_repeat is handled nb_multiply*/
- (intargfunc)array_item_nice, /*sq_item*/
- (intintargfunc)array_slice, /*sq_slice*/
- (intobjargproc)array_ass_item, /*sq_ass_item*/
- (intintobjargproc)array_ass_slice, /*sq_ass_slice*/
- (objobjproc) array_contains, /* sq_contains */
- (binaryfunc) NULL, /* sg_inplace_concat */
- (intargfunc) NULL /* sg_inplace_repeat */
+ (inquiry)array_length, /*sq_length*/
+ (binaryfunc)NULL, /* sq_concat is handled by nb_add*/
+ (intargfunc)NULL, /* sq_repeat is handled nb_multiply*/
+ (intargfunc)array_item_nice, /*sq_item*/
+ (intintargfunc)array_slice, /*sq_slice*/
+ (intobjargproc)array_ass_item, /*sq_ass_item*/
+ (intintobjargproc)array_ass_slice, /*sq_ass_slice*/
+ (objobjproc) array_contains, /* sq_contains */
+ (binaryfunc) NULL, /* sg_inplace_concat */
+ (intargfunc) NULL /* sg_inplace_repeat */
#endif
};
@@ -4118,48 +4117,48 @@ static int
dump_data(char **string, int *n, int *max_n, char *data, int nd,
intp *dimensions, intp *strides, PyArrayObject* self)
{
- PyArray_Descr *descr=self->descr;
- PyObject *op, *sp;
- char *ostring;
- int i, N;
-
-#define CHECK_MEMORY if (*n >= *max_n-16) { *max_n *= 2; \
- *string = (char *)_pya_realloc(*string, *max_n); }
-
- if (nd == 0) {
-
- if ((op = descr->f->getitem(data, self)) == NULL) return -1;
- sp = PyObject_Repr(op);
- if (sp == NULL) {Py_DECREF(op); return -1;}
- ostring = PyString_AsString(sp);
- N = PyString_Size(sp)*sizeof(char);
- *n += N;
- CHECK_MEMORY
- memmove(*string+(*n-N), ostring, N);
- Py_DECREF(sp);
- Py_DECREF(op);
- return 0;
- } else {
- CHECK_MEMORY
- (*string)[*n] = '[';
- *n += 1;
- for(i=0; i<dimensions[0]; i++) {
- if (dump_data(string, n, max_n,
- data+(*strides)*i,
- nd-1, dimensions+1,
- strides+1, self) < 0)
- return -1;
- CHECK_MEMORY
- if (i<dimensions[0]-1) {
- (*string)[*n] = ',';
- (*string)[*n+1] = ' ';
- *n += 2;
- }
+ PyArray_Descr *descr=self->descr;
+ PyObject *op, *sp;
+ char *ostring;
+ int i, N;
+
+#define CHECK_MEMORY if (*n >= *max_n-16) { *max_n *= 2; \
+ *string = (char *)_pya_realloc(*string, *max_n); }
+
+ if (nd == 0) {
+
+ if ((op = descr->f->getitem(data, self)) == NULL) return -1;
+ sp = PyObject_Repr(op);
+ if (sp == NULL) {Py_DECREF(op); return -1;}
+ ostring = PyString_AsString(sp);
+ N = PyString_Size(sp)*sizeof(char);
+ *n += N;
+ CHECK_MEMORY
+ memmove(*string+(*n-N), ostring, N);
+ Py_DECREF(sp);
+ Py_DECREF(op);
+ return 0;
+ } else {
+ CHECK_MEMORY
+ (*string)[*n] = '[';
+ *n += 1;
+ for(i=0; i<dimensions[0]; i++) {
+ if (dump_data(string, n, max_n,
+ data+(*strides)*i,
+ nd-1, dimensions+1,
+ strides+1, self) < 0)
+ return -1;
+ CHECK_MEMORY
+ if (i<dimensions[0]-1) {
+ (*string)[*n] = ',';
+ (*string)[*n+1] = ' ';
+ *n += 2;
}
- CHECK_MEMORY
- (*string)[*n] = ']'; *n += 1;
- return 0;
}
+ CHECK_MEMORY
+ (*string)[*n] = ']'; *n += 1;
+ return 0;
+ }
#undef CHECK_MEMORY
}
@@ -4167,104 +4166,104 @@ dump_data(char **string, int *n, int *max_n, char *data, int nd,
static PyObject *
array_repr_builtin(PyArrayObject *self, int repr)
{
- PyObject *ret;
- char *string;
- int n, max_n;
+ PyObject *ret;
+ char *string;
+ int n, max_n;
- max_n = PyArray_NBYTES(self)*4*sizeof(char) + 7;
+ max_n = PyArray_NBYTES(self)*4*sizeof(char) + 7;
- if ((string = (char *)_pya_malloc(max_n)) == NULL) {
- PyErr_SetString(PyExc_MemoryError, "out of memory");
- return NULL;
- }
+ if ((string = (char *)_pya_malloc(max_n)) == NULL) {
+ PyErr_SetString(PyExc_MemoryError, "out of memory");
+ return NULL;
+ }
- if (repr) {
- n = 6;
- sprintf(string, "array(");
- }
- else {
- n = 0;
- }
- if (dump_data(&string, &n, &max_n, self->data,
- self->nd, self->dimensions,
- self->strides, self) < 0) {
- _pya_free(string); return NULL;
- }
+ if (repr) {
+ n = 6;
+ sprintf(string, "array(");
+ }
+ else {
+ n = 0;
+ }
+ if (dump_data(&string, &n, &max_n, self->data,
+ self->nd, self->dimensions,
+ self->strides, self) < 0) {
+ _pya_free(string); return NULL;
+ }
- if (repr) {
- if (PyArray_ISEXTENDED(self)) {
- char buf[100];
- snprintf(buf, sizeof(buf), "%d", self->descr->elsize);
- sprintf(string+n, ", '%c%s')", self->descr->type, buf);
- ret = PyString_FromStringAndSize(string, n+6+strlen(buf));
- }
- else {
- sprintf(string+n, ", '%c')", self->descr->type);
- ret = PyString_FromStringAndSize(string, n+6);
- }
+ if (repr) {
+ if (PyArray_ISEXTENDED(self)) {
+ char buf[100];
+ snprintf(buf, sizeof(buf), "%d", self->descr->elsize);
+ sprintf(string+n, ", '%c%s')", self->descr->type, buf);
+ ret = PyString_FromStringAndSize(string, n+6+strlen(buf));
}
else {
- ret = PyString_FromStringAndSize(string, n);
+ sprintf(string+n, ", '%c')", self->descr->type);
+ ret = PyString_FromStringAndSize(string, n+6);
}
+ }
+ else {
+ ret = PyString_FromStringAndSize(string, n);
+ }
- _pya_free(string);
- return ret;
+ _pya_free(string);
+ return ret;
}
static PyObject *PyArray_StrFunction=NULL;
static PyObject *PyArray_ReprFunction=NULL;
/*OBJECT_API
- Set the array print function to be a Python function.
+ Set the array print function to be a Python function.
*/
static void
PyArray_SetStringFunction(PyObject *op, int repr)
{
- if (repr) {
- /* Dispose of previous callback */
- Py_XDECREF(PyArray_ReprFunction);
- /* Add a reference to new callback */
- Py_XINCREF(op);
- /* Remember new callback */
- PyArray_ReprFunction = op;
- } else {
- /* Dispose of previous callback */
- Py_XDECREF(PyArray_StrFunction);
- /* Add a reference to new callback */
- Py_XINCREF(op);
- /* Remember new callback */
- PyArray_StrFunction = op;
- }
+ if (repr) {
+ /* Dispose of previous callback */
+ Py_XDECREF(PyArray_ReprFunction);
+ /* Add a reference to new callback */
+ Py_XINCREF(op);
+ /* Remember new callback */
+ PyArray_ReprFunction = op;
+ } else {
+ /* Dispose of previous callback */
+ Py_XDECREF(PyArray_StrFunction);
+ /* Add a reference to new callback */
+ Py_XINCREF(op);
+ /* Remember new callback */
+ PyArray_StrFunction = op;
+ }
}
static PyObject *
array_repr(PyArrayObject *self)
{
- PyObject *s, *arglist;
+ PyObject *s, *arglist;
- if (PyArray_ReprFunction == NULL) {
- s = array_repr_builtin(self, 1);
- } else {
- arglist = Py_BuildValue("(O)", self);
- s = PyEval_CallObject(PyArray_ReprFunction, arglist);
- Py_DECREF(arglist);
- }
- return s;
+ if (PyArray_ReprFunction == NULL) {
+ s = array_repr_builtin(self, 1);
+ } else {
+ arglist = Py_BuildValue("(O)", self);
+ s = PyEval_CallObject(PyArray_ReprFunction, arglist);
+ Py_DECREF(arglist);
+ }
+ return s;
}
static PyObject *
array_str(PyArrayObject *self)
{
- PyObject *s, *arglist;
+ PyObject *s, *arglist;
- if (PyArray_StrFunction == NULL) {
- s = array_repr_builtin(self, 0);
- } else {
- arglist = Py_BuildValue("(O)", self);
- s = PyEval_CallObject(PyArray_StrFunction, arglist);
- Py_DECREF(arglist);
- }
- return s;
+ if (PyArray_StrFunction == NULL) {
+ s = array_repr_builtin(self, 0);
+ } else {
+ arglist = Py_BuildValue("(O)", self);
+ s = PyEval_CallObject(PyArray_StrFunction, arglist);
+ Py_DECREF(arglist);
+ }
+ return s;
}
@@ -4274,15 +4273,15 @@ array_str(PyArrayObject *self)
static int
PyArray_CompareUCS4(npy_ucs4 *s1, npy_ucs4 *s2, register size_t len)
{
- register PyArray_UCS4 c1, c2;
- while(len-- > 0) {
- c1 = *s1++;
- c2 = *s2++;
- if (c1 != c2) {
- return (c1 < c2) ? -1 : 1;
- }
+ register PyArray_UCS4 c1, c2;
+ while(len-- > 0) {
+ c1 = *s1++;
+ c2 = *s2++;
+ if (c1 != c2) {
+ return (c1 < c2) ? -1 : 1;
}
- return 0;
+ }
+ return 0;
}
/* This also handles possibly mis-aligned data */
@@ -4294,36 +4293,36 @@ PyArray_CompareUCS4(npy_ucs4 *s1, npy_ucs4 *s2, register size_t len)
static int
_myunincmp(PyArray_UCS4 *s1, PyArray_UCS4 *s2, int len1, int len2)
{
- PyArray_UCS4 *sptr;
- PyArray_UCS4 *s1t=s1, *s2t=s2;
- int val;
- intp size;
- int diff;
+ PyArray_UCS4 *sptr;
+ PyArray_UCS4 *s1t=s1, *s2t=s2;
+ int val;
+ intp size;
+ int diff;
- if ((intp)s1 % sizeof(PyArray_UCS4) != 0) {
- size = len1*sizeof(PyArray_UCS4);
- s1t = malloc(size);
- memcpy(s1t, s1, size);
- }
- if ((intp)s2 % sizeof(PyArray_UCS4) != 0) {
- size = len2*sizeof(PyArray_UCS4);
- s2t = malloc(size);
- memcpy(s2t, s2, size);
- }
- val = PyArray_CompareUCS4(s1t, s2t, MIN(len1,len2));
- if ((val != 0) || (len1 == len2)) goto finish;
- if (len2 > len1) {sptr = s2t+len1; val = -1; diff=len2-len1;}
- else {sptr = s1t+len2; val = 1; diff=len1-len2;}
- while (diff--) {
- if (*sptr != 0) goto finish;
- sptr++;
- }
- val = 0;
+ if ((intp)s1 % sizeof(PyArray_UCS4) != 0) {
+ size = len1*sizeof(PyArray_UCS4);
+ s1t = malloc(size);
+ memcpy(s1t, s1, size);
+ }
+ if ((intp)s2 % sizeof(PyArray_UCS4) != 0) {
+ size = len2*sizeof(PyArray_UCS4);
+ s2t = malloc(size);
+ memcpy(s2t, s2, size);
+ }
+ val = PyArray_CompareUCS4(s1t, s2t, MIN(len1,len2));
+ if ((val != 0) || (len1 == len2)) goto finish;
+ if (len2 > len1) {sptr = s2t+len1; val = -1; diff=len2-len1;}
+ else {sptr = s1t+len2; val = 1; diff=len1-len2;}
+ while (diff--) {
+ if (*sptr != 0) goto finish;
+ sptr++;
+ }
+ val = 0;
finish:
- if (s1t != s1) free(s1t);
- if (s2t != s2) free(s2t);
- return val;
+ if (s1t != s1) free(s1t);
+ if (s2t != s2) free(s2t);
+ return val;
}
@@ -4337,19 +4336,19 @@ _myunincmp(PyArray_UCS4 *s1, PyArray_UCS4 *s2, int len1, int len2)
static int
_mystrncmp(char *s1, char *s2, int len1, int len2)
{
- char *sptr;
- int val;
- int diff;
-
- val = memcmp(s1, s2, MIN(len1, len2));
- if ((val != 0) || (len1 == len2)) return val;
- if (len2 > len1) {sptr = s2+len1; val = -1; diff=len2-len1;}
- else {sptr = s1+len2; val = 1; diff=len1-len2;}
- while (diff--) {
- if (*sptr != 0) return val;
- sptr++;
- }
- return 0; /* Only happens if NULLs are everywhere */
+ char *sptr;
+ int val;
+ int diff;
+
+ val = memcmp(s1, s2, MIN(len1, len2));
+ if ((val != 0) || (len1 == len2)) return val;
+ if (len2 > len1) {sptr = s2+len1; val = -1; diff=len2-len1;}
+ else {sptr = s1+len2; val = 1; diff=len1-len2;}
+ while (diff--) {
+ if (*sptr != 0) return val;
+ sptr++;
+ }
+ return 0; /* Only happens if NULLs are everywhere */
}
/* Borrowed from Numarray */
@@ -4363,27 +4362,27 @@ _mystrncmp(char *s1, char *s2, int len1, int len2)
static void _rstripw(char *s, int n)
{
- int i;
- for(i=n-1; i>=1; i--) /* Never strip to length 0. */
+ int i;
+ for(i=n-1; i>=1; i--) /* Never strip to length 0. */
{
- int c = s[i];
- if (!c || isspace(c))
- s[i] = 0;
- else
- break;
+ int c = s[i];
+ if (!c || isspace(c))
+ s[i] = 0;
+ else
+ break;
}
}
static void _unistripw(PyArray_UCS4 *s, int n)
{
- int i;
- for(i=n-1; i>=1; i--) /* Never strip to length 0. */
+ int i;
+ for(i=n-1; i>=1; i--) /* Never strip to length 0. */
{
- PyArray_UCS4 c = s[i];
- if (!c || isspace(c))
- s[i] = 0;
- else
- break;
+ PyArray_UCS4 c = s[i];
+ if (!c || isspace(c))
+ s[i] = 0;
+ else
+ break;
}
}
@@ -4391,143 +4390,143 @@ static void _unistripw(PyArray_UCS4 *s, int n)
static char *
_char_copy_n_strip(char *original, char *temp, int nc)
{
- if (nc > SMALL_STRING) {
- temp = malloc(nc);
- if (!temp) {
- PyErr_NoMemory();
- return NULL;
- }
+ if (nc > SMALL_STRING) {
+ temp = malloc(nc);
+ if (!temp) {
+ PyErr_NoMemory();
+ return NULL;
}
- memcpy(temp, original, nc);
- _rstripw(temp, nc);
- return temp;
+ }
+ memcpy(temp, original, nc);
+ _rstripw(temp, nc);
+ return temp;
}
static void
_char_release(char *ptr, int nc)
{
- if (nc > SMALL_STRING) {
- free(ptr);
- }
+ if (nc > SMALL_STRING) {
+ free(ptr);
+ }
}
static char *
_uni_copy_n_strip(char *original, char *temp, int nc)
{
- if (nc*sizeof(PyArray_UCS4) > SMALL_STRING) {
- temp = malloc(nc*sizeof(PyArray_UCS4));
- if (!temp) {
- PyErr_NoMemory();
- return NULL;
- }
+ if (nc*sizeof(PyArray_UCS4) > SMALL_STRING) {
+ temp = malloc(nc*sizeof(PyArray_UCS4));
+ if (!temp) {
+ PyErr_NoMemory();
+ return NULL;
}
- memcpy(temp, original, nc*sizeof(PyArray_UCS4));
- _unistripw((PyArray_UCS4 *)temp, nc);
- return temp;
+ }
+ memcpy(temp, original, nc*sizeof(PyArray_UCS4));
+ _unistripw((PyArray_UCS4 *)temp, nc);
+ return temp;
}
static void
_uni_release(char *ptr, int nc)
{
- if (nc*sizeof(PyArray_UCS4) > SMALL_STRING) {
- free(ptr);
- }
+ if (nc*sizeof(PyArray_UCS4) > SMALL_STRING) {
+ free(ptr);
+ }
}
/* End borrowed from numarray */
-#define _rstrip_loop(CMP) { \
- void *aptr, *bptr; \
- char atemp[SMALL_STRING], btemp[SMALL_STRING]; \
- while(size--) { \
- aptr = stripfunc(iself->dataptr, atemp, N1); \
- if (!aptr) return -1; \
- bptr = stripfunc(iother->dataptr, btemp, N2); \
- if (!bptr) { \
- relfunc(aptr, N1); \
- return -1; \
- } \
- val = cmpfunc(aptr, bptr, N1, N2); \
- *dptr = (val CMP 0); \
- PyArray_ITER_NEXT(iself); \
- PyArray_ITER_NEXT(iother); \
- dptr += 1; \
- relfunc(aptr, N1); \
- relfunc(bptr, N2); \
- } \
- }
-
-#define _reg_loop(CMP) { \
- while(size--) { \
- val = cmpfunc((void *)iself->dataptr, \
- (void *)iother->dataptr, \
- N1, N2); \
- *dptr = (val CMP 0); \
- PyArray_ITER_NEXT(iself); \
- PyArray_ITER_NEXT(iother); \
- dptr += 1; \
- } \
- }
-
-#define _loop(CMP) if (rstrip) _rstrip_loop(CMP) \
+#define _rstrip_loop(CMP) { \
+ void *aptr, *bptr; \
+ char atemp[SMALL_STRING], btemp[SMALL_STRING]; \
+ while(size--) { \
+ aptr = stripfunc(iself->dataptr, atemp, N1); \
+ if (!aptr) return -1; \
+ bptr = stripfunc(iother->dataptr, btemp, N2); \
+ if (!bptr) { \
+ relfunc(aptr, N1); \
+ return -1; \
+ } \
+ val = cmpfunc(aptr, bptr, N1, N2); \
+ *dptr = (val CMP 0); \
+ PyArray_ITER_NEXT(iself); \
+ PyArray_ITER_NEXT(iother); \
+ dptr += 1; \
+ relfunc(aptr, N1); \
+ relfunc(bptr, N2); \
+ } \
+ }
+
+#define _reg_loop(CMP) { \
+ while(size--) { \
+ val = cmpfunc((void *)iself->dataptr, \
+ (void *)iother->dataptr, \
+ N1, N2); \
+ *dptr = (val CMP 0); \
+ PyArray_ITER_NEXT(iself); \
+ PyArray_ITER_NEXT(iother); \
+ dptr += 1; \
+ } \
+ }
+
+#define _loop(CMP) if (rstrip) _rstrip_loop(CMP) \
else _reg_loop(CMP)
static int
_compare_strings(PyObject *result, PyArrayMultiIterObject *multi,
int cmp_op, void *func, int rstrip)
{
- PyArrayIterObject *iself, *iother;
- Bool *dptr;
- intp size;
- int val;
- int N1, N2;
- int (*cmpfunc)(void *, void *, int, int);
- void (*relfunc)(char *, int);
- char* (*stripfunc)(char *, char *, int);
-
- cmpfunc = func;
- dptr = (Bool *)PyArray_DATA(result);
- iself = multi->iters[0];
- iother = multi->iters[1];
- size = multi->size;
- N1 = iself->ao->descr->elsize;
- N2 = iother->ao->descr->elsize;
- if ((void *)cmpfunc == (void *)_myunincmp) {
- N1 >>= 2;
- N2 >>= 2;
- stripfunc = _uni_copy_n_strip;
- relfunc = _uni_release;
- }
- else {
- stripfunc = _char_copy_n_strip;
- relfunc = _char_release;
- }
- switch (cmp_op) {
- case Py_EQ:
- _loop(==)
- break;
- case Py_NE:
- _loop(!=)
- break;
- case Py_LT:
- _loop(<)
- break;
- case Py_LE:
- _loop(<=)
- break;
- case Py_GT:
- _loop(>)
- break;
- case Py_GE:
- _loop(>=)
- break;
- default:
- PyErr_SetString(PyExc_RuntimeError,
- "bad comparison operator");
- return -1;
- }
- return 0;
+ PyArrayIterObject *iself, *iother;
+ Bool *dptr;
+ intp size;
+ int val;
+ int N1, N2;
+ int (*cmpfunc)(void *, void *, int, int);
+ void (*relfunc)(char *, int);
+ char* (*stripfunc)(char *, char *, int);
+
+ cmpfunc = func;
+ dptr = (Bool *)PyArray_DATA(result);
+ iself = multi->iters[0];
+ iother = multi->iters[1];
+ size = multi->size;
+ N1 = iself->ao->descr->elsize;
+ N2 = iother->ao->descr->elsize;
+ if ((void *)cmpfunc == (void *)_myunincmp) {
+ N1 >>= 2;
+ N2 >>= 2;
+ stripfunc = _uni_copy_n_strip;
+ relfunc = _uni_release;
+ }
+ else {
+ stripfunc = _char_copy_n_strip;
+ relfunc = _char_release;
+ }
+ switch (cmp_op) {
+ case Py_EQ:
+ _loop(==)
+ break;
+ case Py_NE:
+ _loop(!=)
+ break;
+ case Py_LT:
+ _loop(<)
+ break;
+ case Py_LE:
+ _loop(<=)
+ break;
+ case Py_GT:
+ _loop(>)
+ break;
+ case Py_GE:
+ _loop(>=)
+ break;
+ default:
+ PyErr_SetString(PyExc_RuntimeError,
+ "bad comparison operator");
+ return -1;
+ }
+ return 0;
}
#undef _loop
@@ -4539,82 +4538,82 @@ static PyObject *
_strings_richcompare(PyArrayObject *self, PyArrayObject *other, int cmp_op,
int rstrip)
{
- PyObject *result;
- PyArrayMultiIterObject *mit;
- int val;
-
- /* Cast arrays to a common type */
- if (self->descr->type_num != other->descr->type_num) {
- PyObject *new;
- if (self->descr->type_num == PyArray_STRING && \
- other->descr->type_num == PyArray_UNICODE) {
- Py_INCREF(other);
- Py_INCREF(other->descr);
- new = PyArray_FromAny((PyObject *)self, other->descr,
- 0, 0, 0, NULL);
- if (new == NULL) return NULL;
- self = (PyArrayObject *)new;
- }
- else if (self->descr->type_num == PyArray_UNICODE && \
- other->descr->type_num == PyArray_STRING) {
- Py_INCREF(self);
- Py_INCREF(self->descr);
- new = PyArray_FromAny((PyObject *)other, self->descr,
- 0, 0, 0, NULL);
- if (new == NULL) return NULL;
- other = (PyArrayObject *)new;
- }
- else {
- PyErr_SetString(PyExc_TypeError,
- "invalid string data-types "
- "in comparison");
- return NULL;
- }
- }
- else {
- Py_INCREF(self);
- Py_INCREF(other);
- }
+ PyObject *result;
+ PyArrayMultiIterObject *mit;
+ int val;
- /* Broad-cast the arrays to a common shape */
- mit = (PyArrayMultiIterObject *)PyArray_MultiIterNew(2, self, other);
- Py_DECREF(self);
- Py_DECREF(other);
- if (mit == NULL) return NULL;
-
- result = PyArray_NewFromDescr(&PyArray_Type,
- PyArray_DescrFromType(PyArray_BOOL),
- mit->nd,
- mit->dimensions,
- NULL, NULL, 0,
- NULL);
- if (result == NULL) goto finish;
-
- if (self->descr->type_num == PyArray_UNICODE) {
- val = _compare_strings(result, mit, cmp_op, _myunincmp,
- rstrip);
+ /* Cast arrays to a common type */
+ if (self->descr->type_num != other->descr->type_num) {
+ PyObject *new;
+ if (self->descr->type_num == PyArray_STRING && \
+ other->descr->type_num == PyArray_UNICODE) {
+ Py_INCREF(other);
+ Py_INCREF(other->descr);
+ new = PyArray_FromAny((PyObject *)self, other->descr,
+ 0, 0, 0, NULL);
+ if (new == NULL) return NULL;
+ self = (PyArrayObject *)new;
+ }
+ else if (self->descr->type_num == PyArray_UNICODE && \
+ other->descr->type_num == PyArray_STRING) {
+ Py_INCREF(self);
+ Py_INCREF(self->descr);
+ new = PyArray_FromAny((PyObject *)other, self->descr,
+ 0, 0, 0, NULL);
+ if (new == NULL) return NULL;
+ other = (PyArrayObject *)new;
}
else {
- val = _compare_strings(result, mit, cmp_op, _mystrncmp,
- rstrip);
+ PyErr_SetString(PyExc_TypeError,
+ "invalid string data-types "
+ "in comparison");
+ return NULL;
}
+ }
+ else {
+ Py_INCREF(self);
+ Py_INCREF(other);
+ }
+
+ /* Broad-cast the arrays to a common shape */
+ mit = (PyArrayMultiIterObject *)PyArray_MultiIterNew(2, self, other);
+ Py_DECREF(self);
+ Py_DECREF(other);
+ if (mit == NULL) return NULL;
+
+ result = PyArray_NewFromDescr(&PyArray_Type,
+ PyArray_DescrFromType(PyArray_BOOL),
+ mit->nd,
+ mit->dimensions,
+ NULL, NULL, 0,
+ NULL);
+ if (result == NULL) goto finish;
+
+ if (self->descr->type_num == PyArray_UNICODE) {
+ val = _compare_strings(result, mit, cmp_op, _myunincmp,
+ rstrip);
+ }
+ else {
+ val = _compare_strings(result, mit, cmp_op, _mystrncmp,
+ rstrip);
+ }
- if (val < 0) {Py_DECREF(result); result = NULL;}
+ if (val < 0) {Py_DECREF(result); result = NULL;}
finish:
- Py_DECREF(mit);
- return result;
+ Py_DECREF(mit);
+ return result;
}
/* VOID-type arrays can only be compared equal and not-equal
- in which case the fields are all compared by extracting the fields
- and testing one at a time...
- equality testing is performed using logical_ands on all the fields.
- in-equality testing is performed using logical_ors on all the fields.
+ in which case the fields are all compared by extracting the fields
+ and testing one at a time...
+ equality testing is performed using logical_ands on all the fields.
+ in-equality testing is performed using logical_ors on all the fields.
- VOID-type arrays without fields are compared for equality by comparing their
- memory at each location directly (using string-code).
- */
+ VOID-type arrays without fields are compared for equality by comparing their
+ memory at each location directly (using string-code).
+*/
static PyObject *array_richcompare(PyArrayObject *, PyObject *, int);
@@ -4622,334 +4621,334 @@ static PyObject *array_richcompare(PyArrayObject *, PyObject *, int);
static PyObject *
_void_compare(PyArrayObject *self, PyArrayObject *other, int cmp_op)
{
- if (!(cmp_op == Py_EQ || cmp_op == Py_NE)) {
- PyErr_SetString(PyExc_ValueError, "Void-arrays can only" \
- "be compared for equality.");
- return NULL;
- }
- if (PyArray_HASFIELDS(self)) {
- PyObject *res=NULL, *temp, *a, *b;
- PyObject *key, *value, *temp2;
- PyObject *op;
- Py_ssize_t pos=0;
- op = (cmp_op == Py_EQ ? n_ops.logical_and : n_ops.logical_or);
- while (PyDict_Next(self->descr->fields, &pos, &key, &value)) {
- a = PyArray_EnsureAnyArray(array_subscript(self, key));
- if (a==NULL) {Py_XDECREF(res); return NULL;}
- b = array_subscript(other, key);
- if (b==NULL) {Py_XDECREF(res); Py_DECREF(a); return NULL;}
- temp = array_richcompare((PyArrayObject *)a,b,cmp_op);
- Py_DECREF(a);
- Py_DECREF(b);
- if (temp == NULL) {Py_XDECREF(res); return NULL;}
- if (res == NULL) {
- res = temp;
- }
- else {
- temp2 = PyObject_CallFunction(op, "OO", res, temp);
- Py_DECREF(temp);
- Py_DECREF(res);
- if (temp2 == NULL) return NULL;
- res = temp2;
- }
- }
- if (res == NULL && !PyErr_Occurred()) {
- PyErr_SetString(PyExc_ValueError, "No fields found.");
- }
- return res;
+ if (!(cmp_op == Py_EQ || cmp_op == Py_NE)) {
+ PyErr_SetString(PyExc_ValueError, "Void-arrays can only" \
+ "be compared for equality.");
+ return NULL;
+ }
+ if (PyArray_HASFIELDS(self)) {
+ PyObject *res=NULL, *temp, *a, *b;
+ PyObject *key, *value, *temp2;
+ PyObject *op;
+ Py_ssize_t pos=0;
+ op = (cmp_op == Py_EQ ? n_ops.logical_and : n_ops.logical_or);
+ while (PyDict_Next(self->descr->fields, &pos, &key, &value)) {
+ a = PyArray_EnsureAnyArray(array_subscript(self, key));
+ if (a==NULL) {Py_XDECREF(res); return NULL;}
+ b = array_subscript(other, key);
+ if (b==NULL) {Py_XDECREF(res); Py_DECREF(a); return NULL;}
+ temp = array_richcompare((PyArrayObject *)a,b,cmp_op);
+ Py_DECREF(a);
+ Py_DECREF(b);
+ if (temp == NULL) {Py_XDECREF(res); return NULL;}
+ if (res == NULL) {
+ res = temp;
+ }
+ else {
+ temp2 = PyObject_CallFunction(op, "OO", res, temp);
+ Py_DECREF(temp);
+ Py_DECREF(res);
+ if (temp2 == NULL) return NULL;
+ res = temp2;
+ }
}
- else { /* compare as a string */
- /* assumes self and other have same descr->type */
- return _strings_richcompare(self, other, cmp_op, 0);
+ if (res == NULL && !PyErr_Occurred()) {
+ PyErr_SetString(PyExc_ValueError, "No fields found.");
}
+ return res;
+ }
+ else { /* compare as a string */
+ /* assumes self and other have same descr->type */
+ return _strings_richcompare(self, other, cmp_op, 0);
+ }
}
static PyObject *
array_richcompare(PyArrayObject *self, PyObject *other, int cmp_op)
{
- PyObject *array_other, *result = NULL;
- int typenum;
-
- switch (cmp_op)
- {
- case Py_LT:
- result = PyArray_GenericBinaryFunction(self, other,
- n_ops.less);
- break;
- case Py_LE:
- result = PyArray_GenericBinaryFunction(self, other,
- n_ops.less_equal);
- break;
- case Py_EQ:
- if (other == Py_None) {
- Py_INCREF(Py_False);
- return Py_False;
- }
- /* Try to convert other to an array */
- if (!PyArray_Check(other)) {
- typenum = self->descr->type_num;
- if (typenum != PyArray_OBJECT) {
- typenum = PyArray_NOTYPE;
- }
- array_other = PyArray_FromObject(other,
- typenum, 0, 0);
- /* If not successful, then return False
- This fixes code that used to
- allow equality comparisons between arrays
- and other objects which would give a result
- of False
- */
- if ((array_other == NULL) || \
- (array_other == Py_None)) {
- Py_XDECREF(array_other);
- PyErr_Clear();
- Py_INCREF(Py_False);
- return Py_False;
- }
- }
- else {
- Py_INCREF(other);
- array_other = other;
- }
- result = PyArray_GenericBinaryFunction(self,
- array_other,
- n_ops.equal);
- if ((result == Py_NotImplemented) &&
- (self->descr->type_num == PyArray_VOID)) {
- int _res;
- _res = PyObject_RichCompareBool \
- ((PyObject *)self->descr,
- (PyObject *)\
- PyArray_DESCR(array_other),
- Py_EQ);
- if (_res < 0) {
- Py_DECREF(result);
- Py_DECREF(array_other);
- return NULL;
- }
- if (_res) {
- Py_DECREF(result);
- result = _void_compare\
- (self,
- (PyArrayObject *)array_other,
- cmp_op);
- Py_DECREF(array_other);
- }
- return result;
- }
- /* If the comparison results in NULL, then the
- two array objects can not be compared together so
- return zero
- */
- Py_DECREF(array_other);
- if (result == NULL) {
- PyErr_Clear();
- Py_INCREF(Py_False);
- return Py_False;
- }
- break;
- case Py_NE:
- if (other == Py_None) {
- Py_INCREF(Py_True);
- return Py_True;
- }
- /* Try to convert other to an array */
- if (!PyArray_Check(other)) {
- typenum = self->descr->type_num;
- if (typenum != PyArray_OBJECT) {
- typenum = PyArray_NOTYPE;
- }
- array_other = PyArray_FromObject(other,
- typenum, 0, 0);
- /* If not successful, then objects cannot be
- compared and cannot be equal, therefore,
- return True;
- */
- if ((array_other == NULL) || \
- (array_other == Py_None)) {
- Py_XDECREF(array_other);
- PyErr_Clear();
- Py_INCREF(Py_True);
- return Py_True;
- }
- }
- else {
- Py_INCREF(other);
- array_other = other;
- }
- result = PyArray_GenericBinaryFunction(self,
- array_other,
- n_ops.not_equal);
- if ((result == Py_NotImplemented) &&
- (self->descr->type_num == PyArray_VOID)) {
- int _res;
- _res = PyObject_RichCompareBool\
- ((PyObject *)self->descr,
- (PyObject *)\
- PyArray_DESCR(array_other),
- Py_EQ);
- if (_res < 0) {
- Py_DECREF(result);
- Py_DECREF(array_other);
- return NULL;
- }
- if (_res) {
- Py_DECREF(result);
- result = _void_compare\
- (self,
- (PyArrayObject *)array_other,
- cmp_op);
- Py_DECREF(array_other);
- }
- return result;
- }
-
- Py_DECREF(array_other);
- if (result == NULL) {
- PyErr_Clear();
- Py_INCREF(Py_True);
- return Py_True;
- }
- break;
- case Py_GT:
- result = PyArray_GenericBinaryFunction(self, other,
- n_ops.greater);
- break;
- case Py_GE:
- result = PyArray_GenericBinaryFunction(self, other,
- n_ops.greater_equal);
- break;
- default:
- result = Py_NotImplemented;
- Py_INCREF(result);
+ PyObject *array_other, *result = NULL;
+ int typenum;
+
+ switch (cmp_op)
+ {
+ case Py_LT:
+ result = PyArray_GenericBinaryFunction(self, other,
+ n_ops.less);
+ break;
+ case Py_LE:
+ result = PyArray_GenericBinaryFunction(self, other,
+ n_ops.less_equal);
+ break;
+ case Py_EQ:
+ if (other == Py_None) {
+ Py_INCREF(Py_False);
+ return Py_False;
+ }
+ /* Try to convert other to an array */
+ if (!PyArray_Check(other)) {
+ typenum = self->descr->type_num;
+ if (typenum != PyArray_OBJECT) {
+ typenum = PyArray_NOTYPE;
+ }
+ array_other = PyArray_FromObject(other,
+ typenum, 0, 0);
+ /* If not successful, then return False
+ This fixes code that used to
+ allow equality comparisons between arrays
+ and other objects which would give a result
+ of False
+ */
+ if ((array_other == NULL) || \
+ (array_other == Py_None)) {
+ Py_XDECREF(array_other);
+ PyErr_Clear();
+ Py_INCREF(Py_False);
+ return Py_False;
}
- if (result == Py_NotImplemented) {
- /* Try to handle string comparisons */
- if (self->descr->type_num == PyArray_OBJECT) return result;
- array_other = PyArray_FromObject(other,PyArray_NOTYPE, 0, 0);
- if (PyArray_ISSTRING(self) && PyArray_ISSTRING(array_other)) {
- Py_DECREF(result);
- result = _strings_richcompare(self, (PyArrayObject *)
- array_other, cmp_op, 0);
+ }
+ else {
+ Py_INCREF(other);
+ array_other = other;
+ }
+ result = PyArray_GenericBinaryFunction(self,
+ array_other,
+ n_ops.equal);
+ if ((result == Py_NotImplemented) &&
+ (self->descr->type_num == PyArray_VOID)) {
+ int _res;
+ _res = PyObject_RichCompareBool \
+ ((PyObject *)self->descr,
+ (PyObject *)\
+ PyArray_DESCR(array_other),
+ Py_EQ);
+ if (_res < 0) {
+ Py_DECREF(result);
+ Py_DECREF(array_other);
+ return NULL;
+ }
+ if (_res) {
+ Py_DECREF(result);
+ result = _void_compare\
+ (self,
+ (PyArrayObject *)array_other,
+ cmp_op);
+ Py_DECREF(array_other);
+ }
+ return result;
+ }
+ /* If the comparison results in NULL, then the
+ two array objects can not be compared together so
+ return zero
+ */
+ Py_DECREF(array_other);
+ if (result == NULL) {
+ PyErr_Clear();
+ Py_INCREF(Py_False);
+ return Py_False;
+ }
+ break;
+ case Py_NE:
+ if (other == Py_None) {
+ Py_INCREF(Py_True);
+ return Py_True;
+ }
+ /* Try to convert other to an array */
+ if (!PyArray_Check(other)) {
+ typenum = self->descr->type_num;
+ if (typenum != PyArray_OBJECT) {
+ typenum = PyArray_NOTYPE;
+ }
+ array_other = PyArray_FromObject(other,
+ typenum, 0, 0);
+ /* If not successful, then objects cannot be
+ compared and cannot be equal, therefore,
+ return True;
+ */
+ if ((array_other == NULL) || \
+ (array_other == Py_None)) {
+ Py_XDECREF(array_other);
+ PyErr_Clear();
+ Py_INCREF(Py_True);
+ return Py_True;
}
- Py_DECREF(array_other);
- }
- return result;
+ }
+ else {
+ Py_INCREF(other);
+ array_other = other;
+ }
+ result = PyArray_GenericBinaryFunction(self,
+ array_other,
+ n_ops.not_equal);
+ if ((result == Py_NotImplemented) &&
+ (self->descr->type_num == PyArray_VOID)) {
+ int _res;
+ _res = PyObject_RichCompareBool\
+ ((PyObject *)self->descr,
+ (PyObject *)\
+ PyArray_DESCR(array_other),
+ Py_EQ);
+ if (_res < 0) {
+ Py_DECREF(result);
+ Py_DECREF(array_other);
+ return NULL;
+ }
+ if (_res) {
+ Py_DECREF(result);
+ result = _void_compare\
+ (self,
+ (PyArrayObject *)array_other,
+ cmp_op);
+ Py_DECREF(array_other);
+ }
+ return result;
+ }
+
+ Py_DECREF(array_other);
+ if (result == NULL) {
+ PyErr_Clear();
+ Py_INCREF(Py_True);
+ return Py_True;
+ }
+ break;
+ case Py_GT:
+ result = PyArray_GenericBinaryFunction(self, other,
+ n_ops.greater);
+ break;
+ case Py_GE:
+ result = PyArray_GenericBinaryFunction(self, other,
+ n_ops.greater_equal);
+ break;
+ default:
+ result = Py_NotImplemented;
+ Py_INCREF(result);
+ }
+ if (result == Py_NotImplemented) {
+ /* Try to handle string comparisons */
+ if (self->descr->type_num == PyArray_OBJECT) return result;
+ array_other = PyArray_FromObject(other,PyArray_NOTYPE, 0, 0);
+ if (PyArray_ISSTRING(self) && PyArray_ISSTRING(array_other)) {
+ Py_DECREF(result);
+ result = _strings_richcompare(self, (PyArrayObject *)
+ array_other, cmp_op, 0);
+ }
+ Py_DECREF(array_other);
+ }
+ return result;
}
static PyObject *
_check_axis(PyArrayObject *arr, int *axis, int flags)
{
- PyObject *temp1, *temp2;
- int n = arr->nd;
+ PyObject *temp1, *temp2;
+ int n = arr->nd;
- if ((*axis >= MAX_DIMS) || (n==0)) {
- if (n != 1) {
- temp1 = PyArray_Ravel(arr,0);
- if (temp1 == NULL) {*axis=0; return NULL;}
- *axis = PyArray_NDIM(temp1)-1;
- }
- else {
- temp1 = (PyObject *)arr;
- Py_INCREF(temp1);
- *axis = 0;
- }
- if (!flags) return temp1;
- }
- else {
- temp1 = (PyObject *)arr;
- Py_INCREF(temp1);
- }
- if (flags) {
- temp2 = PyArray_CheckFromAny((PyObject *)temp1, NULL,
- 0, 0, flags, NULL);
- Py_DECREF(temp1);
- if (temp2 == NULL) return NULL;
+ if ((*axis >= MAX_DIMS) || (n==0)) {
+ if (n != 1) {
+ temp1 = PyArray_Ravel(arr,0);
+ if (temp1 == NULL) {*axis=0; return NULL;}
+ *axis = PyArray_NDIM(temp1)-1;
}
else {
- temp2 = (PyObject *)temp1;
- }
- n = PyArray_NDIM(temp2);
- if (*axis < 0) *axis += n;
- if ((*axis < 0) || (*axis >= n)) {
- PyErr_Format(PyExc_ValueError,
- "axis(=%d) out of bounds", *axis);
- Py_DECREF(temp2);
- return NULL;
+ temp1 = (PyObject *)arr;
+ Py_INCREF(temp1);
+ *axis = 0;
}
- return temp2;
+ if (!flags) return temp1;
+ }
+ else {
+ temp1 = (PyObject *)arr;
+ Py_INCREF(temp1);
+ }
+ if (flags) {
+ temp2 = PyArray_CheckFromAny((PyObject *)temp1, NULL,
+ 0, 0, flags, NULL);
+ Py_DECREF(temp1);
+ if (temp2 == NULL) return NULL;
+ }
+ else {
+ temp2 = (PyObject *)temp1;
+ }
+ n = PyArray_NDIM(temp2);
+ if (*axis < 0) *axis += n;
+ if ((*axis < 0) || (*axis >= n)) {
+ PyErr_Format(PyExc_ValueError,
+ "axis(=%d) out of bounds", *axis);
+ Py_DECREF(temp2);
+ return NULL;
+ }
+ return temp2;
}
#include "arraymethods.c"
/* Lifted from numarray */
/*MULTIARRAY_API
- PyArray_IntTupleFromIntp
+ PyArray_IntTupleFromIntp
*/
static PyObject *
PyArray_IntTupleFromIntp(int len, intp *vals)
{
- int i;
- PyObject *intTuple = PyTuple_New(len);
- if (!intTuple) goto fail;
- for(i=0; i<len; i++) {
+ int i;
+ PyObject *intTuple = PyTuple_New(len);
+ if (!intTuple) goto fail;
+ for(i=0; i<len; i++) {
#if SIZEOF_INTP <= SIZEOF_LONG
- PyObject *o = PyInt_FromLong((long) vals[i]);
+ PyObject *o = PyInt_FromLong((long) vals[i]);
#else
- PyObject *o = PyLong_FromLongLong((longlong) vals[i]);
+ PyObject *o = PyLong_FromLongLong((longlong) vals[i]);
#endif
- if (!o) {
- Py_DECREF(intTuple);
- intTuple = NULL;
- goto fail;
- }
- PyTuple_SET_ITEM(intTuple, i, o);
+ if (!o) {
+ Py_DECREF(intTuple);
+ intTuple = NULL;
+ goto fail;
}
- fail:
- return intTuple;
+ PyTuple_SET_ITEM(intTuple, i, o);
+ }
+ fail:
+ return intTuple;
}
/* Returns the number of dimensions or -1 if an error occurred */
/* vals must be large enough to hold maxvals */
/*MULTIARRAY_API
- PyArray_IntpFromSequence
+ PyArray_IntpFromSequence
*/
static int
PyArray_IntpFromSequence(PyObject *seq, intp *vals, int maxvals)
{
- int nd, i;
- PyObject *op;
+ int nd, i;
+ PyObject *op;
- /* Check to see if sequence is a single integer first.
- or, can be made into one */
- if ((nd=PySequence_Length(seq)) == -1) {
- if (PyErr_Occurred()) PyErr_Clear();
+ /* Check to see if sequence is a single integer first.
+ or, can be made into one */
+ if ((nd=PySequence_Length(seq)) == -1) {
+ if (PyErr_Occurred()) PyErr_Clear();
#if SIZEOF_LONG >= SIZEOF_INTP
- if (!(op = PyNumber_Int(seq))) return -1;
+ if (!(op = PyNumber_Int(seq))) return -1;
#else
- if (!(op = PyNumber_Long(seq))) return -1;
+ if (!(op = PyNumber_Long(seq))) return -1;
#endif
- nd = 1;
+ nd = 1;
#if SIZEOF_LONG >= SIZEOF_INTP
- vals[0] = (intp ) PyInt_AsLong(op);
+ vals[0] = (intp ) PyInt_AsLong(op);
#else
- vals[0] = (intp ) PyLong_AsLongLong(op);
+ vals[0] = (intp ) PyLong_AsLongLong(op);
#endif
- Py_DECREF(op);
- } else {
- for(i=0; i < MIN(nd,maxvals); i++) {
- op = PySequence_GetItem(seq, i);
- if (op == NULL) return -1;
+ Py_DECREF(op);
+ } else {
+ for(i=0; i < MIN(nd,maxvals); i++) {
+ op = PySequence_GetItem(seq, i);
+ if (op == NULL) return -1;
#if SIZEOF_LONG >= SIZEOF_INTP
- vals[i]=(intp )PyInt_AsLong(op);
+ vals[i]=(intp )PyInt_AsLong(op);
#else
- vals[i]=(intp )PyLong_AsLongLong(op);
+ vals[i]=(intp )PyLong_AsLongLong(op);
#endif
- Py_DECREF(op);
- if(PyErr_Occurred()) return -1;
- }
+ Py_DECREF(op);
+ if(PyErr_Occurred()) return -1;
}
- return nd;
+ }
+ return nd;
}
@@ -4961,22 +4960,22 @@ PyArray_IntpFromSequence(PyObject *seq, intp *vals, int maxvals)
static int
_IsContiguous(PyArrayObject *ap)
{
- register intp sd;
- register intp dim;
- register int i;
-
- if (ap->nd == 0) return 1;
- sd = ap->descr->elsize;
- if (ap->nd == 1) return (ap->dimensions[0] == 1 || \
- sd == ap->strides[0]);
- for (i = ap->nd-1; i >= 0; --i) {
- dim = ap->dimensions[i];
- /* contiguous by definition */
- if (dim == 0) return 1;
- if (ap->strides[i] != sd) return 0;
- sd *= dim;
- }
- return 1;
+ register intp sd;
+ register intp dim;
+ register int i;
+
+ if (ap->nd == 0) return 1;
+ sd = ap->descr->elsize;
+ if (ap->nd == 1) return (ap->dimensions[0] == 1 || \
+ sd == ap->strides[0]);
+ for (i = ap->nd-1; i >= 0; --i) {
+ dim = ap->dimensions[i];
+ /* contiguous by definition */
+ if (dim == 0) return 1;
+ if (ap->strides[i] != sd) return 0;
+ sd *= dim;
+ }
+ return 1;
}
@@ -4984,78 +4983,78 @@ _IsContiguous(PyArrayObject *ap)
static int
_IsFortranContiguous(PyArrayObject *ap)
{
- register intp sd;
- register intp dim;
- register int i;
-
- if (ap->nd == 0) return 1;
- sd = ap->descr->elsize;
- if (ap->nd == 1) return (ap->dimensions[0] == 1 || \
- sd == ap->strides[0]);
- for (i=0; i< ap->nd; ++i) {
- dim = ap->dimensions[i];
- /* fortran contiguous by definition */
- if (dim == 0) return 1;
- if (ap->strides[i] != sd) return 0;
- sd *= dim;
- }
- return 1;
+ register intp sd;
+ register intp dim;
+ register int i;
+
+ if (ap->nd == 0) return 1;
+ sd = ap->descr->elsize;
+ if (ap->nd == 1) return (ap->dimensions[0] == 1 || \
+ sd == ap->strides[0]);
+ for (i=0; i< ap->nd; ++i) {
+ dim = ap->dimensions[i];
+ /* fortran contiguous by definition */
+ if (dim == 0) return 1;
+ if (ap->strides[i] != sd) return 0;
+ sd *= dim;
+ }
+ return 1;
}
static int
_IsAligned(PyArrayObject *ap)
{
- int i, alignment, aligned=1;
- intp ptr;
- int type = ap->descr->type_num;
+ int i, alignment, aligned=1;
+ intp ptr;
+ int type = ap->descr->type_num;
- if ((type == PyArray_STRING) || (type == PyArray_VOID))
- return 1;
+ if ((type == PyArray_STRING) || (type == PyArray_VOID))
+ return 1;
- alignment = ap->descr->alignment;
- if (alignment == 1) return 1;
+ alignment = ap->descr->alignment;
+ if (alignment == 1) return 1;
- ptr = (intp) ap->data;
- aligned = (ptr % alignment) == 0;
- for (i=0; i <ap->nd; i++)
- aligned &= ((ap->strides[i] % alignment) == 0);
- return aligned != 0;
+ ptr = (intp) ap->data;
+ aligned = (ptr % alignment) == 0;
+ for (i=0; i <ap->nd; i++)
+ aligned &= ((ap->strides[i] % alignment) == 0);
+ return aligned != 0;
}
static Bool
_IsWriteable(PyArrayObject *ap)
{
- PyObject *base=ap->base;
- void *dummy;
- Py_ssize_t n;
-
- /* If we own our own data, then no-problem */
- if ((base == NULL) || (ap->flags & OWNDATA)) return TRUE;
-
- /* Get to the final base object
- If it is a writeable array, then return TRUE
- If we can find an array object
- or a writeable buffer object as the final base object
- or a string object (for pickling support memory savings).
- - this last could be removed if a proper pickleable
- buffer was added to Python.
- */
-
- while(PyArray_Check(base)) {
- if (PyArray_CHKFLAGS(base, OWNDATA))
- return (Bool) (PyArray_ISWRITEABLE(base));
- base = PyArray_BASE(base);
- }
+ PyObject *base=ap->base;
+ void *dummy;
+ Py_ssize_t n;
+
+ /* If we own our own data, then no-problem */
+ if ((base == NULL) || (ap->flags & OWNDATA)) return TRUE;
+
+ /* Get to the final base object
+ If it is a writeable array, then return TRUE
+ If we can find an array object
+ or a writeable buffer object as the final base object
+ or a string object (for pickling support memory savings).
+ - this last could be removed if a proper pickleable
+ buffer was added to Python.
+ */
+
+ while(PyArray_Check(base)) {
+ if (PyArray_CHKFLAGS(base, OWNDATA))
+ return (Bool) (PyArray_ISWRITEABLE(base));
+ base = PyArray_BASE(base);
+ }
- /* here so pickle support works seamlessly
- and unpickled array can be set and reset writeable
- -- could be abused -- */
- if PyString_Check(base) return TRUE;
+ /* here so pickle support works seamlessly
+ and unpickled array can be set and reset writeable
+ -- could be abused -- */
+ if PyString_Check(base) return TRUE;
- if (PyObject_AsWriteBuffer(base, &dummy, &n) < 0)
- return FALSE;
+ if (PyObject_AsWriteBuffer(base, &dummy, &n) < 0)
+ return FALSE;
- return TRUE;
+ return TRUE;
}
@@ -5064,49 +5063,49 @@ _IsWriteable(PyArrayObject *ap)
static int
PyArray_ElementStrides(PyObject *arr)
{
- register int itemsize = PyArray_ITEMSIZE(arr);
- register int i, N=PyArray_NDIM(arr);
- register intp *strides = PyArray_STRIDES(arr);
+ register int itemsize = PyArray_ITEMSIZE(arr);
+ register int i, N=PyArray_NDIM(arr);
+ register intp *strides = PyArray_STRIDES(arr);
- for (i=0; i<N; i++) {
- if ((strides[i] % itemsize) != 0) return 0;
- }
+ for (i=0; i<N; i++) {
+ if ((strides[i] % itemsize) != 0) return 0;
+ }
- return 1;
+ return 1;
}
/*OBJECT_API
- Update Several Flags at once.
+ Update Several Flags at once.
*/
static void
PyArray_UpdateFlags(PyArrayObject *ret, int flagmask)
{
- if (flagmask & FORTRAN) {
- if (_IsFortranContiguous(ret)) {
- ret->flags |= FORTRAN;
- if (ret->nd > 1) ret->flags &= ~CONTIGUOUS;
- }
- else ret->flags &= ~FORTRAN;
- }
- if (flagmask & CONTIGUOUS) {
- if (_IsContiguous(ret)) {
- ret->flags |= CONTIGUOUS;
- if (ret->nd > 1) ret->flags &= ~FORTRAN;
- }
- else ret->flags &= ~CONTIGUOUS;
- }
- if (flagmask & ALIGNED) {
- if (_IsAligned(ret)) ret->flags |= ALIGNED;
- else ret->flags &= ~ALIGNED;
+ if (flagmask & FORTRAN) {
+ if (_IsFortranContiguous(ret)) {
+ ret->flags |= FORTRAN;
+ if (ret->nd > 1) ret->flags &= ~CONTIGUOUS;
}
- /* This is not checked by default WRITEABLE is not
- part of UPDATE_ALL */
- if (flagmask & WRITEABLE) {
- if (_IsWriteable(ret)) ret->flags |= WRITEABLE;
- else ret->flags &= ~WRITEABLE;
+ else ret->flags &= ~FORTRAN;
+ }
+ if (flagmask & CONTIGUOUS) {
+ if (_IsContiguous(ret)) {
+ ret->flags |= CONTIGUOUS;
+ if (ret->nd > 1) ret->flags &= ~FORTRAN;
}
- return;
+ else ret->flags &= ~CONTIGUOUS;
+ }
+ if (flagmask & ALIGNED) {
+ if (_IsAligned(ret)) ret->flags |= ALIGNED;
+ else ret->flags &= ~ALIGNED;
+ }
+ /* This is not checked by default WRITEABLE is not
+ part of UPDATE_ALL */
+ if (flagmask & WRITEABLE) {
+ if (_IsWriteable(ret)) ret->flags |= WRITEABLE;
+ else ret->flags &= ~WRITEABLE;
+ }
+ return;
}
/* This routine checks to see if newstrides (of length nd) will not
@@ -5130,22 +5129,22 @@ static Bool
PyArray_CheckStrides(int elsize, int nd, intp numbytes, intp offset,
intp *dims, intp *newstrides)
{
- int i;
- intp byte_begin;
- intp begin;
- intp end;
+ int i;
+ intp byte_begin;
+ intp begin;
+ intp end;
- if (numbytes == 0)
- numbytes = PyArray_MultiplyList(dims, nd) * elsize;
+ if (numbytes == 0)
+ numbytes = PyArray_MultiplyList(dims, nd) * elsize;
- begin = -offset;
- end = numbytes - offset - elsize;
- for (i=0; i<nd; i++) {
- byte_begin = newstrides[i]*(dims[i]-1);
- if ((byte_begin < begin) || (byte_begin > end))
- return FALSE;
- }
- return TRUE;
+ begin = -offset;
+ end = numbytes - offset - elsize;
+ for (i=0; i<nd; i++) {
+ byte_begin = newstrides[i]*(dims[i]-1);
+ if ((byte_begin < begin) || (byte_begin > end))
+ return FALSE;
+ }
+ return TRUE;
}
@@ -5170,55 +5169,55 @@ static size_t
_array_fill_strides(intp *strides, intp *dims, int nd, size_t itemsize,
int inflag, int *objflags)
{
- int i;
- /* Only make Fortran strides if not contiguous as well */
- if ((inflag & FORTRAN) && !(inflag & CONTIGUOUS)) {
- for (i=0; i<nd; i++) {
- strides[i] = itemsize;
- itemsize *= dims[i] ? dims[i] : 1;
- }
- *objflags |= FORTRAN;
- if (nd > 1) *objflags &= ~CONTIGUOUS;
- else *objflags |= CONTIGUOUS;
- }
- else {
- for (i=nd-1;i>=0;i--) {
- strides[i] = itemsize;
- itemsize *= dims[i] ? dims[i] : 1;
- }
- *objflags |= CONTIGUOUS;
- if (nd > 1) *objflags &= ~FORTRAN;
- else *objflags |= FORTRAN;
+ int i;
+ /* Only make Fortran strides if not contiguous as well */
+ if ((inflag & FORTRAN) && !(inflag & CONTIGUOUS)) {
+ for (i=0; i<nd; i++) {
+ strides[i] = itemsize;
+ itemsize *= dims[i] ? dims[i] : 1;
}
- return itemsize;
+ *objflags |= FORTRAN;
+ if (nd > 1) *objflags &= ~CONTIGUOUS;
+ else *objflags |= CONTIGUOUS;
+ }
+ else {
+ for (i=nd-1;i>=0;i--) {
+ strides[i] = itemsize;
+ itemsize *= dims[i] ? dims[i] : 1;
+ }
+ *objflags |= CONTIGUOUS;
+ if (nd > 1) *objflags &= ~FORTRAN;
+ else *objflags |= FORTRAN;
+ }
+ return itemsize;
}
/*OBJECT_API
- Generic new array creation routine.
+ Generic new array creation routine.
*/
static PyObject *
PyArray_New(PyTypeObject *subtype, int nd, intp *dims, int type_num,
intp *strides, void *data, int itemsize, int flags,
PyObject *obj)
{
- PyArray_Descr *descr;
- PyObject *new;
+ PyArray_Descr *descr;
+ PyObject *new;
- descr = PyArray_DescrFromType(type_num);
- if (descr == NULL) return NULL;
- if (descr->elsize == 0) {
- if (itemsize < 1) {
- PyErr_SetString(PyExc_ValueError,
- "data type must provide an itemsize");
- Py_DECREF(descr);
- return NULL;
- }
- PyArray_DESCR_REPLACE(descr);
- descr->elsize = itemsize;
+ descr = PyArray_DescrFromType(type_num);
+ if (descr == NULL) return NULL;
+ if (descr->elsize == 0) {
+ if (itemsize < 1) {
+ PyErr_SetString(PyExc_ValueError,
+ "data type must provide an itemsize");
+ Py_DECREF(descr);
+ return NULL;
}
- new = PyArray_NewFromDescr(subtype, descr, nd, dims, strides,
- data, flags, obj);
- return new;
+ PyArray_DESCR_REPLACE(descr);
+ descr->elsize = itemsize;
+ }
+ new = PyArray_NewFromDescr(subtype, descr, nd, dims, strides,
+ data, flags, obj);
+ return new;
}
/* Change a sub-array field to the base descriptor */
@@ -5233,462 +5232,462 @@ static int
_update_descr_and_dimensions(PyArray_Descr **des, intp *newdims,
intp *newstrides, int oldnd, int isfortran)
{
- PyArray_Descr *old;
- int newnd;
- int numnew;
- intp *mydim;
- int i;
- int tuple;
+ PyArray_Descr *old;
+ int newnd;
+ int numnew;
+ intp *mydim;
+ int i;
+ int tuple;
- old = *des;
- *des = old->subarray->base;
+ old = *des;
+ *des = old->subarray->base;
- mydim = newdims + oldnd;
- tuple = PyTuple_Check(old->subarray->shape);
- if (tuple) {
- numnew = PyTuple_GET_SIZE(old->subarray->shape);
- }
- else {
- numnew = 1;
- }
+ mydim = newdims + oldnd;
+ tuple = PyTuple_Check(old->subarray->shape);
+ if (tuple) {
+ numnew = PyTuple_GET_SIZE(old->subarray->shape);
+ }
+ else {
+ numnew = 1;
+ }
- newnd = oldnd + numnew;
- if (newnd > MAX_DIMS) goto finish;
- if (isfortran) {
- memmove(newdims+numnew, newdims, oldnd*sizeof(intp));
- mydim = newdims;
- }
+ newnd = oldnd + numnew;
+ if (newnd > MAX_DIMS) goto finish;
+ if (isfortran) {
+ memmove(newdims+numnew, newdims, oldnd*sizeof(intp));
+ mydim = newdims;
+ }
- if (tuple) {
- for (i=0; i<numnew; i++) {
- mydim[i] = (intp) PyInt_AsLong \
- (PyTuple_GET_ITEM(old->subarray->shape, i));
- }
- }
- else {
- mydim[0] = (intp) PyInt_AsLong(old->subarray->shape);
+ if (tuple) {
+ for (i=0; i<numnew; i++) {
+ mydim[i] = (intp) PyInt_AsLong \
+ (PyTuple_GET_ITEM(old->subarray->shape, i));
}
+ }
+ else {
+ mydim[0] = (intp) PyInt_AsLong(old->subarray->shape);
+ }
- if (newstrides) {
- intp tempsize;
- intp *mystrides;
- mystrides = newstrides + oldnd;
- if (isfortran) {
- memmove(newstrides+numnew, newstrides,
- oldnd*sizeof(intp));
- mystrides = newstrides;
- }
- /* Make new strides -- alwasy C-contiguous */
- tempsize = (*des)->elsize;
- for (i=numnew-1; i>=0; i--) {
- mystrides[i] = tempsize;
- tempsize *= mydim[i] ? mydim[i] : 1;
- }
+ if (newstrides) {
+ intp tempsize;
+ intp *mystrides;
+ mystrides = newstrides + oldnd;
+ if (isfortran) {
+ memmove(newstrides+numnew, newstrides,
+ oldnd*sizeof(intp));
+ mystrides = newstrides;
+ }
+ /* Make new strides -- alwasy C-contiguous */
+ tempsize = (*des)->elsize;
+ for (i=numnew-1; i>=0; i--) {
+ mystrides[i] = tempsize;
+ tempsize *= mydim[i] ? mydim[i] : 1;
}
+ }
finish:
- Py_INCREF(*des);
- Py_DECREF(old);
- return newnd;
+ Py_INCREF(*des);
+ Py_DECREF(old);
+ return newnd;
}
/* steals a reference to descr (even on failure) */
/*OBJECT_API
- Generic new array creation routine.
+ Generic new array creation routine.
*/
static PyObject *
PyArray_NewFromDescr(PyTypeObject *subtype, PyArray_Descr *descr, int nd,
intp *dims, intp *strides, void *data,
int flags, PyObject *obj)
{
- PyArrayObject *self;
- register int i;
- size_t sd;
- intp largest;
- intp size;
-
- if (descr->subarray) {
- PyObject *ret;
- intp newdims[2*MAX_DIMS];
- intp *newstrides=NULL;
- int isfortran=0;
- isfortran = (data && (flags & FORTRAN) && !(flags & CONTIGUOUS)) || \
- (!data && flags);
- memcpy(newdims, dims, nd*sizeof(intp));
- if (strides) {
- newstrides = newdims + MAX_DIMS;
- memcpy(newstrides, strides, nd*sizeof(intp));
- }
- nd =_update_descr_and_dimensions(&descr, newdims,
- newstrides, nd, isfortran);
- ret = PyArray_NewFromDescr(subtype, descr, nd, newdims,
- newstrides,
- data, flags, obj);
- return ret;
- }
+ PyArrayObject *self;
+ register int i;
+ size_t sd;
+ intp largest;
+ intp size;
- if (nd < 0) {
- PyErr_SetString(PyExc_ValueError,
- "number of dimensions must be >=0");
- Py_DECREF(descr);
- return NULL;
- }
- if (nd > MAX_DIMS) {
- PyErr_Format(PyExc_ValueError,
- "maximum number of dimensions is %d", MAX_DIMS);
- Py_DECREF(descr);
- return NULL;
- }
+ if (descr->subarray) {
+ PyObject *ret;
+ intp newdims[2*MAX_DIMS];
+ intp *newstrides=NULL;
+ int isfortran=0;
+ isfortran = (data && (flags & FORTRAN) && !(flags & CONTIGUOUS)) || \
+ (!data && flags);
+ memcpy(newdims, dims, nd*sizeof(intp));
+ if (strides) {
+ newstrides = newdims + MAX_DIMS;
+ memcpy(newstrides, strides, nd*sizeof(intp));
+ }
+ nd =_update_descr_and_dimensions(&descr, newdims,
+ newstrides, nd, isfortran);
+ ret = PyArray_NewFromDescr(subtype, descr, nd, newdims,
+ newstrides,
+ data, flags, obj);
+ return ret;
+ }
- /* Check dimensions */
- size = 1;
- sd = (size_t) descr->elsize;
- if (sd == 0) {
- if (!PyDataType_ISSTRING(descr)) {
- PyErr_SetString(PyExc_ValueError, "Empty data-type");
- Py_DECREF(descr);
- return NULL;
- }
- PyArray_DESCR_REPLACE(descr);
- if (descr->type_num == NPY_STRING) descr->elsize = 1;
- else descr->elsize = sizeof(PyArray_UCS4);
- sd = (size_t) descr->elsize;
- }
- largest = MAX_INTP / sd;
- for (i=0;i<nd;i++) {
- if (dims[i] == 0) continue;
- if (dims[i] < 0) {
- PyErr_SetString(PyExc_ValueError,
- "negative dimensions " \
- "are not allowed");
- Py_DECREF(descr);
- return NULL;
- }
- size *= dims[i];
- if (size > largest) {
- PyErr_SetString(PyExc_ValueError,
- "dimensions too large.");
- Py_DECREF(descr);
- return NULL;
- }
- }
+ if (nd < 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "number of dimensions must be >=0");
+ Py_DECREF(descr);
+ return NULL;
+ }
+ if (nd > MAX_DIMS) {
+ PyErr_Format(PyExc_ValueError,
+ "maximum number of dimensions is %d", MAX_DIMS);
+ Py_DECREF(descr);
+ return NULL;
+ }
- self = (PyArrayObject *) subtype->tp_alloc(subtype, 0);
- if (self == NULL) {
- Py_DECREF(descr);
- return NULL;
+ /* Check dimensions */
+ size = 1;
+ sd = (size_t) descr->elsize;
+ if (sd == 0) {
+ if (!PyDataType_ISSTRING(descr)) {
+ PyErr_SetString(PyExc_ValueError, "Empty data-type");
+ Py_DECREF(descr);
+ return NULL;
}
- self->nd = nd;
- self->dimensions = NULL;
- self->data = NULL;
- if (data == NULL) {
- self->flags = DEFAULT;
- if (flags) {
- self->flags |= FORTRAN;
- if (nd > 1) self->flags &= ~CONTIGUOUS;
- flags = FORTRAN;
- }
+ PyArray_DESCR_REPLACE(descr);
+ if (descr->type_num == NPY_STRING) descr->elsize = 1;
+ else descr->elsize = sizeof(PyArray_UCS4);
+ sd = (size_t) descr->elsize;
+ }
+ largest = MAX_INTP / sd;
+ for (i=0;i<nd;i++) {
+ if (dims[i] == 0) continue;
+ if (dims[i] < 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "negative dimensions " \
+ "are not allowed");
+ Py_DECREF(descr);
+ return NULL;
}
- else self->flags = (flags & ~UPDATEIFCOPY);
-
- self->descr = descr;
- self->base = (PyObject *)NULL;
- self->weakreflist = (PyObject *)NULL;
-
- if (nd > 0) {
- self->dimensions = PyDimMem_NEW(2*nd);
- if (self->dimensions == NULL) {
- PyErr_NoMemory();
- goto fail;
- }
- self->strides = self->dimensions + nd;
- memcpy(self->dimensions, dims, sizeof(intp)*nd);
- if (strides == NULL) { /* fill it in */
- sd = _array_fill_strides(self->strides, dims, nd, sd,
- flags, &(self->flags));
- }
- else { /* we allow strides even when we create
- the memory, but be careful with this...
- */
- memcpy(self->strides, strides, sizeof(intp)*nd);
- sd *= size;
- }
+ size *= dims[i];
+ if (size > largest) {
+ PyErr_SetString(PyExc_ValueError,
+ "dimensions too large.");
+ Py_DECREF(descr);
+ return NULL;
}
- else { self->dimensions = self->strides = NULL; }
+ }
- if (data == NULL) {
+ self = (PyArrayObject *) subtype->tp_alloc(subtype, 0);
+ if (self == NULL) {
+ Py_DECREF(descr);
+ return NULL;
+ }
+ self->nd = nd;
+ self->dimensions = NULL;
+ self->data = NULL;
+ if (data == NULL) {
+ self->flags = DEFAULT;
+ if (flags) {
+ self->flags |= FORTRAN;
+ if (nd > 1) self->flags &= ~CONTIGUOUS;
+ flags = FORTRAN;
+ }
+ }
+ else self->flags = (flags & ~UPDATEIFCOPY);
+
+ self->descr = descr;
+ self->base = (PyObject *)NULL;
+ self->weakreflist = (PyObject *)NULL;
+
+ if (nd > 0) {
+ self->dimensions = PyDimMem_NEW(2*nd);
+ if (self->dimensions == NULL) {
+ PyErr_NoMemory();
+ goto fail;
+ }
+ self->strides = self->dimensions + nd;
+ memcpy(self->dimensions, dims, sizeof(intp)*nd);
+ if (strides == NULL) { /* fill it in */
+ sd = _array_fill_strides(self->strides, dims, nd, sd,
+ flags, &(self->flags));
+ }
+ else { /* we allow strides even when we create
+ the memory, but be careful with this...
+ */
+ memcpy(self->strides, strides, sizeof(intp)*nd);
+ sd *= size;
+ }
+ }
+ else { self->dimensions = self->strides = NULL; }
- /* Allocate something even for zero-space arrays
- e.g. shape=(0,) -- otherwise buffer exposure
- (a.data) doesn't work as it should. */
+ if (data == NULL) {
- if (sd==0) sd = descr->elsize;
+ /* Allocate something even for zero-space arrays
+ e.g. shape=(0,) -- otherwise buffer exposure
+ (a.data) doesn't work as it should. */
- if ((data = PyDataMem_NEW(sd))==NULL) {
- PyErr_NoMemory();
- goto fail;
- }
- self->flags |= OWNDATA;
+ if (sd==0) sd = descr->elsize;
- /* It is bad to have unitialized OBJECT pointers */
- /* which could also be sub-fields of a VOID array */
- if (PyDataType_FLAGCHK(descr, NPY_NEEDS_INIT)) {
- memset(data, 0, sd);
- }
+ if ((data = PyDataMem_NEW(sd))==NULL) {
+ PyErr_NoMemory();
+ goto fail;
}
- else {
- self->flags &= ~OWNDATA; /* If data is passed in,
- this object won't own it
- by default.
- Caller must arrange for
- this to be reset if truly
- desired */
- }
- self->data = data;
-
- /* call the __array_finalize__
- method if a subtype.
- If obj is NULL, then call method with Py_None
- */
- if ((subtype != &PyArray_Type)) {
- PyObject *res, *func, *args;
- static PyObject *str=NULL;
+ self->flags |= OWNDATA;
- if (str == NULL) {
- str = PyString_InternFromString("__array_finalize__");
- }
- func = PyObject_GetAttr((PyObject *)self, str);
- if (func && func != Py_None) {
- if (strides != NULL) { /* did not allocate own data
- or funny strides */
- /* update flags before finalize function */
- PyArray_UpdateFlags(self, UPDATE_ALL);
- }
- if PyCObject_Check(func) { /* A C-function is stored here */
- PyArray_FinalizeFunc *cfunc;
- cfunc = PyCObject_AsVoidPtr(func);
- Py_DECREF(func);
- if (cfunc(self, obj) < 0) goto fail;
- }
- else {
- args = PyTuple_New(1);
- if (obj == NULL) obj=Py_None;
- Py_INCREF(obj);
- PyTuple_SET_ITEM(args, 0, obj);
- res = PyObject_Call(func, args, NULL);
- Py_DECREF(args);
- Py_DECREF(func);
- if (res == NULL) goto fail;
- else Py_DECREF(res);
- }
+ /* It is bad to have unitialized OBJECT pointers */
+ /* which could also be sub-fields of a VOID array */
+ if (PyDataType_FLAGCHK(descr, NPY_NEEDS_INIT)) {
+ memset(data, 0, sd);
+ }
+ }
+ else {
+ self->flags &= ~OWNDATA; /* If data is passed in,
+ this object won't own it
+ by default.
+ Caller must arrange for
+ this to be reset if truly
+ desired */
+ }
+ self->data = data;
+
+ /* call the __array_finalize__
+ method if a subtype.
+ If obj is NULL, then call method with Py_None
+ */
+ if ((subtype != &PyArray_Type)) {
+ PyObject *res, *func, *args;
+ static PyObject *str=NULL;
+
+ if (str == NULL) {
+ str = PyString_InternFromString("__array_finalize__");
+ }
+ func = PyObject_GetAttr((PyObject *)self, str);
+ if (func && func != Py_None) {
+ if (strides != NULL) { /* did not allocate own data
+ or funny strides */
+ /* update flags before finalize function */
+ PyArray_UpdateFlags(self, UPDATE_ALL);
+ }
+ if PyCObject_Check(func) { /* A C-function is stored here */
+ PyArray_FinalizeFunc *cfunc;
+ cfunc = PyCObject_AsVoidPtr(func);
+ Py_DECREF(func);
+ if (cfunc(self, obj) < 0) goto fail;
}
- else Py_XDECREF(func);
+ else {
+ args = PyTuple_New(1);
+ if (obj == NULL) obj=Py_None;
+ Py_INCREF(obj);
+ PyTuple_SET_ITEM(args, 0, obj);
+ res = PyObject_Call(func, args, NULL);
+ Py_DECREF(args);
+ Py_DECREF(func);
+ if (res == NULL) goto fail;
+ else Py_DECREF(res);
+ }
}
+ else Py_XDECREF(func);
+ }
- return (PyObject *)self;
+ return (PyObject *)self;
fail:
- Py_DECREF(self);
- return NULL;
+ Py_DECREF(self);
+ return NULL;
}
static void
_putzero(char *optr, PyObject *zero, PyArray_Descr *dtype)
{
- if (!PyDataType_FLAGCHK(dtype, NPY_ITEM_REFCOUNT)) {
- memset(optr, 0, dtype->elsize);
- }
- else if (PyDescr_HASFIELDS(dtype)) {
- PyObject *key, *value, *title=NULL;
- PyArray_Descr *new;
- int offset;
- Py_ssize_t pos=0;
- while (PyDict_Next(dtype->fields, &pos, &key, &value)) {
- if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset,
- &title)) return;
- _putzero(optr + offset, zero, new);
- }
- }
- else {
- PyObject **temp;
- Py_INCREF(zero);
- temp = (PyObject **)optr;
- *temp = zero;
+ if (!PyDataType_FLAGCHK(dtype, NPY_ITEM_REFCOUNT)) {
+ memset(optr, 0, dtype->elsize);
+ }
+ else if (PyDescr_HASFIELDS(dtype)) {
+ PyObject *key, *value, *title=NULL;
+ PyArray_Descr *new;
+ int offset;
+ Py_ssize_t pos=0;
+ while (PyDict_Next(dtype->fields, &pos, &key, &value)) {
+ if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset,
+ &title)) return;
+ _putzero(optr + offset, zero, new);
}
- return;
+ }
+ else {
+ PyObject **temp;
+ Py_INCREF(zero);
+ temp = (PyObject **)optr;
+ *temp = zero;
+ }
+ return;
}
/*OBJECT_API
- Resize (reallocate data). Only works if nothing else is referencing
- this array and it is contiguous.
- If refcheck is 0, then the reference count is not checked
- and assumed to be 1.
- You still must own this data and have no weak-references and no base
- object.
+ Resize (reallocate data). Only works if nothing else is referencing
+ this array and it is contiguous.
+ If refcheck is 0, then the reference count is not checked
+ and assumed to be 1.
+ You still must own this data and have no weak-references and no base
+ object.
*/
static PyObject *
PyArray_Resize(PyArrayObject *self, PyArray_Dims *newshape, int refcheck,
NPY_ORDER fortran)
{
- intp oldsize, newsize;
- int new_nd=newshape->len, k, n, elsize;
- int refcnt;
- intp* new_dimensions=newshape->ptr;
- intp new_strides[MAX_DIMS];
- size_t sd;
- intp *dimptr;
- char *new_data;
- intp largest;
-
- if (!PyArray_ISONESEGMENT(self)) {
- PyErr_SetString(PyExc_ValueError,
- "resize only works on single-segment arrays");
- return NULL;
- }
+ intp oldsize, newsize;
+ int new_nd=newshape->len, k, n, elsize;
+ int refcnt;
+ intp* new_dimensions=newshape->ptr;
+ intp new_strides[MAX_DIMS];
+ size_t sd;
+ intp *dimptr;
+ char *new_data;
+ intp largest;
+
+ if (!PyArray_ISONESEGMENT(self)) {
+ PyErr_SetString(PyExc_ValueError,
+ "resize only works on single-segment arrays");
+ return NULL;
+ }
- if (fortran == PyArray_ANYORDER)
- fortran = PyArray_CORDER;
+ if (fortran == PyArray_ANYORDER)
+ fortran = PyArray_CORDER;
- if (self->descr->elsize == 0) {
- PyErr_SetString(PyExc_ValueError, "Bad data-type size.");
- return NULL;
+ if (self->descr->elsize == 0) {
+ PyErr_SetString(PyExc_ValueError, "Bad data-type size.");
+ return NULL;
+ }
+ newsize = 1;
+ largest = MAX_INTP / self->descr->elsize;
+ for (k=0; k<new_nd; k++) {
+ if (new_dimensions[k]==0) break;
+ if (new_dimensions[k] < 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "negative dimensions not allowed");
+ return NULL;
}
- newsize = 1;
- largest = MAX_INTP / self->descr->elsize;
- for (k=0; k<new_nd; k++) {
- if (new_dimensions[k]==0) break;
- if (new_dimensions[k] < 0) {
- PyErr_SetString(PyExc_ValueError,
- "negative dimensions not allowed");
- return NULL;
- }
- newsize *= new_dimensions[k];
- if (newsize <=0 || newsize > largest) {
- return PyErr_NoMemory();
- }
+ newsize *= new_dimensions[k];
+ if (newsize <=0 || newsize > largest) {
+ return PyErr_NoMemory();
}
- oldsize = PyArray_SIZE(self);
+ }
+ oldsize = PyArray_SIZE(self);
- if (oldsize != newsize) {
- if (!(self->flags & OWNDATA)) {
- PyErr_SetString(PyExc_ValueError,
- "cannot resize this array: " \
- "it does not own its data");
- return NULL;
- }
+ if (oldsize != newsize) {
+ if (!(self->flags & OWNDATA)) {
+ PyErr_SetString(PyExc_ValueError,
+ "cannot resize this array: " \
+ "it does not own its data");
+ return NULL;
+ }
- if (refcheck) refcnt = REFCOUNT(self);
- else refcnt = 1;
- if ((refcnt > 2) || (self->base != NULL) || \
- (self->weakreflist != NULL)) {
- PyErr_SetString(PyExc_ValueError,
- "cannot resize an array that has "\
- "been referenced or is referencing\n"\
- "another array in this way. Use the "\
- "resize function");
- return NULL;
- }
+ if (refcheck) refcnt = REFCOUNT(self);
+ else refcnt = 1;
+ if ((refcnt > 2) || (self->base != NULL) || \
+ (self->weakreflist != NULL)) {
+ PyErr_SetString(PyExc_ValueError,
+ "cannot resize an array that has "\
+ "been referenced or is referencing\n"\
+ "another array in this way. Use the "\
+ "resize function");
+ return NULL;
+ }
- if (newsize == 0) sd = self->descr->elsize;
- else sd = newsize * self->descr->elsize;
- /* Reallocate space if needed */
- new_data = PyDataMem_RENEW(self->data, sd);
- if (new_data == NULL) {
- PyErr_SetString(PyExc_MemoryError,
- "cannot allocate memory for array");
- return NULL;
- }
- self->data = new_data;
- }
-
- if ((newsize > oldsize) && PyArray_ISWRITEABLE(self)) {
- /* Fill new memory with zeros */
- elsize = self->descr->elsize;
- if (PyDataType_FLAGCHK(self->descr, NPY_ITEM_REFCOUNT)) {
- PyObject *zero = PyInt_FromLong(0);
- char *optr;
- optr = self->data + oldsize*elsize;
- n = newsize - oldsize;
- for (k=0; k<n; k++) {
- _putzero((char *)optr, zero, self->descr);
- optr += elsize;
- }
- Py_DECREF(zero);
- }
- else{
- memset(self->data+oldsize*elsize, 0,
- (newsize-oldsize)*elsize);
- }
+ if (newsize == 0) sd = self->descr->elsize;
+ else sd = newsize * self->descr->elsize;
+ /* Reallocate space if needed */
+ new_data = PyDataMem_RENEW(self->data, sd);
+ if (new_data == NULL) {
+ PyErr_SetString(PyExc_MemoryError,
+ "cannot allocate memory for array");
+ return NULL;
}
+ self->data = new_data;
+ }
- if (self->nd != new_nd) { /* Different number of dimensions. */
- self->nd = new_nd;
+ if ((newsize > oldsize) && PyArray_ISWRITEABLE(self)) {
+ /* Fill new memory with zeros */
+ elsize = self->descr->elsize;
+ if (PyDataType_FLAGCHK(self->descr, NPY_ITEM_REFCOUNT)) {
+ PyObject *zero = PyInt_FromLong(0);
+ char *optr;
+ optr = self->data + oldsize*elsize;
+ n = newsize - oldsize;
+ for (k=0; k<n; k++) {
+ _putzero((char *)optr, zero, self->descr);
+ optr += elsize;
+ }
+ Py_DECREF(zero);
+ }
+ else{
+ memset(self->data+oldsize*elsize, 0,
+ (newsize-oldsize)*elsize);
+ }
+ }
- /* Need new dimensions and strides arrays */
- dimptr = PyDimMem_RENEW(self->dimensions, 2*new_nd);
- if (dimptr == NULL) {
- PyErr_SetString(PyExc_MemoryError,
- "cannot allocate memory for array " \
- "(array may be corrupted)");
- return NULL;
- }
- self->dimensions = dimptr;
- self->strides = dimptr + new_nd;
+ if (self->nd != new_nd) { /* Different number of dimensions. */
+ self->nd = new_nd;
+
+ /* Need new dimensions and strides arrays */
+ dimptr = PyDimMem_RENEW(self->dimensions, 2*new_nd);
+ if (dimptr == NULL) {
+ PyErr_SetString(PyExc_MemoryError,
+ "cannot allocate memory for array " \
+ "(array may be corrupted)");
+ return NULL;
}
+ self->dimensions = dimptr;
+ self->strides = dimptr + new_nd;
+ }
- /* make new_strides variable */
- sd = (size_t) self->descr->elsize;
- sd = (size_t) _array_fill_strides(new_strides, new_dimensions, new_nd, sd,
- self->flags, &(self->flags));
+ /* make new_strides variable */
+ sd = (size_t) self->descr->elsize;
+ sd = (size_t) _array_fill_strides(new_strides, new_dimensions, new_nd, sd,
+ self->flags, &(self->flags));
- memmove(self->dimensions, new_dimensions, new_nd*sizeof(intp));
- memmove(self->strides, new_strides, new_nd*sizeof(intp));
+ memmove(self->dimensions, new_dimensions, new_nd*sizeof(intp));
+ memmove(self->strides, new_strides, new_nd*sizeof(intp));
- Py_INCREF(Py_None);
- return Py_None;
+ Py_INCREF(Py_None);
+ return Py_None;
}
static void
_fillobject(char *optr, PyObject *obj, PyArray_Descr *dtype)
{
- if (!PyDataType_FLAGCHK(dtype, NPY_ITEM_REFCOUNT)) {
- if ((obj == Py_None) ||
- (PyInt_Check(obj) && PyInt_AsLong(obj)==0))
- return;
- else {
- PyObject *arr;
- Py_INCREF(dtype);
- arr = PyArray_NewFromDescr(&PyArray_Type, dtype,
- 0, NULL, NULL, NULL,
- 0, NULL);
- if (arr!=NULL)
- dtype->f->setitem(obj, optr, arr);
- Py_XDECREF(arr);
- }
- }
- else if (PyDescr_HASFIELDS(dtype)) {
- PyObject *key, *value, *title=NULL;
- PyArray_Descr *new;
- int offset;
- Py_ssize_t pos=0;
- while (PyDict_Next(dtype->fields, &pos, &key, &value)) {
- if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset,
- &title)) return;
- _fillobject(optr + offset, obj, new);
- }
- }
+ if (!PyDataType_FLAGCHK(dtype, NPY_ITEM_REFCOUNT)) {
+ if ((obj == Py_None) ||
+ (PyInt_Check(obj) && PyInt_AsLong(obj)==0))
+ return;
else {
- PyObject **temp;
- Py_XINCREF(obj);
- temp = (PyObject **)optr;
- *temp = obj;
- return;
+ PyObject *arr;
+ Py_INCREF(dtype);
+ arr = PyArray_NewFromDescr(&PyArray_Type, dtype,
+ 0, NULL, NULL, NULL,
+ 0, NULL);
+ if (arr!=NULL)
+ dtype->f->setitem(obj, optr, arr);
+ Py_XDECREF(arr);
+ }
+ }
+ else if (PyDescr_HASFIELDS(dtype)) {
+ PyObject *key, *value, *title=NULL;
+ PyArray_Descr *new;
+ int offset;
+ Py_ssize_t pos=0;
+ while (PyDict_Next(dtype->fields, &pos, &key, &value)) {
+ if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset,
+ &title)) return;
+ _fillobject(optr + offset, obj, new);
}
+ }
+ else {
+ PyObject **temp;
+ Py_XINCREF(obj);
+ temp = (PyObject **)optr;
+ *temp = obj;
+ return;
+ }
}
/* Assumes contiguous */
@@ -5696,240 +5695,240 @@ _fillobject(char *optr, PyObject *obj, PyArray_Descr *dtype)
static void
PyArray_FillObjectArray(PyArrayObject *arr, PyObject *obj)
{
- intp i,n;
+ intp i,n;
+ n = PyArray_SIZE(arr);
+ if (arr->descr->type_num == PyArray_OBJECT) {
+ PyObject **optr;
+ optr = (PyObject **)(arr->data);
n = PyArray_SIZE(arr);
- if (arr->descr->type_num == PyArray_OBJECT) {
- PyObject **optr;
- optr = (PyObject **)(arr->data);
- n = PyArray_SIZE(arr);
- if (obj == NULL) {
- for (i=0; i<n; i++) {
- *optr++ = NULL;
- }
- }
- else {
- for (i=0; i<n; i++) {
- Py_INCREF(obj);
- *optr++ = obj;
- }
- }
+ if (obj == NULL) {
+ for (i=0; i<n; i++) {
+ *optr++ = NULL;
+ }
}
else {
- char *optr;
- optr = arr->data;
- for (i=0; i<n; i++) {
- _fillobject(optr, obj, arr->descr);
- optr += arr->descr->elsize;
- }
+ for (i=0; i<n; i++) {
+ Py_INCREF(obj);
+ *optr++ = obj;
+ }
+ }
+ }
+ else {
+ char *optr;
+ optr = arr->data;
+ for (i=0; i<n; i++) {
+ _fillobject(optr, obj, arr->descr);
+ optr += arr->descr->elsize;
}
+ }
}
/*OBJECT_API*/
static int
PyArray_FillWithScalar(PyArrayObject *arr, PyObject *obj)
{
- PyObject *newarr;
- int itemsize, swap;
- void *fromptr;
- PyArray_Descr *descr;
- intp size;
- PyArray_CopySwapFunc *copyswap;
-
- itemsize = arr->descr->elsize;
- if (PyArray_ISOBJECT(arr)) {
- fromptr = &obj;
- swap = 0;
- newarr = NULL;
+ PyObject *newarr;
+ int itemsize, swap;
+ void *fromptr;
+ PyArray_Descr *descr;
+ intp size;
+ PyArray_CopySwapFunc *copyswap;
+
+ itemsize = arr->descr->elsize;
+ if (PyArray_ISOBJECT(arr)) {
+ fromptr = &obj;
+ swap = 0;
+ newarr = NULL;
+ }
+ else {
+ descr = PyArray_DESCR(arr);
+ Py_INCREF(descr);
+ newarr = PyArray_FromAny(obj, descr, 0,0, ALIGNED, NULL);
+ if (newarr == NULL) return -1;
+ fromptr = PyArray_DATA(newarr);
+ swap=!PyArray_ISNOTSWAPPED(arr);
+ }
+ size=PyArray_SIZE(arr);
+ copyswap = arr->descr->f->copyswap;
+ if (PyArray_ISONESEGMENT(arr)) {
+ char *toptr=PyArray_DATA(arr);
+ PyArray_FillWithScalarFunc* fillwithscalar =
+ arr->descr->f->fillwithscalar;
+ if (fillwithscalar && PyArray_ISALIGNED(arr)) {
+ copyswap(fromptr, NULL, swap, newarr);
+ fillwithscalar(toptr, size, fromptr, arr);
}
else {
- descr = PyArray_DESCR(arr);
- Py_INCREF(descr);
- newarr = PyArray_FromAny(obj, descr, 0,0, ALIGNED, NULL);
- if (newarr == NULL) return -1;
- fromptr = PyArray_DATA(newarr);
- swap=!PyArray_ISNOTSWAPPED(arr);
- }
- size=PyArray_SIZE(arr);
- copyswap = arr->descr->f->copyswap;
- if (PyArray_ISONESEGMENT(arr)) {
- char *toptr=PyArray_DATA(arr);
- PyArray_FillWithScalarFunc* fillwithscalar =
- arr->descr->f->fillwithscalar;
- if (fillwithscalar && PyArray_ISALIGNED(arr)) {
- copyswap(fromptr, NULL, swap, newarr);
- fillwithscalar(toptr, size, fromptr, arr);
- }
- else {
- while (size--) {
- copyswap(toptr, fromptr, swap, arr);
- toptr += itemsize;
- }
- }
+ while (size--) {
+ copyswap(toptr, fromptr, swap, arr);
+ toptr += itemsize;
+ }
}
- else {
- PyArrayIterObject *iter;
+ }
+ else {
+ PyArrayIterObject *iter;
- iter = (PyArrayIterObject *)\
- PyArray_IterNew((PyObject *)arr);
- if (iter == NULL) {
- Py_XDECREF(newarr);
- return -1;
- }
- while(size--) {
- copyswap(iter->dataptr, fromptr, swap, arr);
- PyArray_ITER_NEXT(iter);
- }
- Py_DECREF(iter);
+ iter = (PyArrayIterObject *)\
+ PyArray_IterNew((PyObject *)arr);
+ if (iter == NULL) {
+ Py_XDECREF(newarr);
+ return -1;
}
- Py_XDECREF(newarr);
- return 0;
+ while(size--) {
+ copyswap(iter->dataptr, fromptr, swap, arr);
+ PyArray_ITER_NEXT(iter);
+ }
+ Py_DECREF(iter);
+ }
+ Py_XDECREF(newarr);
+ return 0;
}
static PyObject *
array_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds)
{
- static char *kwlist[] = {"shape", "dtype", "buffer",
- "offset", "strides",
- "order", NULL};
- PyArray_Descr *descr=NULL;
- int itemsize;
- PyArray_Dims dims = {NULL, 0};
- PyArray_Dims strides = {NULL, 0};
- PyArray_Chunk buffer;
- longlong offset=0;
- NPY_ORDER order=PyArray_CORDER;
- int fortran = 0;
- PyArrayObject *ret;
-
- buffer.ptr = NULL;
- /* Usually called with shape and type
- but can also be called with buffer, strides, and swapped info
- */
-
- /* For now, let's just use this to create an empty, contiguous
- array of a specific type and shape.
- */
-
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&|O&O&LO&O&",
- kwlist, PyArray_IntpConverter,
- &dims,
- PyArray_DescrConverter,
- &descr,
- PyArray_BufferConverter,
- &buffer,
- &offset,
- &PyArray_IntpConverter,
- &strides,
- &PyArray_OrderConverter,
- &order))
- goto fail;
-
- if (order == PyArray_FORTRANORDER) fortran = 1;
-
- if (descr == NULL)
- descr = PyArray_DescrFromType(PyArray_DEFAULT);
-
- itemsize = descr->elsize;
+ static char *kwlist[] = {"shape", "dtype", "buffer",
+ "offset", "strides",
+ "order", NULL};
+ PyArray_Descr *descr=NULL;
+ int itemsize;
+ PyArray_Dims dims = {NULL, 0};
+ PyArray_Dims strides = {NULL, 0};
+ PyArray_Chunk buffer;
+ longlong offset=0;
+ NPY_ORDER order=PyArray_CORDER;
+ int fortran = 0;
+ PyArrayObject *ret;
+
+ buffer.ptr = NULL;
+ /* Usually called with shape and type
+ but can also be called with buffer, strides, and swapped info
+ */
+
+ /* For now, let's just use this to create an empty, contiguous
+ array of a specific type and shape.
+ */
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&|O&O&LO&O&",
+ kwlist, PyArray_IntpConverter,
+ &dims,
+ PyArray_DescrConverter,
+ &descr,
+ PyArray_BufferConverter,
+ &buffer,
+ &offset,
+ &PyArray_IntpConverter,
+ &strides,
+ &PyArray_OrderConverter,
+ &order))
+ goto fail;
+
+ if (order == PyArray_FORTRANORDER) fortran = 1;
+
+ if (descr == NULL)
+ descr = PyArray_DescrFromType(PyArray_DEFAULT);
+
+ itemsize = descr->elsize;
+
+ if (itemsize == 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "data-type with unspecified variable length");
+ goto fail;
+ }
- if (itemsize == 0) {
- PyErr_SetString(PyExc_ValueError,
- "data-type with unspecified variable length");
- goto fail;
+ if (strides.ptr != NULL) {
+ intp nb, off;
+ if (strides.len != dims.len) {
+ PyErr_SetString(PyExc_ValueError,
+ "strides, if given, must be " \
+ "the same length as shape");
+ goto fail;
}
- if (strides.ptr != NULL) {
- intp nb, off;
- if (strides.len != dims.len) {
- PyErr_SetString(PyExc_ValueError,
- "strides, if given, must be " \
- "the same length as shape");
- goto fail;
- }
-
- if (buffer.ptr == NULL) {
- nb = 0;
- off = 0;
- }
- else {
- nb = buffer.len;
- off = (intp) offset;
- }
+ if (buffer.ptr == NULL) {
+ nb = 0;
+ off = 0;
+ }
+ else {
+ nb = buffer.len;
+ off = (intp) offset;
+ }
- if (!PyArray_CheckStrides(itemsize, dims.len,
- nb, off,
- dims.ptr, strides.ptr)) {
- PyErr_SetString(PyExc_ValueError,
- "strides is incompatible " \
- "with shape of requested " \
- "array and size of buffer");
- goto fail;
- }
+ if (!PyArray_CheckStrides(itemsize, dims.len,
+ nb, off,
+ dims.ptr, strides.ptr)) {
+ PyErr_SetString(PyExc_ValueError,
+ "strides is incompatible " \
+ "with shape of requested " \
+ "array and size of buffer");
+ goto fail;
}
+ }
- if (buffer.ptr == NULL) {
- ret = (PyArrayObject *) \
- PyArray_NewFromDescr(subtype, descr,
- (int)dims.len,
- dims.ptr,
- strides.ptr, NULL, fortran, NULL);
- if (ret == NULL) {descr=NULL;goto fail;}
- if (PyDataType_FLAGCHK(descr, NPY_ITEM_HASOBJECT)) {
- /* place Py_None in object positions */
- PyArray_FillObjectArray(ret, Py_None);
- if (PyErr_Occurred()) {
- descr=NULL;
- goto fail;
- }
- }
+ if (buffer.ptr == NULL) {
+ ret = (PyArrayObject *) \
+ PyArray_NewFromDescr(subtype, descr,
+ (int)dims.len,
+ dims.ptr,
+ strides.ptr, NULL, fortran, NULL);
+ if (ret == NULL) {descr=NULL;goto fail;}
+ if (PyDataType_FLAGCHK(descr, NPY_ITEM_HASOBJECT)) {
+ /* place Py_None in object positions */
+ PyArray_FillObjectArray(ret, Py_None);
+ if (PyErr_Occurred()) {
+ descr=NULL;
+ goto fail;
+ }
}
- else { /* buffer given -- use it */
- if (dims.len == 1 && dims.ptr[0] == -1) {
- dims.ptr[0] = (buffer.len-(intp)offset) / itemsize;
- }
- else if ((strides.ptr == NULL) && \
- (buffer.len < ((intp)itemsize)* \
- PyArray_MultiplyList(dims.ptr, dims.len))) {
- PyErr_SetString(PyExc_TypeError,
- "buffer is too small for " \
- "requested array");
- goto fail;
- }
- /* get writeable and aligned */
- if (fortran) buffer.flags |= FORTRAN;
- ret = (PyArrayObject *)\
- PyArray_NewFromDescr(subtype, descr,
- dims.len, dims.ptr,
- strides.ptr,
- offset + (char *)buffer.ptr,
- buffer.flags, NULL);
- if (ret == NULL) {descr=NULL; goto fail;}
- PyArray_UpdateFlags(ret, UPDATE_ALL);
- ret->base = buffer.base;
- Py_INCREF(buffer.base);
- }
-
- PyDimMem_FREE(dims.ptr);
- if (strides.ptr) PyDimMem_FREE(strides.ptr);
- return (PyObject *)ret;
+ }
+ else { /* buffer given -- use it */
+ if (dims.len == 1 && dims.ptr[0] == -1) {
+ dims.ptr[0] = (buffer.len-(intp)offset) / itemsize;
+ }
+ else if ((strides.ptr == NULL) && \
+ (buffer.len < ((intp)itemsize)* \
+ PyArray_MultiplyList(dims.ptr, dims.len))) {
+ PyErr_SetString(PyExc_TypeError,
+ "buffer is too small for " \
+ "requested array");
+ goto fail;
+ }
+ /* get writeable and aligned */
+ if (fortran) buffer.flags |= FORTRAN;
+ ret = (PyArrayObject *)\
+ PyArray_NewFromDescr(subtype, descr,
+ dims.len, dims.ptr,
+ strides.ptr,
+ offset + (char *)buffer.ptr,
+ buffer.flags, NULL);
+ if (ret == NULL) {descr=NULL; goto fail;}
+ PyArray_UpdateFlags(ret, UPDATE_ALL);
+ ret->base = buffer.base;
+ Py_INCREF(buffer.base);
+ }
+
+ PyDimMem_FREE(dims.ptr);
+ if (strides.ptr) PyDimMem_FREE(strides.ptr);
+ return (PyObject *)ret;
fail:
- Py_XDECREF(descr);
- if (dims.ptr) PyDimMem_FREE(dims.ptr);
- if (strides.ptr) PyDimMem_FREE(strides.ptr);
- return NULL;
+ Py_XDECREF(descr);
+ if (dims.ptr) PyDimMem_FREE(dims.ptr);
+ if (strides.ptr) PyDimMem_FREE(strides.ptr);
+ return NULL;
}
static PyObject *
array_iter(PyArrayObject *arr)
{
- if (arr->nd == 0) {
- PyErr_SetString(PyExc_TypeError,
- "iteration over a 0-d array");
- return NULL;
- }
- return PySeqIter_New((PyObject *)arr);
+ if (arr->nd == 0) {
+ PyErr_SetString(PyExc_TypeError,
+ "iteration over a 0-d array");
+ return NULL;
+ }
+ return PySeqIter_New((PyObject *)arr);
}
@@ -5938,124 +5937,124 @@ array_iter(PyArrayObject *arr)
static PyObject *
array_ndim_get(PyArrayObject *self)
{
- return PyInt_FromLong(self->nd);
+ return PyInt_FromLong(self->nd);
}
static PyObject *
array_flags_get(PyArrayObject *self)
{
- return PyArray_NewFlagsObject((PyObject *)self);
+ return PyArray_NewFlagsObject((PyObject *)self);
}
static PyObject *
array_shape_get(PyArrayObject *self)
{
- return PyArray_IntTupleFromIntp(self->nd, self->dimensions);
+ return PyArray_IntTupleFromIntp(self->nd, self->dimensions);
}
static int
array_shape_set(PyArrayObject *self, PyObject *val)
{
- int nd;
- PyObject *ret;
-
- /* Assumes C-order */
- ret = PyArray_Reshape(self, val);
- if (ret == NULL) return -1;
- if (PyArray_DATA(ret) != PyArray_DATA(self)) {
- Py_DECREF(ret);
- PyErr_SetString(PyExc_AttributeError,
- "incompatible shape for a non-contiguous "\
- "array");
- return -1;
- }
+ int nd;
+ PyObject *ret;
- /* Free old dimensions and strides */
- PyDimMem_FREE(self->dimensions);
- nd = PyArray_NDIM(ret);
- self->nd = nd;
- if (nd > 0) { /* create new dimensions and strides */
- self->dimensions = PyDimMem_NEW(2*nd);
- if (self->dimensions == NULL) {
- Py_DECREF(ret);
- PyErr_SetString(PyExc_MemoryError,"");
- return -1;
- }
- self->strides = self->dimensions + nd;
- memcpy(self->dimensions, PyArray_DIMS(ret),
- nd*sizeof(intp));
- memcpy(self->strides, PyArray_STRIDES(ret),
- nd*sizeof(intp));
- }
- else {self->dimensions=NULL; self->strides=NULL;}
+ /* Assumes C-order */
+ ret = PyArray_Reshape(self, val);
+ if (ret == NULL) return -1;
+ if (PyArray_DATA(ret) != PyArray_DATA(self)) {
Py_DECREF(ret);
- PyArray_UpdateFlags(self, CONTIGUOUS | FORTRAN);
- return 0;
+ PyErr_SetString(PyExc_AttributeError,
+ "incompatible shape for a non-contiguous "\
+ "array");
+ return -1;
+ }
+
+ /* Free old dimensions and strides */
+ PyDimMem_FREE(self->dimensions);
+ nd = PyArray_NDIM(ret);
+ self->nd = nd;
+ if (nd > 0) { /* create new dimensions and strides */
+ self->dimensions = PyDimMem_NEW(2*nd);
+ if (self->dimensions == NULL) {
+ Py_DECREF(ret);
+ PyErr_SetString(PyExc_MemoryError,"");
+ return -1;
+ }
+ self->strides = self->dimensions + nd;
+ memcpy(self->dimensions, PyArray_DIMS(ret),
+ nd*sizeof(intp));
+ memcpy(self->strides, PyArray_STRIDES(ret),
+ nd*sizeof(intp));
+ }
+ else {self->dimensions=NULL; self->strides=NULL;}
+ Py_DECREF(ret);
+ PyArray_UpdateFlags(self, CONTIGUOUS | FORTRAN);
+ return 0;
}
static PyObject *
array_strides_get(PyArrayObject *self)
{
- return PyArray_IntTupleFromIntp(self->nd, self->strides);
+ return PyArray_IntTupleFromIntp(self->nd, self->strides);
}
static int
array_strides_set(PyArrayObject *self, PyObject *obj)
{
- PyArray_Dims newstrides = {NULL, 0};
- PyArrayObject *new;
- intp numbytes=0;
- intp offset=0;
- Py_ssize_t buf_len;
- char *buf;
-
- if (!PyArray_IntpConverter(obj, &newstrides) || \
- newstrides.ptr == NULL) {
- PyErr_SetString(PyExc_TypeError, "invalid strides");
- return -1;
- }
- if (newstrides.len != self->nd) {
- PyErr_Format(PyExc_ValueError, "strides must be " \
- " same length as shape (%d)", self->nd);
- goto fail;
- }
- new = self;
- while(new->base && PyArray_Check(new->base)) {
- new = (PyArrayObject *)(new->base);
- }
- /* Get the available memory through the buffer
- interface on new->base or if that fails
- from the current new */
- if (new->base && PyObject_AsReadBuffer(new->base,
- (const void **)&buf,
- &buf_len) >= 0) {
- offset = self->data - buf;
- numbytes = buf_len + offset;
- }
- else {
- PyErr_Clear();
- numbytes = PyArray_MultiplyList(new->dimensions,
- new->nd)*new->descr->elsize;
- offset = self->data - new->data;
- }
+ PyArray_Dims newstrides = {NULL, 0};
+ PyArrayObject *new;
+ intp numbytes=0;
+ intp offset=0;
+ Py_ssize_t buf_len;
+ char *buf;
- if (!PyArray_CheckStrides(self->descr->elsize, self->nd, numbytes,
- offset,
- self->dimensions, newstrides.ptr)) {
- PyErr_SetString(PyExc_ValueError, "strides is not "\
- "compatible with available memory");
- goto fail;
- }
- memcpy(self->strides, newstrides.ptr, sizeof(intp)*newstrides.len);
- PyArray_UpdateFlags(self, CONTIGUOUS | FORTRAN);
- PyDimMem_FREE(newstrides.ptr);
- return 0;
+ if (!PyArray_IntpConverter(obj, &newstrides) || \
+ newstrides.ptr == NULL) {
+ PyErr_SetString(PyExc_TypeError, "invalid strides");
+ return -1;
+ }
+ if (newstrides.len != self->nd) {
+ PyErr_Format(PyExc_ValueError, "strides must be " \
+ " same length as shape (%d)", self->nd);
+ goto fail;
+ }
+ new = self;
+ while(new->base && PyArray_Check(new->base)) {
+ new = (PyArrayObject *)(new->base);
+ }
+ /* Get the available memory through the buffer
+ interface on new->base or if that fails
+ from the current new */
+ if (new->base && PyObject_AsReadBuffer(new->base,
+ (const void **)&buf,
+ &buf_len) >= 0) {
+ offset = self->data - buf;
+ numbytes = buf_len + offset;
+ }
+ else {
+ PyErr_Clear();
+ numbytes = PyArray_MultiplyList(new->dimensions,
+ new->nd)*new->descr->elsize;
+ offset = self->data - new->data;
+ }
+
+ if (!PyArray_CheckStrides(self->descr->elsize, self->nd, numbytes,
+ offset,
+ self->dimensions, newstrides.ptr)) {
+ PyErr_SetString(PyExc_ValueError, "strides is not "\
+ "compatible with available memory");
+ goto fail;
+ }
+ memcpy(self->strides, newstrides.ptr, sizeof(intp)*newstrides.len);
+ PyArray_UpdateFlags(self, CONTIGUOUS | FORTRAN);
+ PyDimMem_FREE(newstrides.ptr);
+ return 0;
fail:
- PyDimMem_FREE(newstrides.ptr);
- return -1;
+ PyDimMem_FREE(newstrides.ptr);
+ return -1;
}
@@ -6063,10 +6062,10 @@ array_strides_set(PyArrayObject *self, PyObject *obj)
static PyObject *
array_priority_get(PyArrayObject *self)
{
- if (PyArray_CheckExact(self))
- return PyFloat_FromDouble(PyArray_PRIORITY);
- else
- return PyFloat_FromDouble(PyArray_SUBTYPE_PRIORITY);
+ if (PyArray_CheckExact(self))
+ return PyFloat_FromDouble(PyArray_PRIORITY);
+ else
+ return PyFloat_FromDouble(PyArray_SUBTYPE_PRIORITY);
}
static PyObject *arraydescr_protocol_typestr_get(PyArray_Descr *);
@@ -6074,14 +6073,14 @@ static PyObject *arraydescr_protocol_typestr_get(PyArray_Descr *);
static PyObject *
array_typestr_get(PyArrayObject *self)
{
- return arraydescr_protocol_typestr_get(self->descr);
+ return arraydescr_protocol_typestr_get(self->descr);
}
static PyObject *
array_descr_get(PyArrayObject *self)
{
- Py_INCREF(self->descr);
- return (PyObject *)self->descr;
+ Py_INCREF(self->descr);
+ return (PyObject *)self->descr;
}
static PyObject *arraydescr_protocol_descr_get(PyArray_Descr *self);
@@ -6089,32 +6088,32 @@ static PyObject *arraydescr_protocol_descr_get(PyArray_Descr *self);
static PyObject *
array_protocol_descr_get(PyArrayObject *self)
{
- PyObject *res;
- PyObject *dobj;
+ PyObject *res;
+ PyObject *dobj;
- res = arraydescr_protocol_descr_get(self->descr);
- if (res) return res;
- PyErr_Clear();
+ res = arraydescr_protocol_descr_get(self->descr);
+ if (res) return res;
+ PyErr_Clear();
- /* get default */
- dobj = PyTuple_New(2);
- if (dobj == NULL) return NULL;
- PyTuple_SET_ITEM(dobj, 0, PyString_FromString(""));
- PyTuple_SET_ITEM(dobj, 1, array_typestr_get(self));
- res = PyList_New(1);
- if (res == NULL) {Py_DECREF(dobj); return NULL;}
- PyList_SET_ITEM(res, 0, dobj);
- return res;
+ /* get default */
+ dobj = PyTuple_New(2);
+ if (dobj == NULL) return NULL;
+ PyTuple_SET_ITEM(dobj, 0, PyString_FromString(""));
+ PyTuple_SET_ITEM(dobj, 1, array_typestr_get(self));
+ res = PyList_New(1);
+ if (res == NULL) {Py_DECREF(dobj); return NULL;}
+ PyList_SET_ITEM(res, 0, dobj);
+ return res;
}
static PyObject *
array_protocol_strides_get(PyArrayObject *self)
{
- if PyArray_ISCONTIGUOUS(self) {
- Py_INCREF(Py_None);
- return Py_None;
+ if PyArray_ISCONTIGUOUS(self) {
+ Py_INCREF(Py_None);
+ return Py_None;
}
- return PyArray_IntTupleFromIntp(self->nd, self->strides);
+ return PyArray_IntTupleFromIntp(self->nd, self->strides);
}
@@ -6122,326 +6121,326 @@ array_protocol_strides_get(PyArrayObject *self)
static PyObject *
array_dataptr_get(PyArrayObject *self)
{
- return Py_BuildValue("NO",
- PyLong_FromVoidPtr(self->data),
- (self->flags & WRITEABLE ? Py_False :
- Py_True));
+ return Py_BuildValue("NO",
+ PyLong_FromVoidPtr(self->data),
+ (self->flags & WRITEABLE ? Py_False :
+ Py_True));
}
static PyObject *
array_ctypes_get(PyArrayObject *self)
{
- PyObject *_numpy_internal;
- PyObject *ret;
- _numpy_internal = PyImport_ImportModule("numpy.core._internal");
- if (_numpy_internal == NULL) return NULL;
- ret = PyObject_CallMethod(_numpy_internal, "_ctypes",
- "ON", self,
- PyLong_FromVoidPtr(self->data));
- Py_DECREF(_numpy_internal);
- return ret;
+ PyObject *_numpy_internal;
+ PyObject *ret;
+ _numpy_internal = PyImport_ImportModule("numpy.core._internal");
+ if (_numpy_internal == NULL) return NULL;
+ ret = PyObject_CallMethod(_numpy_internal, "_ctypes",
+ "ON", self,
+ PyLong_FromVoidPtr(self->data));
+ Py_DECREF(_numpy_internal);
+ return ret;
}
static PyObject *
array_interface_get(PyArrayObject *self)
{
- PyObject *dict;
- PyObject *obj;
- dict = PyDict_New();
- if (dict == NULL) return NULL;
+ PyObject *dict;
+ PyObject *obj;
+ dict = PyDict_New();
+ if (dict == NULL) return NULL;
- /* dataptr */
- obj = array_dataptr_get(self);
- PyDict_SetItemString(dict, "data", obj);
- Py_DECREF(obj);
+ /* dataptr */
+ obj = array_dataptr_get(self);
+ PyDict_SetItemString(dict, "data", obj);
+ Py_DECREF(obj);
- obj = array_protocol_strides_get(self);
- PyDict_SetItemString(dict, "strides", obj);
- Py_DECREF(obj);
+ obj = array_protocol_strides_get(self);
+ PyDict_SetItemString(dict, "strides", obj);
+ Py_DECREF(obj);
- obj = array_protocol_descr_get(self);
- PyDict_SetItemString(dict, "descr", obj);
- Py_DECREF(obj);
+ obj = array_protocol_descr_get(self);
+ PyDict_SetItemString(dict, "descr", obj);
+ Py_DECREF(obj);
- obj = arraydescr_protocol_typestr_get(self->descr);
- PyDict_SetItemString(dict, "typestr", obj);
- Py_DECREF(obj);
+ obj = arraydescr_protocol_typestr_get(self->descr);
+ PyDict_SetItemString(dict, "typestr", obj);
+ Py_DECREF(obj);
- obj = array_shape_get(self);
- PyDict_SetItemString(dict, "shape", obj);
- Py_DECREF(obj);
+ obj = array_shape_get(self);
+ PyDict_SetItemString(dict, "shape", obj);
+ Py_DECREF(obj);
- obj = PyInt_FromLong(3);
- PyDict_SetItemString(dict, "version", obj);
- Py_DECREF(obj);
+ obj = PyInt_FromLong(3);
+ PyDict_SetItemString(dict, "version", obj);
+ Py_DECREF(obj);
- return dict;
+ return dict;
}
static PyObject *
array_data_get(PyArrayObject *self)
{
- intp nbytes;
- if (!(PyArray_ISONESEGMENT(self))) {
- PyErr_SetString(PyExc_AttributeError, "cannot get single-"\
- "segment buffer for discontiguous array");
- return NULL;
- }
- nbytes = PyArray_NBYTES(self);
- if PyArray_ISWRITEABLE(self)
- return PyBuffer_FromReadWriteObject((PyObject *)self, 0,
- (int) nbytes);
- else
- return PyBuffer_FromObject((PyObject *)self, 0, (int) nbytes);
+ intp nbytes;
+ if (!(PyArray_ISONESEGMENT(self))) {
+ PyErr_SetString(PyExc_AttributeError, "cannot get single-"\
+ "segment buffer for discontiguous array");
+ return NULL;
+ }
+ nbytes = PyArray_NBYTES(self);
+ if PyArray_ISWRITEABLE(self)
+ return PyBuffer_FromReadWriteObject((PyObject *)self, 0,
+ (int) nbytes);
+ else
+ return PyBuffer_FromObject((PyObject *)self, 0, (int) nbytes);
}
static int
array_data_set(PyArrayObject *self, PyObject *op)
{
- void *buf;
- Py_ssize_t buf_len;
- int writeable=1;
-
- if (PyObject_AsWriteBuffer(op, &buf, &buf_len) < 0) {
- writeable = 0;
- if (PyObject_AsReadBuffer(op, (const void **)&buf,
- &buf_len) < 0) {
- PyErr_SetString(PyExc_AttributeError,
- "object does not have single-segment " \
- "buffer interface");
- return -1;
- }
- }
- if (!PyArray_ISONESEGMENT(self)) {
- PyErr_SetString(PyExc_AttributeError, "cannot set single-" \
- "segment buffer for discontiguous array");
- return -1;
- }
- if (PyArray_NBYTES(self) > buf_len) {
- PyErr_SetString(PyExc_AttributeError,
- "not enough data for array");
- return -1;
- }
- if (self->flags & OWNDATA) {
- PyArray_XDECREF(self);
- PyDataMem_FREE(self->data);
+ void *buf;
+ Py_ssize_t buf_len;
+ int writeable=1;
+
+ if (PyObject_AsWriteBuffer(op, &buf, &buf_len) < 0) {
+ writeable = 0;
+ if (PyObject_AsReadBuffer(op, (const void **)&buf,
+ &buf_len) < 0) {
+ PyErr_SetString(PyExc_AttributeError,
+ "object does not have single-segment " \
+ "buffer interface");
+ return -1;
}
- if (self->base) {
- if (self->flags & UPDATEIFCOPY) {
- ((PyArrayObject *)self->base)->flags |= WRITEABLE;
- self->flags &= ~UPDATEIFCOPY;
- }
- Py_DECREF(self->base);
+ }
+ if (!PyArray_ISONESEGMENT(self)) {
+ PyErr_SetString(PyExc_AttributeError, "cannot set single-" \
+ "segment buffer for discontiguous array");
+ return -1;
+ }
+ if (PyArray_NBYTES(self) > buf_len) {
+ PyErr_SetString(PyExc_AttributeError,
+ "not enough data for array");
+ return -1;
+ }
+ if (self->flags & OWNDATA) {
+ PyArray_XDECREF(self);
+ PyDataMem_FREE(self->data);
+ }
+ if (self->base) {
+ if (self->flags & UPDATEIFCOPY) {
+ ((PyArrayObject *)self->base)->flags |= WRITEABLE;
+ self->flags &= ~UPDATEIFCOPY;
}
- Py_INCREF(op);
- self->base = op;
- self->data = buf;
- self->flags = CARRAY;
- if (!writeable)
- self->flags &= ~WRITEABLE;
- return 0;
+ Py_DECREF(self->base);
+ }
+ Py_INCREF(op);
+ self->base = op;
+ self->data = buf;
+ self->flags = CARRAY;
+ if (!writeable)
+ self->flags &= ~WRITEABLE;
+ return 0;
}
static PyObject *
array_itemsize_get(PyArrayObject *self)
{
- return PyInt_FromLong((long) self->descr->elsize);
+ return PyInt_FromLong((long) self->descr->elsize);
}
static PyObject *
array_size_get(PyArrayObject *self)
{
- intp size=PyArray_SIZE(self);
+ intp size=PyArray_SIZE(self);
#if SIZEOF_INTP <= SIZEOF_LONG
- return PyInt_FromLong((long) size);
+ return PyInt_FromLong((long) size);
#else
- if (size > MAX_LONG || size < MIN_LONG)
- return PyLong_FromLongLong(size);
- else
- return PyInt_FromLong((long) size);
+ if (size > MAX_LONG || size < MIN_LONG)
+ return PyLong_FromLongLong(size);
+ else
+ return PyInt_FromLong((long) size);
#endif
}
static PyObject *
array_nbytes_get(PyArrayObject *self)
{
- intp nbytes = PyArray_NBYTES(self);
+ intp nbytes = PyArray_NBYTES(self);
#if SIZEOF_INTP <= SIZEOF_LONG
- return PyInt_FromLong((long) nbytes);
+ return PyInt_FromLong((long) nbytes);
#else
- if (nbytes > MAX_LONG || nbytes < MIN_LONG)
- return PyLong_FromLongLong(nbytes);
- else
- return PyInt_FromLong((long) nbytes);
+ if (nbytes > MAX_LONG || nbytes < MIN_LONG)
+ return PyLong_FromLongLong(nbytes);
+ else
+ return PyInt_FromLong((long) nbytes);
#endif
}
/* If the type is changed.
- Also needing change: strides, itemsize
+ Also needing change: strides, itemsize
- Either itemsize is exactly the same
- or the array is single-segment (contiguous or fortran) with
- compatibile dimensions
+ Either itemsize is exactly the same
+ or the array is single-segment (contiguous or fortran) with
+ compatibile dimensions
- The shape and strides will be adjusted in that case as well.
+ The shape and strides will be adjusted in that case as well.
*/
static int
array_descr_set(PyArrayObject *self, PyObject *arg)
{
- PyArray_Descr *newtype=NULL;
- intp newdim;
- int index;
- char *msg = "new type not compatible with array.";
+ PyArray_Descr *newtype=NULL;
+ intp newdim;
+ int index;
+ char *msg = "new type not compatible with array.";
- if (!(PyArray_DescrConverter(arg, &newtype)) ||
- newtype == NULL) {
- PyErr_SetString(PyExc_TypeError, "invalid data-type for array");
- return -1;
- }
- if (PyDataType_FLAGCHK(newtype, NPY_ITEM_HASOBJECT) ||
- PyDataType_FLAGCHK(newtype, NPY_ITEM_IS_POINTER) ||
- PyDataType_FLAGCHK(self->descr, NPY_ITEM_HASOBJECT) ||
- PyDataType_FLAGCHK(self->descr, NPY_ITEM_IS_POINTER)) {
- PyErr_SetString(PyExc_TypeError, \
- "Cannot change data-type for object " \
- "array.");
- Py_DECREF(newtype);
- return -1;
- }
+ if (!(PyArray_DescrConverter(arg, &newtype)) ||
+ newtype == NULL) {
+ PyErr_SetString(PyExc_TypeError, "invalid data-type for array");
+ return -1;
+ }
+ if (PyDataType_FLAGCHK(newtype, NPY_ITEM_HASOBJECT) ||
+ PyDataType_FLAGCHK(newtype, NPY_ITEM_IS_POINTER) ||
+ PyDataType_FLAGCHK(self->descr, NPY_ITEM_HASOBJECT) ||
+ PyDataType_FLAGCHK(self->descr, NPY_ITEM_IS_POINTER)) {
+ PyErr_SetString(PyExc_TypeError, \
+ "Cannot change data-type for object " \
+ "array.");
+ Py_DECREF(newtype);
+ return -1;
+ }
- if (newtype->elsize == 0) {
- PyErr_SetString(PyExc_TypeError,
- "data-type must not be 0-sized");
- Py_DECREF(newtype);
- return -1;
- }
+ if (newtype->elsize == 0) {
+ PyErr_SetString(PyExc_TypeError,
+ "data-type must not be 0-sized");
+ Py_DECREF(newtype);
+ return -1;
+ }
- if ((newtype->elsize != self->descr->elsize) && \
- (self->nd == 0 || !PyArray_ISONESEGMENT(self) || \
- newtype->subarray)) goto fail;
+ if ((newtype->elsize != self->descr->elsize) && \
+ (self->nd == 0 || !PyArray_ISONESEGMENT(self) || \
+ newtype->subarray)) goto fail;
- if (PyArray_ISCONTIGUOUS(self)) index = self->nd - 1;
- else index = 0;
+ if (PyArray_ISCONTIGUOUS(self)) index = self->nd - 1;
+ else index = 0;
- if (newtype->elsize < self->descr->elsize) {
- /* if it is compatible increase the size of the
- dimension at end (or at the front for FORTRAN)
- */
- if (self->descr->elsize % newtype->elsize != 0)
- goto fail;
- newdim = self->descr->elsize / newtype->elsize;
- self->dimensions[index] *= newdim;
- self->strides[index] = newtype->elsize;
- }
-
- else if (newtype->elsize > self->descr->elsize) {
-
- /* Determine if last (or first if FORTRAN) dimension
- is compatible */
-
- newdim = self->dimensions[index] * self->descr->elsize;
- if ((newdim % newtype->elsize) != 0) goto fail;
-
- self->dimensions[index] = newdim / newtype->elsize;
- self->strides[index] = newtype->elsize;
- }
-
- /* fall through -- adjust type*/
-
- Py_DECREF(self->descr);
- if (newtype->subarray) {
- /* create new array object from data and update
- dimensions, strides and descr from it */
- PyArrayObject *temp;
-
- /* We would decref newtype here --- temp will
- steal a reference to it */
- temp = (PyArrayObject *) \
- PyArray_NewFromDescr(&PyArray_Type, newtype, self->nd,
- self->dimensions, self->strides,
- self->data, self->flags, NULL);
- if (temp == NULL) return -1;
- PyDimMem_FREE(self->dimensions);
- self->dimensions = temp->dimensions;
- self->nd = temp->nd;
- self->strides = temp->strides;
- newtype = temp->descr;
- Py_INCREF(temp->descr);
- /* Fool deallocator not to delete these*/
- temp->nd = 0;
- temp->dimensions = NULL;
- Py_DECREF(temp);
- }
+ if (newtype->elsize < self->descr->elsize) {
+ /* if it is compatible increase the size of the
+ dimension at end (or at the front for FORTRAN)
+ */
+ if (self->descr->elsize % newtype->elsize != 0)
+ goto fail;
+ newdim = self->descr->elsize / newtype->elsize;
+ self->dimensions[index] *= newdim;
+ self->strides[index] = newtype->elsize;
+ }
- self->descr = newtype;
- PyArray_UpdateFlags(self, UPDATE_ALL);
+ else if (newtype->elsize > self->descr->elsize) {
- return 0;
+ /* Determine if last (or first if FORTRAN) dimension
+ is compatible */
+
+ newdim = self->dimensions[index] * self->descr->elsize;
+ if ((newdim % newtype->elsize) != 0) goto fail;
+
+ self->dimensions[index] = newdim / newtype->elsize;
+ self->strides[index] = newtype->elsize;
+ }
+
+ /* fall through -- adjust type*/
+
+ Py_DECREF(self->descr);
+ if (newtype->subarray) {
+ /* create new array object from data and update
+ dimensions, strides and descr from it */
+ PyArrayObject *temp;
+
+ /* We would decref newtype here --- temp will
+ steal a reference to it */
+ temp = (PyArrayObject *) \
+ PyArray_NewFromDescr(&PyArray_Type, newtype, self->nd,
+ self->dimensions, self->strides,
+ self->data, self->flags, NULL);
+ if (temp == NULL) return -1;
+ PyDimMem_FREE(self->dimensions);
+ self->dimensions = temp->dimensions;
+ self->nd = temp->nd;
+ self->strides = temp->strides;
+ newtype = temp->descr;
+ Py_INCREF(temp->descr);
+ /* Fool deallocator not to delete these*/
+ temp->nd = 0;
+ temp->dimensions = NULL;
+ Py_DECREF(temp);
+ }
+
+ self->descr = newtype;
+ PyArray_UpdateFlags(self, UPDATE_ALL);
+
+ return 0;
fail:
- PyErr_SetString(PyExc_ValueError, msg);
- Py_DECREF(newtype);
- return -1;
+ PyErr_SetString(PyExc_ValueError, msg);
+ Py_DECREF(newtype);
+ return -1;
}
static PyObject *
array_struct_get(PyArrayObject *self)
{
- PyArrayInterface *inter;
-
- inter = (PyArrayInterface *)_pya_malloc(sizeof(PyArrayInterface));
- if (inter==NULL) return PyErr_NoMemory();
- inter->two = 2;
- inter->nd = self->nd;
- inter->typekind = self->descr->kind;
- inter->itemsize = self->descr->elsize;
- inter->flags = self->flags;
- /* reset unused flags */
- inter->flags &= ~(UPDATEIFCOPY | OWNDATA);
- if (PyArray_ISNOTSWAPPED(self)) inter->flags |= NOTSWAPPED;
- /* Copy shape and strides over since these can be reset
- when the array is "reshaped".
- */
- if (self->nd > 0) {
- inter->shape = (intp *)_pya_malloc(2*sizeof(intp)*self->nd);
- if (inter->shape == NULL) {
- _pya_free(inter);
- return PyErr_NoMemory();
- }
- inter->strides = inter->shape + self->nd;
- memcpy(inter->shape, self->dimensions, sizeof(intp)*self->nd);
- memcpy(inter->strides, self->strides, sizeof(intp)*self->nd);
- }
- else {
- inter->shape = NULL;
- inter->strides = NULL;
- }
- inter->data = self->data;
- if (self->descr->names) {
- inter->descr = arraydescr_protocol_descr_get(self->descr);
- if (inter->descr == NULL) PyErr_Clear();
- else inter->flags &= ARR_HAS_DESCR;
- }
- else inter->descr = NULL;
- Py_INCREF(self);
- return PyCObject_FromVoidPtrAndDesc(inter, self, gentype_struct_free);
+ PyArrayInterface *inter;
+
+ inter = (PyArrayInterface *)_pya_malloc(sizeof(PyArrayInterface));
+ if (inter==NULL) return PyErr_NoMemory();
+ inter->two = 2;
+ inter->nd = self->nd;
+ inter->typekind = self->descr->kind;
+ inter->itemsize = self->descr->elsize;
+ inter->flags = self->flags;
+ /* reset unused flags */
+ inter->flags &= ~(UPDATEIFCOPY | OWNDATA);
+ if (PyArray_ISNOTSWAPPED(self)) inter->flags |= NOTSWAPPED;
+ /* Copy shape and strides over since these can be reset
+ when the array is "reshaped".
+ */
+ if (self->nd > 0) {
+ inter->shape = (intp *)_pya_malloc(2*sizeof(intp)*self->nd);
+ if (inter->shape == NULL) {
+ _pya_free(inter);
+ return PyErr_NoMemory();
+ }
+ inter->strides = inter->shape + self->nd;
+ memcpy(inter->shape, self->dimensions, sizeof(intp)*self->nd);
+ memcpy(inter->strides, self->strides, sizeof(intp)*self->nd);
+ }
+ else {
+ inter->shape = NULL;
+ inter->strides = NULL;
+ }
+ inter->data = self->data;
+ if (self->descr->names) {
+ inter->descr = arraydescr_protocol_descr_get(self->descr);
+ if (inter->descr == NULL) PyErr_Clear();
+ else inter->flags &= ARR_HAS_DESCR;
+ }
+ else inter->descr = NULL;
+ Py_INCREF(self);
+ return PyCObject_FromVoidPtrAndDesc(inter, self, gentype_struct_free);
}
static PyObject *
array_base_get(PyArrayObject *self)
{
- if (self->base == NULL) {
- Py_INCREF(Py_None);
- return Py_None;
- }
- else {
- Py_INCREF(self->base);
- return self->base;
- }
+ if (self->base == NULL) {
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
+ else {
+ Py_INCREF(self->base);
+ return self->base;
+ }
}
/* Create a view of a complex array with an equivalent data-type
@@ -6451,197 +6450,197 @@ array_base_get(PyArrayObject *self)
static PyArrayObject *
_get_part(PyArrayObject *self, int imag)
{
- PyArray_Descr *type;
- PyArrayObject *ret;
- int offset;
+ PyArray_Descr *type;
+ PyArrayObject *ret;
+ int offset;
- type = PyArray_DescrFromType(self->descr->type_num -
- PyArray_NUM_FLOATTYPE);
- offset = (imag ? type->elsize : 0);
-
- if (!PyArray_ISNBO(self->descr->byteorder)) {
- PyArray_Descr *new;
- new = PyArray_DescrNew(type);
- new->byteorder = self->descr->byteorder;
- Py_DECREF(type);
- type = new;
- }
- ret = (PyArrayObject *) \
- PyArray_NewFromDescr(self->ob_type,
- type,
- self->nd,
- self->dimensions,
- self->strides,
- self->data + offset,
- self->flags, (PyObject *)self);
- if (ret == NULL) return NULL;
- ret->flags &= ~CONTIGUOUS;
- ret->flags &= ~FORTRAN;
- Py_INCREF(self);
- ret->base = (PyObject *)self;
- return ret;
+ type = PyArray_DescrFromType(self->descr->type_num -
+ PyArray_NUM_FLOATTYPE);
+ offset = (imag ? type->elsize : 0);
+
+ if (!PyArray_ISNBO(self->descr->byteorder)) {
+ PyArray_Descr *new;
+ new = PyArray_DescrNew(type);
+ new->byteorder = self->descr->byteorder;
+ Py_DECREF(type);
+ type = new;
+ }
+ ret = (PyArrayObject *) \
+ PyArray_NewFromDescr(self->ob_type,
+ type,
+ self->nd,
+ self->dimensions,
+ self->strides,
+ self->data + offset,
+ self->flags, (PyObject *)self);
+ if (ret == NULL) return NULL;
+ ret->flags &= ~CONTIGUOUS;
+ ret->flags &= ~FORTRAN;
+ Py_INCREF(self);
+ ret->base = (PyObject *)self;
+ return ret;
}
static PyObject *
array_real_get(PyArrayObject *self)
{
- PyArrayObject *ret;
+ PyArrayObject *ret;
- if (PyArray_ISCOMPLEX(self)) {
- ret = _get_part(self, 0);
- return (PyObject *)ret;
- }
- else {
- Py_INCREF(self);
- return (PyObject *)self;
- }
+ if (PyArray_ISCOMPLEX(self)) {
+ ret = _get_part(self, 0);
+ return (PyObject *)ret;
+ }
+ else {
+ Py_INCREF(self);
+ return (PyObject *)self;
+ }
}
static int
array_real_set(PyArrayObject *self, PyObject *val)
{
- PyArrayObject *ret;
- PyArrayObject *new;
- int rint;
+ PyArrayObject *ret;
+ PyArrayObject *new;
+ int rint;
- if (PyArray_ISCOMPLEX(self)) {
- ret = _get_part(self, 0);
- if (ret == NULL) return -1;
- }
- else {
- Py_INCREF(self);
- ret = self;
- }
- new = (PyArrayObject *)PyArray_FromAny(val, NULL, 0, 0, 0, NULL);
- if (new == NULL) {Py_DECREF(ret); return -1;}
- rint = PyArray_MoveInto(ret, new);
- Py_DECREF(ret);
- Py_DECREF(new);
- return rint;
+ if (PyArray_ISCOMPLEX(self)) {
+ ret = _get_part(self, 0);
+ if (ret == NULL) return -1;
+ }
+ else {
+ Py_INCREF(self);
+ ret = self;
+ }
+ new = (PyArrayObject *)PyArray_FromAny(val, NULL, 0, 0, 0, NULL);
+ if (new == NULL) {Py_DECREF(ret); return -1;}
+ rint = PyArray_MoveInto(ret, new);
+ Py_DECREF(ret);
+ Py_DECREF(new);
+ return rint;
}
static PyObject *
array_imag_get(PyArrayObject *self)
{
- PyArrayObject *ret;
- PyArray_Descr *type;
+ PyArrayObject *ret;
+ PyArray_Descr *type;
- if (PyArray_ISCOMPLEX(self)) {
- ret = _get_part(self, 1);
- return (PyObject *) ret;
- }
+ if (PyArray_ISCOMPLEX(self)) {
+ ret = _get_part(self, 1);
+ return (PyObject *) ret;
+ }
+ else {
+ type = self->descr;
+ Py_INCREF(type);
+ ret = (PyArrayObject *)PyArray_Zeros(self->nd,
+ self->dimensions,
+ type,
+ PyArray_ISFORTRAN(self));
+ ret->flags &= ~WRITEABLE;
+ if (PyArray_CheckExact(self))
+ return (PyObject *)ret;
else {
- type = self->descr;
- Py_INCREF(type);
- ret = (PyArrayObject *)PyArray_Zeros(self->nd,
- self->dimensions,
- type,
- PyArray_ISFORTRAN(self));
- ret->flags &= ~WRITEABLE;
- if (PyArray_CheckExact(self))
- return (PyObject *)ret;
- else {
- PyObject *newret;
- newret = PyArray_View(ret, NULL, self->ob_type);
- Py_DECREF(ret);
- return newret;
- }
+ PyObject *newret;
+ newret = PyArray_View(ret, NULL, self->ob_type);
+ Py_DECREF(ret);
+ return newret;
}
+ }
}
static int
array_imag_set(PyArrayObject *self, PyObject *val)
{
- if (PyArray_ISCOMPLEX(self)) {
- PyArrayObject *ret;
- PyArrayObject *new;
- int rint;
-
- ret = _get_part(self, 1);
- if (ret == NULL) return -1;
- new = (PyArrayObject *)PyArray_FromAny(val, NULL, 0, 0, 0, NULL);
- if (new == NULL) {Py_DECREF(ret); return -1;}
- rint = PyArray_MoveInto(ret, new);
- Py_DECREF(ret);
- Py_DECREF(new);
- return rint;
- }
- else {
- PyErr_SetString(PyExc_TypeError, "array does not have "\
- "imaginary part to set");
- return -1;
- }
+ if (PyArray_ISCOMPLEX(self)) {
+ PyArrayObject *ret;
+ PyArrayObject *new;
+ int rint;
+
+ ret = _get_part(self, 1);
+ if (ret == NULL) return -1;
+ new = (PyArrayObject *)PyArray_FromAny(val, NULL, 0, 0, 0, NULL);
+ if (new == NULL) {Py_DECREF(ret); return -1;}
+ rint = PyArray_MoveInto(ret, new);
+ Py_DECREF(ret);
+ Py_DECREF(new);
+ return rint;
+ }
+ else {
+ PyErr_SetString(PyExc_TypeError, "array does not have "\
+ "imaginary part to set");
+ return -1;
+ }
}
static PyObject *
array_flat_get(PyArrayObject *self)
{
- return PyArray_IterNew((PyObject *)self);
+ return PyArray_IterNew((PyObject *)self);
}
static int
array_flat_set(PyArrayObject *self, PyObject *val)
{
- PyObject *arr=NULL;
- int retval = -1;
- PyArrayIterObject *selfit=NULL, *arrit=NULL;
- PyArray_Descr *typecode;
- int swap;
- PyArray_CopySwapFunc *copyswap;
-
- typecode = self->descr;
- Py_INCREF(typecode);
- arr = PyArray_FromAny(val, typecode,
- 0, 0, FORCECAST | FORTRAN_IF(self), NULL);
- if (arr == NULL) return -1;
- arrit = (PyArrayIterObject *)PyArray_IterNew(arr);
- if (arrit == NULL) goto exit;
- selfit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);
- if (selfit == NULL) goto exit;
-
- if (arrit->size == 0) {retval = 0; goto exit;}
-
- swap = PyArray_ISNOTSWAPPED(self) != PyArray_ISNOTSWAPPED(arr);
- copyswap = self->descr->f->copyswap;
- if (PyDataType_REFCHK(self->descr)) {
- while(selfit->index < selfit->size) {
- PyArray_Item_XDECREF(selfit->dataptr, self->descr);
- PyArray_Item_INCREF(arrit->dataptr, PyArray_DESCR(arr));
- memmove(selfit->dataptr, arrit->dataptr,
- sizeof(PyObject **));
- if (swap)
- copyswap(selfit->dataptr, NULL, swap, self);
- PyArray_ITER_NEXT(selfit);
- PyArray_ITER_NEXT(arrit);
- if (arrit->index == arrit->size)
- PyArray_ITER_RESET(arrit);
- }
- retval = 0;
- goto exit;
- }
-
+ PyObject *arr=NULL;
+ int retval = -1;
+ PyArrayIterObject *selfit=NULL, *arrit=NULL;
+ PyArray_Descr *typecode;
+ int swap;
+ PyArray_CopySwapFunc *copyswap;
+
+ typecode = self->descr;
+ Py_INCREF(typecode);
+ arr = PyArray_FromAny(val, typecode,
+ 0, 0, FORCECAST | FORTRAN_IF(self), NULL);
+ if (arr == NULL) return -1;
+ arrit = (PyArrayIterObject *)PyArray_IterNew(arr);
+ if (arrit == NULL) goto exit;
+ selfit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);
+ if (selfit == NULL) goto exit;
+
+ if (arrit->size == 0) {retval = 0; goto exit;}
+
+ swap = PyArray_ISNOTSWAPPED(self) != PyArray_ISNOTSWAPPED(arr);
+ copyswap = self->descr->f->copyswap;
+ if (PyDataType_REFCHK(self->descr)) {
while(selfit->index < selfit->size) {
- memmove(selfit->dataptr, arrit->dataptr, self->descr->elsize);
- if (swap)
- copyswap(selfit->dataptr, NULL, swap, self);
- PyArray_ITER_NEXT(selfit);
- PyArray_ITER_NEXT(arrit);
- if (arrit->index == arrit->size)
- PyArray_ITER_RESET(arrit);
+ PyArray_Item_XDECREF(selfit->dataptr, self->descr);
+ PyArray_Item_INCREF(arrit->dataptr, PyArray_DESCR(arr));
+ memmove(selfit->dataptr, arrit->dataptr,
+ sizeof(PyObject **));
+ if (swap)
+ copyswap(selfit->dataptr, NULL, swap, self);
+ PyArray_ITER_NEXT(selfit);
+ PyArray_ITER_NEXT(arrit);
+ if (arrit->index == arrit->size)
+ PyArray_ITER_RESET(arrit);
}
retval = 0;
+ goto exit;
+ }
+
+ while(selfit->index < selfit->size) {
+ memmove(selfit->dataptr, arrit->dataptr, self->descr->elsize);
+ if (swap)
+ copyswap(selfit->dataptr, NULL, swap, self);
+ PyArray_ITER_NEXT(selfit);
+ PyArray_ITER_NEXT(arrit);
+ if (arrit->index == arrit->size)
+ PyArray_ITER_RESET(arrit);
+ }
+ retval = 0;
exit:
- Py_XDECREF(selfit);
- Py_XDECREF(arrit);
- Py_XDECREF(arr);
- return retval;
+ Py_XDECREF(selfit);
+ Py_XDECREF(arrit);
+ Py_XDECREF(arr);
+ return retval;
}
static PyObject *
array_transpose_get(PyArrayObject *self)
{
- return PyArray_Transpose(self, NULL);
+ return PyArray_Transpose(self, NULL);
}
/* If this is None, no function call is made
@@ -6650,76 +6649,76 @@ array_transpose_get(PyArrayObject *self)
static PyObject *
array_finalize_get(PyArrayObject *self)
{
- Py_INCREF(Py_None);
- return Py_None;
+ Py_INCREF(Py_None);
+ return Py_None;
}
static PyGetSetDef array_getsetlist[] = {
- {"ndim",
- (getter)array_ndim_get,
- NULL, NULL},
- {"flags",
- (getter)array_flags_get,
- NULL, NULL},
- {"shape",
- (getter)array_shape_get,
- (setter)array_shape_set,
- NULL},
- {"strides",
- (getter)array_strides_get,
- (setter)array_strides_set,
- NULL},
- {"data",
- (getter)array_data_get,
- (setter)array_data_set,
- NULL},
- {"itemsize",
- (getter)array_itemsize_get,
- NULL, NULL},
- {"size",
- (getter)array_size_get,
- NULL, NULL},
- {"nbytes",
- (getter)array_nbytes_get,
- NULL, NULL},
- {"base",
- (getter)array_base_get,
- NULL, NULL},
- {"dtype",
- (getter)array_descr_get,
- (setter)array_descr_set,
- NULL},
- {"real",
- (getter)array_real_get,
- (setter)array_real_set,
- NULL},
- {"imag",
- (getter)array_imag_get,
- (setter)array_imag_set,
- NULL},
- {"flat",
- (getter)array_flat_get,
- (setter)array_flat_set,
- NULL},
- {"ctypes",
- (getter)array_ctypes_get,
- NULL, NULL},
- {"T",
- (getter)array_transpose_get,
- NULL, NULL},
- {"__array_interface__",
- (getter)array_interface_get,
- NULL, NULL},
- {"__array_struct__",
- (getter)array_struct_get,
- NULL, NULL},
- {"__array_priority__",
- (getter)array_priority_get,
- NULL, NULL},
- {"__array_finalize__",
- (getter)array_finalize_get,
- NULL, NULL},
- {NULL, NULL, NULL, NULL}, /* Sentinel */
+ {"ndim",
+ (getter)array_ndim_get,
+ NULL, NULL},
+ {"flags",
+ (getter)array_flags_get,
+ NULL, NULL},
+ {"shape",
+ (getter)array_shape_get,
+ (setter)array_shape_set,
+ NULL},
+ {"strides",
+ (getter)array_strides_get,
+ (setter)array_strides_set,
+ NULL},
+ {"data",
+ (getter)array_data_get,
+ (setter)array_data_set,
+ NULL},
+ {"itemsize",
+ (getter)array_itemsize_get,
+ NULL, NULL},
+ {"size",
+ (getter)array_size_get,
+ NULL, NULL},
+ {"nbytes",
+ (getter)array_nbytes_get,
+ NULL, NULL},
+ {"base",
+ (getter)array_base_get,
+ NULL, NULL},
+ {"dtype",
+ (getter)array_descr_get,
+ (setter)array_descr_set,
+ NULL},
+ {"real",
+ (getter)array_real_get,
+ (setter)array_real_set,
+ NULL},
+ {"imag",
+ (getter)array_imag_get,
+ (setter)array_imag_set,
+ NULL},
+ {"flat",
+ (getter)array_flat_get,
+ (setter)array_flat_set,
+ NULL},
+ {"ctypes",
+ (getter)array_ctypes_get,
+ NULL, NULL},
+ {"T",
+ (getter)array_transpose_get,
+ NULL, NULL},
+ {"__array_interface__",
+ (getter)array_interface_get,
+ NULL, NULL},
+ {"__array_struct__",
+ (getter)array_struct_get,
+ NULL, NULL},
+ {"__array_priority__",
+ (getter)array_priority_get,
+ NULL, NULL},
+ {"__array_finalize__",
+ (getter)array_finalize_get,
+ NULL, NULL},
+ {NULL, NULL, NULL, NULL}, /* Sentinel */
};
/****************** end of attribute get and set routines *******************/
@@ -6728,73 +6727,73 @@ static PyGetSetDef array_getsetlist[] = {
static PyObject *
array_alloc(PyTypeObject *type, Py_ssize_t nitems)
{
- PyObject *obj;
- /* nitems will always be 0 */
- obj = (PyObject *)_pya_malloc(sizeof(PyArrayObject));
- PyObject_Init(obj, type);
- return obj;
+ PyObject *obj;
+ /* nitems will always be 0 */
+ obj = (PyObject *)_pya_malloc(sizeof(PyArrayObject));
+ PyObject_Init(obj, type);
+ return obj;
}
static PyTypeObject PyArray_Type = {
- PyObject_HEAD_INIT(NULL)
- 0, /*ob_size*/
- "numpy.ndarray", /*tp_name*/
- sizeof(PyArrayObject), /*tp_basicsize*/
- 0, /*tp_itemsize*/
- /* methods */
- (destructor)array_dealloc, /*tp_dealloc */
- (printfunc)NULL, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- (cmpfunc)0, /*tp_compare*/
- (reprfunc)array_repr, /*tp_repr*/
- &array_as_number, /*tp_as_number*/
- &array_as_sequence, /*tp_as_sequence*/
- &array_as_mapping, /*tp_as_mapping*/
- (hashfunc)0, /*tp_hash*/
- (ternaryfunc)0, /*tp_call*/
- (reprfunc)array_str, /*tp_str*/
-
- (getattrofunc)0, /*tp_getattro*/
- (setattrofunc)0, /*tp_setattro*/
- &array_as_buffer, /*tp_as_buffer*/
- (Py_TPFLAGS_DEFAULT
- | Py_TPFLAGS_BASETYPE
- | Py_TPFLAGS_CHECKTYPES), /*tp_flags*/
- /*Documentation string */
- 0, /*tp_doc*/
-
- (traverseproc)0, /*tp_traverse */
- (inquiry)0, /*tp_clear */
- (richcmpfunc)array_richcompare, /*tp_richcompare */
- offsetof(PyArrayObject, weakreflist), /*tp_weaklistoffset */
-
- /* Iterator support (use standard) */
-
- (getiterfunc)array_iter, /* tp_iter */
- (iternextfunc)0, /* tp_iternext */
-
- /* Sub-classing (new-style object) support */
-
- array_methods, /* tp_methods */
- 0, /* tp_members */
- array_getsetlist, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)0, /* tp_init */
- array_alloc, /* tp_alloc */
- (newfunc)array_new, /* tp_new */
- 0, /* tp_free */
- 0, /* tp_is_gc */
- 0, /* tp_bases */
- 0, /* tp_mro */
- 0, /* tp_cache */
- 0, /* tp_subclasses */
- 0 /* tp_weaklist */
+ PyObject_HEAD_INIT(NULL)
+ 0, /*ob_size*/
+ "numpy.ndarray", /*tp_name*/
+ sizeof(PyArrayObject), /*tp_basicsize*/
+ 0, /*tp_itemsize*/
+ /* methods */
+ (destructor)array_dealloc, /*tp_dealloc */
+ (printfunc)NULL, /*tp_print*/
+ 0, /*tp_getattr*/
+ 0, /*tp_setattr*/
+ (cmpfunc)0, /*tp_compare*/
+ (reprfunc)array_repr, /*tp_repr*/
+ &array_as_number, /*tp_as_number*/
+ &array_as_sequence, /*tp_as_sequence*/
+ &array_as_mapping, /*tp_as_mapping*/
+ (hashfunc)0, /*tp_hash*/
+ (ternaryfunc)0, /*tp_call*/
+ (reprfunc)array_str, /*tp_str*/
+
+ (getattrofunc)0, /*tp_getattro*/
+ (setattrofunc)0, /*tp_setattro*/
+ &array_as_buffer, /*tp_as_buffer*/
+ (Py_TPFLAGS_DEFAULT
+ | Py_TPFLAGS_BASETYPE
+ | Py_TPFLAGS_CHECKTYPES), /*tp_flags*/
+ /*Documentation string */
+ 0, /*tp_doc*/
+
+ (traverseproc)0, /*tp_traverse */
+ (inquiry)0, /*tp_clear */
+ (richcmpfunc)array_richcompare, /*tp_richcompare */
+ offsetof(PyArrayObject, weakreflist), /*tp_weaklistoffset */
+
+ /* Iterator support (use standard) */
+
+ (getiterfunc)array_iter, /* tp_iter */
+ (iternextfunc)0, /* tp_iternext */
+
+ /* Sub-classing (new-style object) support */
+
+ array_methods, /* tp_methods */
+ 0, /* tp_members */
+ array_getsetlist, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)0, /* tp_init */
+ array_alloc, /* tp_alloc */
+ (newfunc)array_new, /* tp_new */
+ 0, /* tp_free */
+ 0, /* tp_is_gc */
+ 0, /* tp_bases */
+ 0, /* tp_mro */
+ 0, /* tp_cache */
+ 0, /* tp_subclasses */
+ 0 /* tp_weaklist */
};
/* The rest of this code is to build the right kind of array from a python */
@@ -6803,78 +6802,78 @@ static PyTypeObject PyArray_Type = {
static int
discover_depth(PyObject *s, int max, int stop_at_string, int stop_at_tuple)
{
- int d=0;
- PyObject *e;
-
- if(max < 1) return -1;
-
- if(! PySequence_Check(s) || PyInstance_Check(s) || \
- PySequence_Length(s) < 0) {
- PyErr_Clear(); return 0;
- }
- if (PyArray_Check(s))
- return PyArray_NDIM(s);
- if (PyArray_IsScalar(s, Generic)) return 0;
- if (PyString_Check(s) || PyBuffer_Check(s) || PyUnicode_Check(s))
- return stop_at_string ? 0:1;
- if (stop_at_tuple && PyTuple_Check(s)) return 0;
- if ((e=PyObject_GetAttrString(s, "__array_struct__")) != NULL) {
- d = -1;
- if (PyCObject_Check(e)) {
- PyArrayInterface *inter;
- inter = (PyArrayInterface *)PyCObject_AsVoidPtr(e);
- if (inter->two == 2) {
- d = inter->nd;
- }
- }
- Py_DECREF(e);
- if (d > -1) return d;
- }
- else PyErr_Clear();
- if ((e=PyObject_GetAttrString(s, "__array_interface__")) != NULL) {
- d = -1;
- if (PyDict_Check(e)) {
- PyObject *new;
- new = PyDict_GetItemString(e, "shape");
- if (new && PyTuple_Check(new))
- d = PyTuple_GET_SIZE(new);
- }
- Py_DECREF(e);
- if (d>-1) return d;
- }
- else PyErr_Clear();
+ int d=0;
+ PyObject *e;
+
+ if(max < 1) return -1;
- if (PySequence_Length(s) == 0)
- return 1;
- if ((e=PySequence_GetItem(s,0)) == NULL) return -1;
- if(e!=s) {
- d=discover_depth(e, max-1, stop_at_string, stop_at_tuple);
- if(d >= 0) d++;
+ if(! PySequence_Check(s) || PyInstance_Check(s) || \
+ PySequence_Length(s) < 0) {
+ PyErr_Clear(); return 0;
+ }
+ if (PyArray_Check(s))
+ return PyArray_NDIM(s);
+ if (PyArray_IsScalar(s, Generic)) return 0;
+ if (PyString_Check(s) || PyBuffer_Check(s) || PyUnicode_Check(s))
+ return stop_at_string ? 0:1;
+ if (stop_at_tuple && PyTuple_Check(s)) return 0;
+ if ((e=PyObject_GetAttrString(s, "__array_struct__")) != NULL) {
+ d = -1;
+ if (PyCObject_Check(e)) {
+ PyArrayInterface *inter;
+ inter = (PyArrayInterface *)PyCObject_AsVoidPtr(e);
+ if (inter->two == 2) {
+ d = inter->nd;
+ }
+ }
+ Py_DECREF(e);
+ if (d > -1) return d;
+ }
+ else PyErr_Clear();
+ if ((e=PyObject_GetAttrString(s, "__array_interface__")) != NULL) {
+ d = -1;
+ if (PyDict_Check(e)) {
+ PyObject *new;
+ new = PyDict_GetItemString(e, "shape");
+ if (new && PyTuple_Check(new))
+ d = PyTuple_GET_SIZE(new);
}
Py_DECREF(e);
- return d;
+ if (d>-1) return d;
+ }
+ else PyErr_Clear();
+
+ if (PySequence_Length(s) == 0)
+ return 1;
+ if ((e=PySequence_GetItem(s,0)) == NULL) return -1;
+ if(e!=s) {
+ d=discover_depth(e, max-1, stop_at_string, stop_at_tuple);
+ if(d >= 0) d++;
+ }
+ Py_DECREF(e);
+ return d;
}
static int
discover_itemsize(PyObject *s, int nd, int *itemsize)
{
- int n, r, i;
- PyObject *e;
+ int n, r, i;
+ PyObject *e;
- n = PyObject_Length(s);
+ n = PyObject_Length(s);
- if ((nd == 0) || PyString_Check(s) || \
- PyUnicode_Check(s) || PyBuffer_Check(s)) {
- *itemsize = MAX(*itemsize, n);
- return 0;
- }
- for (i=0; i<n; i++) {
- if ((e=PySequence_GetItem(s,i))==NULL) return -1;
- r=discover_itemsize(e,nd-1,itemsize);
- Py_DECREF(e);
- if (r == -1) return -1;
- }
+ if ((nd == 0) || PyString_Check(s) || \
+ PyUnicode_Check(s) || PyBuffer_Check(s)) {
+ *itemsize = MAX(*itemsize, n);
return 0;
+ }
+ for (i=0; i<n; i++) {
+ if ((e=PySequence_GetItem(s,i))==NULL) return -1;
+ r=discover_itemsize(e,nd-1,itemsize);
+ Py_DECREF(e);
+ if (r == -1) return -1;
+ }
+ return 0;
}
/* Take an arbitrary object known to represent
@@ -6884,30 +6883,30 @@ discover_itemsize(PyObject *s, int nd, int *itemsize)
static int
discover_dimensions(PyObject *s, int nd, intp *d, int check_it)
{
- PyObject *e;
- int r, n, i, n_lower;
-
- n=PyObject_Length(s);
- *d = n;
- if(*d < 0) return -1;
- if(nd <= 1) return 0;
- n_lower = 0;
- for(i=0; i<n; i++) {
- if ((e=PySequence_GetItem(s,i)) == NULL) return -1;
- r=discover_dimensions(e,nd-1,d+1,check_it);
- Py_DECREF(e);
-
- if (r == -1) return -1;
- if (check_it && n_lower != 0 && n_lower != d[1]) {
- PyErr_SetString(PyExc_ValueError,
- "inconsistent shape in sequence");
- return -1;
- }
- if (d[1] > n_lower) n_lower = d[1];
+ PyObject *e;
+ int r, n, i, n_lower;
+
+ n=PyObject_Length(s);
+ *d = n;
+ if(*d < 0) return -1;
+ if(nd <= 1) return 0;
+ n_lower = 0;
+ for(i=0; i<n; i++) {
+ if ((e=PySequence_GetItem(s,i)) == NULL) return -1;
+ r=discover_dimensions(e,nd-1,d+1,check_it);
+ Py_DECREF(e);
+
+ if (r == -1) return -1;
+ if (check_it && n_lower != 0 && n_lower != d[1]) {
+ PyErr_SetString(PyExc_ValueError,
+ "inconsistent shape in sequence");
+ return -1;
}
- d[1] = n_lower;
+ if (d[1] > n_lower) n_lower = d[1];
+ }
+ d[1] = n_lower;
- return 0;
+ return 0;
}
/* new reference */
@@ -6916,62 +6915,62 @@ discover_dimensions(PyObject *s, int nd, intp *d, int check_it)
static PyArray_Descr *
_array_small_type(PyArray_Descr *chktype, PyArray_Descr* mintype)
{
- PyArray_Descr *outtype;
- int outtype_num, save_num;
+ PyArray_Descr *outtype;
+ int outtype_num, save_num;
- if (PyArray_EquivTypes(chktype, mintype)) {
- Py_INCREF(mintype);
- return mintype;
- }
+ if (PyArray_EquivTypes(chktype, mintype)) {
+ Py_INCREF(mintype);
+ return mintype;
+ }
- if (chktype->type_num > mintype->type_num)
- outtype_num = chktype->type_num;
+ if (chktype->type_num > mintype->type_num)
+ outtype_num = chktype->type_num;
+ else {
+ if (PyDataType_ISOBJECT(chktype) && \
+ PyDataType_ISSTRING(mintype)) {
+ return PyArray_DescrFromType(NPY_OBJECT);
+ }
else {
- if (PyDataType_ISOBJECT(chktype) && \
- PyDataType_ISSTRING(mintype)) {
- return PyArray_DescrFromType(NPY_OBJECT);
- }
- else {
- outtype_num = mintype->type_num;
- }
+ outtype_num = mintype->type_num;
}
+ }
- save_num = outtype_num;
- while(outtype_num < PyArray_NTYPES &&
- !(PyArray_CanCastSafely(chktype->type_num, outtype_num)
- && PyArray_CanCastSafely(mintype->type_num, outtype_num)))
- outtype_num++;
- if (outtype_num == PyArray_NTYPES) {
- outtype = PyArray_DescrFromType(save_num);
+ save_num = outtype_num;
+ while(outtype_num < PyArray_NTYPES &&
+ !(PyArray_CanCastSafely(chktype->type_num, outtype_num)
+ && PyArray_CanCastSafely(mintype->type_num, outtype_num)))
+ outtype_num++;
+ if (outtype_num == PyArray_NTYPES) {
+ outtype = PyArray_DescrFromType(save_num);
+ }
+ else {
+ outtype = PyArray_DescrFromType(outtype_num);
+ }
+ if (PyTypeNum_ISEXTENDED(outtype->type_num)) {
+ int testsize = outtype->elsize;
+ register int chksize, minsize;
+ chksize = chktype->elsize;
+ minsize = mintype->elsize;
+ /* Handle string->unicode case separately
+ because string itemsize is 4* as large */
+ if (outtype->type_num == PyArray_UNICODE &&
+ mintype->type_num == PyArray_STRING) {
+ testsize = MAX(chksize, 4*minsize);
}
else {
- outtype = PyArray_DescrFromType(outtype_num);
- }
- if (PyTypeNum_ISEXTENDED(outtype->type_num)) {
- int testsize = outtype->elsize;
- register int chksize, minsize;
- chksize = chktype->elsize;
- minsize = mintype->elsize;
- /* Handle string->unicode case separately
- because string itemsize is 4* as large */
- if (outtype->type_num == PyArray_UNICODE &&
- mintype->type_num == PyArray_STRING) {
- testsize = MAX(chksize, 4*minsize);
- }
- else {
- testsize = MAX(chksize, minsize);
- }
- if (testsize != outtype->elsize) {
- PyArray_DESCR_REPLACE(outtype);
- outtype->elsize = testsize;
- Py_XDECREF(outtype->fields);
- outtype->fields = NULL;
- Py_XDECREF(outtype->names);
- outtype->names = NULL;
- }
+ testsize = MAX(chksize, minsize);
+ }
+ if (testsize != outtype->elsize) {
+ PyArray_DESCR_REPLACE(outtype);
+ outtype->elsize = testsize;
+ Py_XDECREF(outtype->fields);
+ outtype->fields = NULL;
+ Py_XDECREF(outtype->names);
+ outtype->names = NULL;
}
- return outtype;
+ }
+ return outtype;
}
static PyArray_Descr *
@@ -6979,26 +6978,26 @@ _array_find_python_scalar_type(PyObject *op)
{
if (PyFloat_Check(op)) {
return PyArray_DescrFromType(PyArray_DOUBLE);
- }
+ }
else if (PyComplex_Check(op)) {
- return PyArray_DescrFromType(PyArray_CDOUBLE);
- }
+ return PyArray_DescrFromType(PyArray_CDOUBLE);
+ }
else if (PyInt_Check(op)) {
- /* bools are a subclass of int */
- if (PyBool_Check(op)) {
- return PyArray_DescrFromType(PyArray_BOOL);
- } else {
- return PyArray_DescrFromType(PyArray_LONG);
- }
- }
+ /* bools are a subclass of int */
+ if (PyBool_Check(op)) {
+ return PyArray_DescrFromType(PyArray_BOOL);
+ } else {
+ return PyArray_DescrFromType(PyArray_LONG);
+ }
+ }
else if (PyLong_Check(op)) {
- /* if integer can fit into a longlong then return that
- */
- if ((PyLong_AsLongLong(op) == -1) && PyErr_Occurred()) {
- PyErr_Clear();
- return PyArray_DescrFromType(PyArray_OBJECT);
- }
- return PyArray_DescrFromType(PyArray_LONGLONG);
+ /* if integer can fit into a longlong then return that
+ */
+ if ((PyLong_AsLongLong(op) == -1) && PyErr_Occurred()) {
+ PyErr_Clear();
+ return PyArray_DescrFromType(PyArray_OBJECT);
+ }
+ return PyArray_DescrFromType(PyArray_LONGLONG);
}
return NULL;
}
@@ -7006,23 +7005,23 @@ _array_find_python_scalar_type(PyObject *op)
static PyArray_Descr *
_use_default_type(PyObject *op)
{
- int typenum, l;
- PyObject *type;
-
- typenum = -1;
- l = 0;
- type = (PyObject *)op->ob_type;
- while (l < PyArray_NUMUSERTYPES) {
- if (type == (PyObject *)(userdescrs[l]->typeobj)) {
- typenum = l + PyArray_USERDEF;
- break;
- }
- l++;
- }
- if (typenum == -1) {
- typenum = PyArray_OBJECT;
+ int typenum, l;
+ PyObject *type;
+
+ typenum = -1;
+ l = 0;
+ type = (PyObject *)op->ob_type;
+ while (l < PyArray_NUMUSERTYPES) {
+ if (type == (PyObject *)(userdescrs[l]->typeobj)) {
+ typenum = l + PyArray_USERDEF;
+ break;
}
- return PyArray_DescrFromType(typenum);
+ l++;
+ }
+ if (typenum == -1) {
+ typenum = PyArray_OBJECT;
+ }
+ return PyArray_DescrFromType(typenum);
}
@@ -7038,208 +7037,208 @@ _use_default_type(PyObject *op)
static PyArray_Descr *
_array_find_type(PyObject *op, PyArray_Descr *minitype, int max)
{
- int l;
- PyObject *ip;
- PyArray_Descr *chktype=NULL;
- PyArray_Descr *outtype;
-
- /* These need to come first because if op already carries
- a descr structure, then we want it to be the result if minitype
- is NULL.
- */
+ int l;
+ PyObject *ip;
+ PyArray_Descr *chktype=NULL;
+ PyArray_Descr *outtype;
+
+ /* These need to come first because if op already carries
+ a descr structure, then we want it to be the result if minitype
+ is NULL.
+ */
+
+ if (PyArray_Check(op)) {
+ chktype = PyArray_DESCR(op);
+ Py_INCREF(chktype);
+ if (minitype == NULL) return chktype;
+ Py_INCREF(minitype);
+ goto finish;
+ }
- if (PyArray_Check(op)) {
- chktype = PyArray_DESCR(op);
- Py_INCREF(chktype);
- if (minitype == NULL) return chktype;
- Py_INCREF(minitype);
- goto finish;
- }
+ if (PyArray_IsScalar(op, Generic)) {
+ chktype = PyArray_DescrFromScalar(op);
+ if (minitype == NULL) return chktype;
+ Py_INCREF(minitype);
+ goto finish;
+ }
- if (PyArray_IsScalar(op, Generic)) {
- chktype = PyArray_DescrFromScalar(op);
- if (minitype == NULL) return chktype;
- Py_INCREF(minitype);
- goto finish;
- }
+ if (minitype == NULL) {
+ minitype = PyArray_DescrFromType(PyArray_BOOL);
+ }
+ else Py_INCREF(minitype);
- if (minitype == NULL) {
- minitype = PyArray_DescrFromType(PyArray_BOOL);
- }
- else Py_INCREF(minitype);
+ if (max < 0) goto deflt;
- if (max < 0) goto deflt;
+ chktype = _array_find_python_scalar_type(op);
+ if (chktype) {
+ goto finish;
+ }
- chktype = _array_find_python_scalar_type(op);
- if (chktype) {
- goto finish;
+ if ((ip=PyObject_GetAttrString(op, "__array_interface__"))!=NULL) {
+ if (PyDict_Check(ip)) {
+ PyObject *new;
+ new = PyDict_GetItemString(ip, "typestr");
+ if (new && PyString_Check(new)) {
+ chktype =_array_typedescr_fromstr \
+ (PyString_AS_STRING(new));
+ }
}
+ Py_DECREF(ip);
+ if (chktype) goto finish;
+ }
+ else PyErr_Clear();
- if ((ip=PyObject_GetAttrString(op, "__array_interface__"))!=NULL) {
- if (PyDict_Check(ip)) {
- PyObject *new;
- new = PyDict_GetItemString(ip, "typestr");
- if (new && PyString_Check(new)) {
- chktype =_array_typedescr_fromstr \
- (PyString_AS_STRING(new));
- }
- }
- Py_DECREF(ip);
- if (chktype) goto finish;
- }
- else PyErr_Clear();
-
- if ((ip=PyObject_GetAttrString(op, "__array_struct__")) != NULL) {
- PyArrayInterface *inter;
- char buf[40];
- if (PyCObject_Check(ip)) {
- inter=(PyArrayInterface *)PyCObject_AsVoidPtr(ip);
- if (inter->two == 2) {
- snprintf(buf, 40, "|%c%d", inter->typekind,
- inter->itemsize);
- chktype = _array_typedescr_fromstr(buf);
- }
- }
- Py_DECREF(ip);
- if (chktype) goto finish;
+ if ((ip=PyObject_GetAttrString(op, "__array_struct__")) != NULL) {
+ PyArrayInterface *inter;
+ char buf[40];
+ if (PyCObject_Check(ip)) {
+ inter=(PyArrayInterface *)PyCObject_AsVoidPtr(ip);
+ if (inter->two == 2) {
+ snprintf(buf, 40, "|%c%d", inter->typekind,
+ inter->itemsize);
+ chktype = _array_typedescr_fromstr(buf);
+ }
}
- else PyErr_Clear();
+ Py_DECREF(ip);
+ if (chktype) goto finish;
+ }
+ else PyErr_Clear();
- if (PyString_Check(op)) {
- chktype = PyArray_DescrNewFromType(PyArray_STRING);
- chktype->elsize = PyString_GET_SIZE(op);
- goto finish;
- }
+ if (PyString_Check(op)) {
+ chktype = PyArray_DescrNewFromType(PyArray_STRING);
+ chktype->elsize = PyString_GET_SIZE(op);
+ goto finish;
+ }
- if (PyUnicode_Check(op)) {
- chktype = PyArray_DescrNewFromType(PyArray_UNICODE);
- chktype->elsize = PyUnicode_GET_DATA_SIZE(op);
+ if (PyUnicode_Check(op)) {
+ chktype = PyArray_DescrNewFromType(PyArray_UNICODE);
+ chktype->elsize = PyUnicode_GET_DATA_SIZE(op);
#ifndef Py_UNICODE_WIDE
- chktype->elsize <<= 1;
+ chktype->elsize <<= 1;
#endif
- goto finish;
- }
+ goto finish;
+ }
- if (PyBuffer_Check(op)) {
- chktype = PyArray_DescrNewFromType(PyArray_VOID);
- chktype->elsize = op->ob_type->tp_as_sequence->sq_length(op);
- PyErr_Clear();
- goto finish;
- }
+ if (PyBuffer_Check(op)) {
+ chktype = PyArray_DescrNewFromType(PyArray_VOID);
+ chktype->elsize = op->ob_type->tp_as_sequence->sq_length(op);
+ PyErr_Clear();
+ goto finish;
+ }
- if (PyObject_HasAttrString(op, "__array__")) {
- ip = PyObject_CallMethod(op, "__array__", NULL);
- if(ip && PyArray_Check(ip)) {
- chktype = PyArray_DESCR(ip);
- Py_INCREF(chktype);
- Py_DECREF(ip);
- goto finish;
- }
- Py_XDECREF(ip);
- if (PyErr_Occurred()) PyErr_Clear();
+ if (PyObject_HasAttrString(op, "__array__")) {
+ ip = PyObject_CallMethod(op, "__array__", NULL);
+ if(ip && PyArray_Check(ip)) {
+ chktype = PyArray_DESCR(ip);
+ Py_INCREF(chktype);
+ Py_DECREF(ip);
+ goto finish;
}
+ Py_XDECREF(ip);
+ if (PyErr_Occurred()) PyErr_Clear();
+ }
- if (PyInstance_Check(op)) goto deflt;
+ if (PyInstance_Check(op)) goto deflt;
- if (PySequence_Check(op)) {
+ if (PySequence_Check(op)) {
- l = PyObject_Length(op);
- if (l < 0 && PyErr_Occurred()) {
- PyErr_Clear();
- goto deflt;
- }
- if (l == 0 && minitype->type_num == PyArray_BOOL) {
- Py_DECREF(minitype);
- minitype = PyArray_DescrFromType(PyArray_DEFAULT);
- }
- while (--l >= 0) {
- PyArray_Descr *newtype;
- ip = PySequence_GetItem(op, l);
- if (ip==NULL) {
- PyErr_Clear();
- goto deflt;
- }
- chktype = _array_find_type(ip, minitype, max-1);
- newtype = _array_small_type(chktype, minitype);
- Py_DECREF(minitype);
- minitype = newtype;
- Py_DECREF(chktype);
- Py_DECREF(ip);
- }
- chktype = minitype;
- Py_INCREF(minitype);
- goto finish;
+ l = PyObject_Length(op);
+ if (l < 0 && PyErr_Occurred()) {
+ PyErr_Clear();
+ goto deflt;
+ }
+ if (l == 0 && minitype->type_num == PyArray_BOOL) {
+ Py_DECREF(minitype);
+ minitype = PyArray_DescrFromType(PyArray_DEFAULT);
}
+ while (--l >= 0) {
+ PyArray_Descr *newtype;
+ ip = PySequence_GetItem(op, l);
+ if (ip==NULL) {
+ PyErr_Clear();
+ goto deflt;
+ }
+ chktype = _array_find_type(ip, minitype, max-1);
+ newtype = _array_small_type(chktype, minitype);
+ Py_DECREF(minitype);
+ minitype = newtype;
+ Py_DECREF(chktype);
+ Py_DECREF(ip);
+ }
+ chktype = minitype;
+ Py_INCREF(minitype);
+ goto finish;
+ }
deflt:
- chktype = _use_default_type(op);
+ chktype = _use_default_type(op);
finish:
- outtype = _array_small_type(chktype, minitype);
- Py_DECREF(chktype);
- Py_DECREF(minitype);
- /* VOID Arrays should not occur by "default"
- unless input was already a VOID */
- if (outtype->type_num == PyArray_VOID && \
- minitype->type_num != PyArray_VOID) {
- Py_DECREF(outtype);
- return PyArray_DescrFromType(PyArray_OBJECT);
- }
- return outtype;
+ outtype = _array_small_type(chktype, minitype);
+ Py_DECREF(chktype);
+ Py_DECREF(minitype);
+ /* VOID Arrays should not occur by "default"
+ unless input was already a VOID */
+ if (outtype->type_num == PyArray_VOID && \
+ minitype->type_num != PyArray_VOID) {
+ Py_DECREF(outtype);
+ return PyArray_DescrFromType(PyArray_OBJECT);
+ }
+ return outtype;
}
/* adapted from Numarray */
-static int
+static int
setArrayFromSequence(PyArrayObject *a, PyObject *s, int dim, intp offset)
{
- Py_ssize_t i, slen = PySequence_Length(s);
- int res = 0;
+ Py_ssize_t i, slen = PySequence_Length(s);
+ int res = 0;
- if (dim > a->nd) {
- PyErr_Format(PyExc_ValueError,
- "setArrayFromSequence: sequence/array dimensions mismatch.");
- return -1;
- }
+ if (dim > a->nd) {
+ PyErr_Format(PyExc_ValueError,
+ "setArrayFromSequence: sequence/array dimensions mismatch.");
+ return -1;
+ }
- if (slen != a->dimensions[dim]) {
- PyErr_Format(PyExc_ValueError,
- "setArrayFromSequence: sequence/array shape mismatch.");
- return -1;
- }
+ if (slen != a->dimensions[dim]) {
+ PyErr_Format(PyExc_ValueError,
+ "setArrayFromSequence: sequence/array shape mismatch.");
+ return -1;
+ }
- for(i=0; i<slen; i++) {
- PyObject *o = PySequence_GetItem(s, i);
- if ((a->nd - dim) > 1) {
- res = setArrayFromSequence(a, o, dim+1, offset);
- }
- else {
- res = a->descr->f->setitem(o, (a->data + offset), a);
- }
- Py_DECREF(o);
- if (res < 0) return res;
- offset += a->strides[dim];
+ for(i=0; i<slen; i++) {
+ PyObject *o = PySequence_GetItem(s, i);
+ if ((a->nd - dim) > 1) {
+ res = setArrayFromSequence(a, o, dim+1, offset);
}
- return 0;
+ else {
+ res = a->descr->f->setitem(o, (a->data + offset), a);
+ }
+ Py_DECREF(o);
+ if (res < 0) return res;
+ offset += a->strides[dim];
+ }
+ return 0;
}
static int
Assign_Array(PyArrayObject *self, PyObject *v)
{
- if (!PySequence_Check(v)) {
- PyErr_SetString(PyExc_ValueError,
- "assignment from non-sequence");
- return -1;
- }
- if (self->nd == 0) {
- PyErr_SetString(PyExc_ValueError,
- "assignment to 0-d array");
- return -1;
- }
+ if (!PySequence_Check(v)) {
+ PyErr_SetString(PyExc_ValueError,
+ "assignment from non-sequence");
+ return -1;
+ }
+ if (self->nd == 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "assignment to 0-d array");
+ return -1;
+ }
- return setArrayFromSequence(self, v, 0, 0);
+ return setArrayFromSequence(self, v, 0, 0);
}
/* "Array Scalars don't call this code" */
@@ -7247,42 +7246,42 @@ Assign_Array(PyArrayObject *self, PyObject *v)
static PyObject *
Array_FromPyScalar(PyObject *op, PyArray_Descr *typecode)
{
- PyArrayObject *ret;
- int itemsize;
- int type;
+ PyArrayObject *ret;
+ int itemsize;
+ int type;
- itemsize = typecode->elsize;
- type = typecode->type_num;
+ itemsize = typecode->elsize;
+ type = typecode->type_num;
- if (itemsize == 0 && PyTypeNum_ISEXTENDED(type)) {
- itemsize = PyObject_Length(op);
- if (type == PyArray_UNICODE) itemsize *= 4;
+ if (itemsize == 0 && PyTypeNum_ISEXTENDED(type)) {
+ itemsize = PyObject_Length(op);
+ if (type == PyArray_UNICODE) itemsize *= 4;
- if (itemsize != typecode->elsize) {
- PyArray_DESCR_REPLACE(typecode);
- typecode->elsize = itemsize;
- }
+ if (itemsize != typecode->elsize) {
+ PyArray_DESCR_REPLACE(typecode);
+ typecode->elsize = itemsize;
}
+ }
- ret = (PyArrayObject *)PyArray_NewFromDescr(&PyArray_Type, typecode,
- 0, NULL,
- NULL, NULL, 0, NULL);
- if (ret == NULL) return NULL;
- if (ret->nd > 0) {
- PyErr_SetString(PyExc_ValueError,
- "shape-mismatch on array construction");
- Py_DECREF(ret);
- return NULL;
- }
+ ret = (PyArrayObject *)PyArray_NewFromDescr(&PyArray_Type, typecode,
+ 0, NULL,
+ NULL, NULL, 0, NULL);
+ if (ret == NULL) return NULL;
+ if (ret->nd > 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "shape-mismatch on array construction");
+ Py_DECREF(ret);
+ return NULL;
+ }
- ret->descr->f->setitem(op, ret->data, ret);
+ ret->descr->f->setitem(op, ret->data, ret);
- if (PyErr_Occurred()) {
- Py_DECREF(ret);
- return NULL;
- } else {
- return (PyObject *)ret;
- }
+ if (PyErr_Occurred()) {
+ Py_DECREF(ret);
+ return NULL;
+ } else {
+ return (PyObject *)ret;
+ }
}
@@ -7297,253 +7296,253 @@ Array_FromPyScalar(PyObject *op, PyArray_Descr *typecode)
static int
object_depth_and_dimension(PyObject *s, int max, intp *dims)
{
- intp *newdims, *test_dims;
- int nd, test_nd;
- int i, islist;
- intp size;
- PyObject *obj;
+ intp *newdims, *test_dims;
+ int nd, test_nd;
+ int i, islist;
+ intp size;
+ PyObject *obj;
- islist = PyList_Check(s);
- if (!(islist || PyTuple_Check(s)) ||
- ((size = PySequence_Size(s)) == 0))
- return 0;
- if (max < 2) {
- if (max < 1) return 0;
- dims[0] = size;
- return 1;
- }
- newdims = PyDimMem_NEW(2*(max-1));
- test_dims = newdims + (max-1);
- if (islist) obj = PyList_GET_ITEM(s, 0);
- else obj = PyTuple_GET_ITEM(s, 0);
- nd = object_depth_and_dimension(obj, max-1, newdims);
- for (i=1; i<size; i++) {
- if (islist) obj = PyList_GET_ITEM(s, i);
- else obj = PyTuple_GET_ITEM(s, i);
- test_nd = object_depth_and_dimension(obj, max-1, test_dims);
- if ((nd != test_nd) ||
- (!PyArray_CompareLists(newdims, test_dims, nd))) {
- nd = 0;
- break;
- }
+ islist = PyList_Check(s);
+ if (!(islist || PyTuple_Check(s)) ||
+ ((size = PySequence_Size(s)) == 0))
+ return 0;
+ if (max < 2) {
+ if (max < 1) return 0;
+ dims[0] = size;
+ return 1;
+ }
+ newdims = PyDimMem_NEW(2*(max-1));
+ test_dims = newdims + (max-1);
+ if (islist) obj = PyList_GET_ITEM(s, 0);
+ else obj = PyTuple_GET_ITEM(s, 0);
+ nd = object_depth_and_dimension(obj, max-1, newdims);
+ for (i=1; i<size; i++) {
+ if (islist) obj = PyList_GET_ITEM(s, i);
+ else obj = PyTuple_GET_ITEM(s, i);
+ test_nd = object_depth_and_dimension(obj, max-1, test_dims);
+ if ((nd != test_nd) ||
+ (!PyArray_CompareLists(newdims, test_dims, nd))) {
+ nd = 0;
+ break;
}
+ }
- for (i=1; i<=nd; i++) dims[i] = newdims[i-1];
- dims[0] = size;
- PyDimMem_FREE(newdims);
- return nd+1;
+ for (i=1; i<=nd; i++) dims[i] = newdims[i-1];
+ dims[0] = size;
+ PyDimMem_FREE(newdims);
+ return nd+1;
}
static PyObject *
ObjectArray_FromNestedList(PyObject *s, PyArray_Descr *typecode, int fortran)
{
- int nd;
- intp d[MAX_DIMS];
- PyArrayObject *r;
+ int nd;
+ intp d[MAX_DIMS];
+ PyArrayObject *r;
- /* Get the depth and the number of dimensions */
- nd = object_depth_and_dimension(s, MAX_DIMS, d);
- if (nd < 0) return NULL;
+ /* Get the depth and the number of dimensions */
+ nd = object_depth_and_dimension(s, MAX_DIMS, d);
+ if (nd < 0) return NULL;
- if (nd == 0) return Array_FromPyScalar(s, typecode);
+ if (nd == 0) return Array_FromPyScalar(s, typecode);
- r=(PyArrayObject*)PyArray_NewFromDescr(&PyArray_Type, typecode,
- nd, d,
- NULL, NULL,
- fortran, NULL);
+ r=(PyArrayObject*)PyArray_NewFromDescr(&PyArray_Type, typecode,
+ nd, d,
+ NULL, NULL,
+ fortran, NULL);
- if(!r) return NULL;
- if(Assign_Array(r,s) == -1) {
- Py_DECREF(r);
- return NULL;
- }
- return (PyObject*)r;
+ if(!r) return NULL;
+ if(Assign_Array(r,s) == -1) {
+ Py_DECREF(r);
+ return NULL;
+ }
+ return (PyObject*)r;
}
/* isobject means that we are constructing an
object array on-purpose with a nested list.
Only a list is interpreted as a sequence with these rules
- */
+*/
/* steals reference to typecode */
static PyObject *
Array_FromSequence(PyObject *s, PyArray_Descr *typecode, int fortran,
int min_depth, int max_depth)
{
- PyArrayObject *r;
- int nd;
- intp d[MAX_DIMS];
- int stop_at_string;
- int stop_at_tuple;
- int check_it;
- int type = typecode->type_num;
- int itemsize = typecode->elsize;
-
- check_it = (typecode->type != PyArray_CHARLTR);
-
- stop_at_string = ((type == PyArray_OBJECT) ||
- (type == PyArray_STRING &&
- typecode->type == PyArray_STRINGLTR) ||
- (type == PyArray_UNICODE) ||
- (type == PyArray_VOID));
-
- stop_at_tuple = (type == PyArray_VOID && (typecode->names \
- || typecode->subarray));
-
- if (!((nd=discover_depth(s, MAX_DIMS+1, stop_at_string,
- stop_at_tuple)) > 0)) {
- if (nd==0)
- return Array_FromPyScalar(s, typecode);
- PyErr_SetString(PyExc_ValueError,
- "invalid input sequence");
- goto fail;
- }
+ PyArrayObject *r;
+ int nd;
+ intp d[MAX_DIMS];
+ int stop_at_string;
+ int stop_at_tuple;
+ int check_it;
+ int type = typecode->type_num;
+ int itemsize = typecode->elsize;
+
+ check_it = (typecode->type != PyArray_CHARLTR);
+
+ stop_at_string = ((type == PyArray_OBJECT) ||
+ (type == PyArray_STRING &&
+ typecode->type == PyArray_STRINGLTR) ||
+ (type == PyArray_UNICODE) ||
+ (type == PyArray_VOID));
+
+ stop_at_tuple = (type == PyArray_VOID && (typecode->names \
+ || typecode->subarray));
+
+ if (!((nd=discover_depth(s, MAX_DIMS+1, stop_at_string,
+ stop_at_tuple)) > 0)) {
+ if (nd==0)
+ return Array_FromPyScalar(s, typecode);
+ PyErr_SetString(PyExc_ValueError,
+ "invalid input sequence");
+ goto fail;
+ }
- if (max_depth && PyTypeNum_ISOBJECT(type) && (nd > max_depth)) {
- nd = max_depth;
- }
+ if (max_depth && PyTypeNum_ISOBJECT(type) && (nd > max_depth)) {
+ nd = max_depth;
+ }
- if ((max_depth && nd > max_depth) || \
- (min_depth && nd < min_depth)) {
- PyErr_SetString(PyExc_ValueError,
- "invalid number of dimensions");
- goto fail;
- }
+ if ((max_depth && nd > max_depth) || \
+ (min_depth && nd < min_depth)) {
+ PyErr_SetString(PyExc_ValueError,
+ "invalid number of dimensions");
+ goto fail;
+ }
- if(discover_dimensions(s,nd,d, check_it) == -1) goto fail;
+ if(discover_dimensions(s,nd,d, check_it) == -1) goto fail;
- if (typecode->type == PyArray_CHARLTR && nd > 0 && d[nd-1]==1) {
- nd = nd-1;
- }
+ if (typecode->type == PyArray_CHARLTR && nd > 0 && d[nd-1]==1) {
+ nd = nd-1;
+ }
- if (itemsize == 0 && PyTypeNum_ISEXTENDED(type)) {
- if (discover_itemsize(s, nd, &itemsize) == -1) goto fail;
- if (type == PyArray_UNICODE) itemsize*=4;
- }
+ if (itemsize == 0 && PyTypeNum_ISEXTENDED(type)) {
+ if (discover_itemsize(s, nd, &itemsize) == -1) goto fail;
+ if (type == PyArray_UNICODE) itemsize*=4;
+ }
- if (itemsize != typecode->elsize) {
- PyArray_DESCR_REPLACE(typecode);
- typecode->elsize = itemsize;
- }
+ if (itemsize != typecode->elsize) {
+ PyArray_DESCR_REPLACE(typecode);
+ typecode->elsize = itemsize;
+ }
- r=(PyArrayObject*)PyArray_NewFromDescr(&PyArray_Type, typecode,
- nd, d,
- NULL, NULL,
- fortran, NULL);
+ r=(PyArrayObject*)PyArray_NewFromDescr(&PyArray_Type, typecode,
+ nd, d,
+ NULL, NULL,
+ fortran, NULL);
- if(!r) return NULL;
- if(Assign_Array(r,s) == -1) {
- Py_DECREF(r);
- return NULL;
- }
- return (PyObject*)r;
+ if(!r) return NULL;
+ if(Assign_Array(r,s) == -1) {
+ Py_DECREF(r);
+ return NULL;
+ }
+ return (PyObject*)r;
fail:
- Py_DECREF(typecode);
- return NULL;
+ Py_DECREF(typecode);
+ return NULL;
}
/*OBJECT_API
- Is the typenum valid?
+ Is the typenum valid?
*/
static int
PyArray_ValidType(int type)
{
- PyArray_Descr *descr;
- int res=TRUE;
+ PyArray_Descr *descr;
+ int res=TRUE;
- descr = PyArray_DescrFromType(type);
- if (descr==NULL) res = FALSE;
- Py_DECREF(descr);
- return res;
+ descr = PyArray_DescrFromType(type);
+ if (descr==NULL) res = FALSE;
+ Py_DECREF(descr);
+ return res;
}
/* For backward compatibility */
/* steals reference to at --- cannot be NULL*/
/*OBJECT_API
- Cast an array using typecode structure.
+ Cast an array using typecode structure.
*/
static PyObject *
PyArray_CastToType(PyArrayObject *mp, PyArray_Descr *at, int fortran)
{
- PyObject *out;
- int ret;
- PyArray_Descr *mpd;
-
- mpd = mp->descr;
-
- if (((mpd == at) || ((mpd->type_num == at->type_num) && \
- PyArray_EquivByteorders(mpd->byteorder,\
- at->byteorder) && \
- ((mpd->elsize == at->elsize) || \
- (at->elsize==0)))) && \
- PyArray_ISBEHAVED_RO(mp)) {
- Py_DECREF(at);
- Py_INCREF(mp);
- return (PyObject *)mp;
- }
-
- if (at->elsize == 0) {
- PyArray_DESCR_REPLACE(at);
- if (at == NULL) return NULL;
- if (mpd->type_num == PyArray_STRING && \
- at->type_num == PyArray_UNICODE)
- at->elsize = mpd->elsize << 2;
- if (mpd->type_num == PyArray_UNICODE &&
- at->type_num == PyArray_STRING)
- at->elsize = mpd->elsize >> 2;
- if (at->type_num == PyArray_VOID)
- at->elsize = mpd->elsize;
- }
-
- out = PyArray_NewFromDescr(mp->ob_type, at,
- mp->nd,
- mp->dimensions,
- NULL, NULL,
- fortran,
- (PyObject *)mp);
-
- if (out == NULL) return NULL;
- ret = PyArray_CastTo((PyArrayObject *)out, mp);
- if (ret != -1) return out;
-
- Py_DECREF(out);
- return NULL;
+ PyObject *out;
+ int ret;
+ PyArray_Descr *mpd;
+
+ mpd = mp->descr;
+
+ if (((mpd == at) || ((mpd->type_num == at->type_num) && \
+ PyArray_EquivByteorders(mpd->byteorder,\
+ at->byteorder) && \
+ ((mpd->elsize == at->elsize) || \
+ (at->elsize==0)))) && \
+ PyArray_ISBEHAVED_RO(mp)) {
+ Py_DECREF(at);
+ Py_INCREF(mp);
+ return (PyObject *)mp;
+ }
+
+ if (at->elsize == 0) {
+ PyArray_DESCR_REPLACE(at);
+ if (at == NULL) return NULL;
+ if (mpd->type_num == PyArray_STRING && \
+ at->type_num == PyArray_UNICODE)
+ at->elsize = mpd->elsize << 2;
+ if (mpd->type_num == PyArray_UNICODE &&
+ at->type_num == PyArray_STRING)
+ at->elsize = mpd->elsize >> 2;
+ if (at->type_num == PyArray_VOID)
+ at->elsize = mpd->elsize;
+ }
+
+ out = PyArray_NewFromDescr(mp->ob_type, at,
+ mp->nd,
+ mp->dimensions,
+ NULL, NULL,
+ fortran,
+ (PyObject *)mp);
+
+ if (out == NULL) return NULL;
+ ret = PyArray_CastTo((PyArrayObject *)out, mp);
+ if (ret != -1) return out;
+
+ Py_DECREF(out);
+ return NULL;
}
/*OBJECT_API
- Get a cast function to cast from the input descriptor to the
- output type_number (must be a registered data-type).
- Returns NULL if un-successful.
+ Get a cast function to cast from the input descriptor to the
+ output type_number (must be a registered data-type).
+ Returns NULL if un-successful.
*/
static PyArray_VectorUnaryFunc *
PyArray_GetCastFunc(PyArray_Descr *descr, int type_num)
{
- PyArray_VectorUnaryFunc *castfunc=NULL;
- if (type_num < PyArray_NTYPES) {
- castfunc = descr->f->cast[type_num];
- }
- if (castfunc == NULL) {
- PyObject *obj = descr->f->castdict;
- if (obj && PyDict_Check(obj)) {
- PyObject *key;
- PyObject *cobj;
- key = PyInt_FromLong(type_num);
- cobj = PyDict_GetItem(obj, key);
- Py_DECREF(key);
- if (PyCObject_Check(cobj)) {
- castfunc = PyCObject_AsVoidPtr(cobj);
- }
- }
- if (castfunc) return castfunc;
+ PyArray_VectorUnaryFunc *castfunc=NULL;
+ if (type_num < PyArray_NTYPES) {
+ castfunc = descr->f->cast[type_num];
+ }
+ if (castfunc == NULL) {
+ PyObject *obj = descr->f->castdict;
+ if (obj && PyDict_Check(obj)) {
+ PyObject *key;
+ PyObject *cobj;
+ key = PyInt_FromLong(type_num);
+ cobj = PyDict_GetItem(obj, key);
+ Py_DECREF(key);
+ if (PyCObject_Check(cobj)) {
+ castfunc = PyCObject_AsVoidPtr(cobj);
+ }
}
- else return castfunc;
+ if (castfunc) return castfunc;
+ }
+ else return castfunc;
- PyErr_SetString(PyExc_ValueError,
- "No cast function available.");
- return NULL;
+ PyErr_SetString(PyExc_ValueError,
+ "No cast function available.");
+ return NULL;
}
/* Reference counts:
@@ -7563,129 +7562,129 @@ _strided_buffered_cast(char *dptr, intp dstride, int delsize, int dswap,
PyArray_VectorUnaryFunc *castfunc,
PyArrayObject *dest, PyArrayObject *src)
{
- int i;
- if (N <= bufsize) {
- /* 1. copy input to buffer and swap
- 2. cast input to output
- 3. swap output if necessary and copy from output buffer
- */
- scopyfunc(buffers[1], selsize, sptr, sstride, N, sswap, src);
- castfunc(buffers[1], buffers[0], N, src, dest);
- dcopyfunc(dptr, dstride, buffers[0], delsize, N, dswap, dest);
- return;
- }
-
- /* otherwise we need to divide up into bufsize pieces */
- i = 0;
- while(N > 0) {
- int newN;
- newN = MIN(N, bufsize);
- _strided_buffered_cast(dptr+i*dstride, dstride, delsize,
- dswap, dcopyfunc,
- sptr+i*sstride, sstride, selsize,
- sswap, scopyfunc,
- newN, buffers, bufsize, castfunc, dest, src);
- i += newN;
- N -= bufsize;
- }
+ int i;
+ if (N <= bufsize) {
+ /* 1. copy input to buffer and swap
+ 2. cast input to output
+ 3. swap output if necessary and copy from output buffer
+ */
+ scopyfunc(buffers[1], selsize, sptr, sstride, N, sswap, src);
+ castfunc(buffers[1], buffers[0], N, src, dest);
+ dcopyfunc(dptr, dstride, buffers[0], delsize, N, dswap, dest);
return;
+ }
+
+ /* otherwise we need to divide up into bufsize pieces */
+ i = 0;
+ while(N > 0) {
+ int newN;
+ newN = MIN(N, bufsize);
+ _strided_buffered_cast(dptr+i*dstride, dstride, delsize,
+ dswap, dcopyfunc,
+ sptr+i*sstride, sstride, selsize,
+ sswap, scopyfunc,
+ newN, buffers, bufsize, castfunc, dest, src);
+ i += newN;
+ N -= bufsize;
+ }
+ return;
}
static int
_broadcast_cast(PyArrayObject *out, PyArrayObject *in,
PyArray_VectorUnaryFunc *castfunc, int iswap, int oswap)
{
- int delsize, selsize, maxaxis, i, N;
- PyArrayMultiIterObject *multi;
- intp maxdim, ostrides, istrides;
- char *buffers[2];
- PyArray_CopySwapNFunc *ocopyfunc, *icopyfunc;
- char *obptr;
+ int delsize, selsize, maxaxis, i, N;
+ PyArrayMultiIterObject *multi;
+ intp maxdim, ostrides, istrides;
+ char *buffers[2];
+ PyArray_CopySwapNFunc *ocopyfunc, *icopyfunc;
+ char *obptr;
- NPY_BEGIN_THREADS_DEF
+ NPY_BEGIN_THREADS_DEF
delsize = PyArray_ITEMSIZE(out);
- selsize = PyArray_ITEMSIZE(in);
- multi = (PyArrayMultiIterObject *)PyArray_MultiIterNew(2, out, in);
- if (multi == NULL) return -1;
-
- if (multi->size != PyArray_SIZE(out)) {
- PyErr_SetString(PyExc_ValueError,
- "array dimensions are not "\
- "compatible for copy");
- Py_DECREF(multi);
- return -1;
- }
+ selsize = PyArray_ITEMSIZE(in);
+ multi = (PyArrayMultiIterObject *)PyArray_MultiIterNew(2, out, in);
+ if (multi == NULL) return -1;
- icopyfunc = in->descr->f->copyswapn;
- ocopyfunc = out->descr->f->copyswapn;
- maxaxis = PyArray_RemoveSmallest(multi);
- if (maxaxis < 0) { /* cast 1 0-d array to another */
- N = 1;
- maxdim = 1;
- ostrides = delsize;
- istrides = selsize;
- }
- else {
- maxdim = multi->dimensions[maxaxis];
- N = (int) (MIN(maxdim, PyArray_BUFSIZE));
- ostrides = multi->iters[0]->strides[maxaxis];
- istrides = multi->iters[1]->strides[maxaxis];
+ if (multi->size != PyArray_SIZE(out)) {
+ PyErr_SetString(PyExc_ValueError,
+ "array dimensions are not "\
+ "compatible for copy");
+ Py_DECREF(multi);
+ return -1;
+ }
- }
- buffers[0] = _pya_malloc(N*delsize);
- if (buffers[0] == NULL) {
- PyErr_NoMemory();
- return -1;
- }
- buffers[1] = _pya_malloc(N*selsize);
- if (buffers[1] == NULL) {
- _pya_free(buffers[0]);
- PyErr_NoMemory();
- return -1;
- }
- if (PyDataType_FLAGCHK(out->descr, NPY_NEEDS_INIT))
- memset(buffers[0], 0, N*delsize);
- if (PyDataType_FLAGCHK(in->descr, NPY_NEEDS_INIT))
- memset(buffers[1], 0, N*selsize);
+ icopyfunc = in->descr->f->copyswapn;
+ ocopyfunc = out->descr->f->copyswapn;
+ maxaxis = PyArray_RemoveSmallest(multi);
+ if (maxaxis < 0) { /* cast 1 0-d array to another */
+ N = 1;
+ maxdim = 1;
+ ostrides = delsize;
+ istrides = selsize;
+ }
+ else {
+ maxdim = multi->dimensions[maxaxis];
+ N = (int) (MIN(maxdim, PyArray_BUFSIZE));
+ ostrides = multi->iters[0]->strides[maxaxis];
+ istrides = multi->iters[1]->strides[maxaxis];
+
+ }
+ buffers[0] = _pya_malloc(N*delsize);
+ if (buffers[0] == NULL) {
+ PyErr_NoMemory();
+ return -1;
+ }
+ buffers[1] = _pya_malloc(N*selsize);
+ if (buffers[1] == NULL) {
+ _pya_free(buffers[0]);
+ PyErr_NoMemory();
+ return -1;
+ }
+ if (PyDataType_FLAGCHK(out->descr, NPY_NEEDS_INIT))
+ memset(buffers[0], 0, N*delsize);
+ if (PyDataType_FLAGCHK(in->descr, NPY_NEEDS_INIT))
+ memset(buffers[1], 0, N*selsize);
#if NPY_ALLOW_THREADS
- if (PyArray_ISNUMBER(in) && PyArray_ISNUMBER(out)) {
- NPY_BEGIN_THREADS
- }
+ if (PyArray_ISNUMBER(in) && PyArray_ISNUMBER(out)) {
+ NPY_BEGIN_THREADS
+ }
#endif
- while(multi->index < multi->size) {
- _strided_buffered_cast(multi->iters[0]->dataptr,
- ostrides,
- delsize, oswap, ocopyfunc,
- multi->iters[1]->dataptr,
- istrides,
- selsize, iswap, icopyfunc,
- maxdim, buffers, N,
- castfunc, out, in);
- PyArray_MultiIter_NEXT(multi);
- }
+ while(multi->index < multi->size) {
+ _strided_buffered_cast(multi->iters[0]->dataptr,
+ ostrides,
+ delsize, oswap, ocopyfunc,
+ multi->iters[1]->dataptr,
+ istrides,
+ selsize, iswap, icopyfunc,
+ maxdim, buffers, N,
+ castfunc, out, in);
+ PyArray_MultiIter_NEXT(multi);
+ }
#if NPY_ALLOW_THREADS
- if (PyArray_ISNUMBER(in) && PyArray_ISNUMBER(out)) {
- NPY_END_THREADS
- }
+ if (PyArray_ISNUMBER(in) && PyArray_ISNUMBER(out)) {
+ NPY_END_THREADS
+ }
#endif
- Py_DECREF(multi);
- if (PyDataType_REFCHK(in->descr)) {
- obptr = buffers[1];
- for (i=0; i<N; i++, obptr+=selsize)
- PyArray_Item_XDECREF(obptr, out->descr);
- }
- if (PyDataType_REFCHK(out->descr)) {
- obptr = buffers[0];
- for (i=0; i<N; i++, obptr+=delsize)
- PyArray_Item_XDECREF(obptr, out->descr);
- }
- _pya_free(buffers[0]);
- _pya_free(buffers[1]);
- if (PyErr_Occurred()) return -1;
- return 0;
+ Py_DECREF(multi);
+ if (PyDataType_REFCHK(in->descr)) {
+ obptr = buffers[1];
+ for (i=0; i<N; i++, obptr+=selsize)
+ PyArray_Item_XDECREF(obptr, out->descr);
+ }
+ if (PyDataType_REFCHK(out->descr)) {
+ obptr = buffers[0];
+ for (i=0; i<N; i++, obptr+=delsize)
+ PyArray_Item_XDECREF(obptr, out->descr);
+ }
+ _pya_free(buffers[0]);
+ _pya_free(buffers[1]);
+ if (PyErr_Occurred()) return -1;
+ return 0;
}
@@ -7697,64 +7696,64 @@ _broadcast_cast(PyArrayObject *out, PyArrayObject *in,
*/
/*OBJECT_API
- Cast to an already created array.
+ Cast to an already created array.
*/
static int
PyArray_CastTo(PyArrayObject *out, PyArrayObject *mp)
{
- int simple;
- int same;
- PyArray_VectorUnaryFunc *castfunc=NULL;
- int mpsize = PyArray_SIZE(mp);
- int iswap, oswap;
+ int simple;
+ int same;
+ PyArray_VectorUnaryFunc *castfunc=NULL;
+ int mpsize = PyArray_SIZE(mp);
+ int iswap, oswap;
- NPY_BEGIN_THREADS_DEF
+ NPY_BEGIN_THREADS_DEF
if (mpsize == 0) return 0;
- if (!PyArray_ISWRITEABLE(out)) {
- PyErr_SetString(PyExc_ValueError,
- "output array is not writeable");
- return -1;
- }
+ if (!PyArray_ISWRITEABLE(out)) {
+ PyErr_SetString(PyExc_ValueError,
+ "output array is not writeable");
+ return -1;
+ }
- castfunc = PyArray_GetCastFunc(mp->descr, out->descr->type_num);
- if (castfunc == NULL) return -1;
+ castfunc = PyArray_GetCastFunc(mp->descr, out->descr->type_num);
+ if (castfunc == NULL) return -1;
- same = PyArray_SAMESHAPE(out, mp);
- simple = same && ((PyArray_ISCARRAY_RO(mp) && PyArray_ISCARRAY(out)) ||
- (PyArray_ISFARRAY_RO(mp) && PyArray_ISFARRAY(out)));
+ same = PyArray_SAMESHAPE(out, mp);
+ simple = same && ((PyArray_ISCARRAY_RO(mp) && PyArray_ISCARRAY(out)) ||
+ (PyArray_ISFARRAY_RO(mp) && PyArray_ISFARRAY(out)));
- if (simple) {
+ if (simple) {
#if NPY_ALLOW_THREADS
- if (PyArray_ISNUMBER(mp) && PyArray_ISNUMBER(out)) {
- NPY_BEGIN_THREADS }
+ if (PyArray_ISNUMBER(mp) && PyArray_ISNUMBER(out)) {
+ NPY_BEGIN_THREADS }
#endif
- castfunc(mp->data, out->data, mpsize, mp, out);
+ castfunc(mp->data, out->data, mpsize, mp, out);
#if NPY_ALLOW_THREADS
- if (PyArray_ISNUMBER(mp) && PyArray_ISNUMBER(out)) {
- NPY_END_THREADS }
+ if (PyArray_ISNUMBER(mp) && PyArray_ISNUMBER(out)) {
+ NPY_END_THREADS }
#endif
- if (!PyArray_ISNUMBER(mp) && PyErr_Occurred()) return -1;
- }
+ if (!PyArray_ISNUMBER(mp) && PyErr_Occurred()) return -1;
+ }
- /* If the input or output is OBJECT, STRING, UNICODE, or VOID */
- /* then getitem and setitem are used for the cast */
- /* and byteswapping is handled by those methods */
+ /* If the input or output is OBJECT, STRING, UNICODE, or VOID */
+ /* then getitem and setitem are used for the cast */
+ /* and byteswapping is handled by those methods */
- if (PyArray_ISFLEXIBLE(mp) || PyArray_ISOBJECT(mp) || PyArray_ISOBJECT(out) ||
- PyArray_ISFLEXIBLE(out)) {
- iswap = oswap = 0;
- }
- else {
- iswap = PyArray_ISBYTESWAPPED(mp);
- oswap = PyArray_ISBYTESWAPPED(out);
- }
+ if (PyArray_ISFLEXIBLE(mp) || PyArray_ISOBJECT(mp) || PyArray_ISOBJECT(out) ||
+ PyArray_ISFLEXIBLE(out)) {
+ iswap = oswap = 0;
+ }
+ else {
+ iswap = PyArray_ISBYTESWAPPED(mp);
+ oswap = PyArray_ISBYTESWAPPED(out);
+ }
- return _broadcast_cast(out, mp, castfunc, iswap, oswap);
+ return _broadcast_cast(out, mp, castfunc, iswap, oswap);
}
@@ -7762,142 +7761,142 @@ static int
_bufferedcast(PyArrayObject *out, PyArrayObject *in,
PyArray_VectorUnaryFunc *castfunc)
{
- char *inbuffer, *bptr, *optr;
- char *outbuffer=NULL;
- PyArrayIterObject *it_in=NULL, *it_out=NULL;
- register intp i, index;
- intp ncopies = PyArray_SIZE(out) / PyArray_SIZE(in);
- int elsize=in->descr->elsize;
- int nels = PyArray_BUFSIZE;
- int el;
- int inswap, outswap=0;
- int obuf=!PyArray_ISCARRAY(out);
- int oelsize = out->descr->elsize;
- PyArray_CopySwapFunc *in_csn;
- PyArray_CopySwapFunc *out_csn;
- int retval = -1;
-
- in_csn = in->descr->f->copyswap;
- out_csn = out->descr->f->copyswap;
-
- /* If the input or output is STRING, UNICODE, or VOID */
- /* then getitem and setitem are used for the cast */
- /* and byteswapping is handled by those methods */
-
- inswap = !(PyArray_ISFLEXIBLE(in) || PyArray_ISNOTSWAPPED(in));
-
- inbuffer = PyDataMem_NEW(PyArray_BUFSIZE*elsize);
- if (inbuffer == NULL) return -1;
- if (PyArray_ISOBJECT(in))
- memset(inbuffer, 0, PyArray_BUFSIZE*elsize);
- it_in = (PyArrayIterObject *)PyArray_IterNew((PyObject *)in);
- if (it_in == NULL) goto exit;
-
- if (obuf) {
- outswap = !(PyArray_ISFLEXIBLE(out) || \
- PyArray_ISNOTSWAPPED(out));
- outbuffer = PyDataMem_NEW(PyArray_BUFSIZE*oelsize);
- if (outbuffer == NULL) goto exit;
- if (PyArray_ISOBJECT(out))
- memset(outbuffer, 0, PyArray_BUFSIZE*oelsize);
-
- it_out = (PyArrayIterObject *)PyArray_IterNew((PyObject *)out);
- if (it_out == NULL) goto exit;
-
- nels = MIN(nels, PyArray_BUFSIZE);
- }
-
- optr = (obuf) ? outbuffer: out->data;
- bptr = inbuffer;
- el = 0;
- while(ncopies--) {
- index = it_in->size;
- PyArray_ITER_RESET(it_in);
- while(index--) {
- in_csn(bptr, it_in->dataptr, inswap, in);
- bptr += elsize;
- PyArray_ITER_NEXT(it_in);
- el += 1;
- if ((el == nels) || (index == 0)) {
- /* buffer filled, do cast */
-
- castfunc(inbuffer, optr, el, in, out);
-
- if (obuf) {
- /* Copy from outbuffer to array */
- for(i=0; i<el; i++) {
- out_csn(it_out->dataptr,
- optr, outswap,
- out);
- optr += oelsize;
- PyArray_ITER_NEXT(it_out);
- }
- optr = outbuffer;
- }
- else {
- optr += out->descr->elsize * nels;
- }
- el = 0;
- bptr = inbuffer;
- }
+ char *inbuffer, *bptr, *optr;
+ char *outbuffer=NULL;
+ PyArrayIterObject *it_in=NULL, *it_out=NULL;
+ register intp i, index;
+ intp ncopies = PyArray_SIZE(out) / PyArray_SIZE(in);
+ int elsize=in->descr->elsize;
+ int nels = PyArray_BUFSIZE;
+ int el;
+ int inswap, outswap=0;
+ int obuf=!PyArray_ISCARRAY(out);
+ int oelsize = out->descr->elsize;
+ PyArray_CopySwapFunc *in_csn;
+ PyArray_CopySwapFunc *out_csn;
+ int retval = -1;
+
+ in_csn = in->descr->f->copyswap;
+ out_csn = out->descr->f->copyswap;
+
+ /* If the input or output is STRING, UNICODE, or VOID */
+ /* then getitem and setitem are used for the cast */
+ /* and byteswapping is handled by those methods */
+
+ inswap = !(PyArray_ISFLEXIBLE(in) || PyArray_ISNOTSWAPPED(in));
+
+ inbuffer = PyDataMem_NEW(PyArray_BUFSIZE*elsize);
+ if (inbuffer == NULL) return -1;
+ if (PyArray_ISOBJECT(in))
+ memset(inbuffer, 0, PyArray_BUFSIZE*elsize);
+ it_in = (PyArrayIterObject *)PyArray_IterNew((PyObject *)in);
+ if (it_in == NULL) goto exit;
+
+ if (obuf) {
+ outswap = !(PyArray_ISFLEXIBLE(out) || \
+ PyArray_ISNOTSWAPPED(out));
+ outbuffer = PyDataMem_NEW(PyArray_BUFSIZE*oelsize);
+ if (outbuffer == NULL) goto exit;
+ if (PyArray_ISOBJECT(out))
+ memset(outbuffer, 0, PyArray_BUFSIZE*oelsize);
+
+ it_out = (PyArrayIterObject *)PyArray_IterNew((PyObject *)out);
+ if (it_out == NULL) goto exit;
+
+ nels = MIN(nels, PyArray_BUFSIZE);
+ }
+
+ optr = (obuf) ? outbuffer: out->data;
+ bptr = inbuffer;
+ el = 0;
+ while(ncopies--) {
+ index = it_in->size;
+ PyArray_ITER_RESET(it_in);
+ while(index--) {
+ in_csn(bptr, it_in->dataptr, inswap, in);
+ bptr += elsize;
+ PyArray_ITER_NEXT(it_in);
+ el += 1;
+ if ((el == nels) || (index == 0)) {
+ /* buffer filled, do cast */
+
+ castfunc(inbuffer, optr, el, in, out);
+
+ if (obuf) {
+ /* Copy from outbuffer to array */
+ for(i=0; i<el; i++) {
+ out_csn(it_out->dataptr,
+ optr, outswap,
+ out);
+ optr += oelsize;
+ PyArray_ITER_NEXT(it_out);
+ }
+ optr = outbuffer;
+ }
+ else {
+ optr += out->descr->elsize * nels;
}
+ el = 0;
+ bptr = inbuffer;
+ }
}
- retval = 0;
+ }
+ retval = 0;
exit:
- Py_XDECREF(it_in);
- PyDataMem_FREE(inbuffer);
- PyDataMem_FREE(outbuffer);
- if (obuf) {
- Py_XDECREF(it_out);
- }
- return retval;
+ Py_XDECREF(it_in);
+ PyDataMem_FREE(inbuffer);
+ PyDataMem_FREE(outbuffer);
+ if (obuf) {
+ Py_XDECREF(it_out);
+ }
+ return retval;
}
/*OBJECT_API
- Cast to an already created array. Arrays don't have to be "broadcastable"
- Only requirement is they have the same number of elements.
+ Cast to an already created array. Arrays don't have to be "broadcastable"
+ Only requirement is they have the same number of elements.
*/
static int
PyArray_CastAnyTo(PyArrayObject *out, PyArrayObject *mp)
{
- int simple;
- PyArray_VectorUnaryFunc *castfunc=NULL;
- int mpsize = PyArray_SIZE(mp);
+ int simple;
+ PyArray_VectorUnaryFunc *castfunc=NULL;
+ int mpsize = PyArray_SIZE(mp);
- if (mpsize == 0) return 0;
- if (!PyArray_ISWRITEABLE(out)) {
- PyErr_SetString(PyExc_ValueError,
- "output array is not writeable");
- return -1;
- }
+ if (mpsize == 0) return 0;
+ if (!PyArray_ISWRITEABLE(out)) {
+ PyErr_SetString(PyExc_ValueError,
+ "output array is not writeable");
+ return -1;
+ }
- if (!(mpsize == PyArray_SIZE(out))) {
- PyErr_SetString(PyExc_ValueError,
- "arrays must have the same number of"
- " elements for the cast.");
- return -1;
- }
+ if (!(mpsize == PyArray_SIZE(out))) {
+ PyErr_SetString(PyExc_ValueError,
+ "arrays must have the same number of"
+ " elements for the cast.");
+ return -1;
+ }
- castfunc = PyArray_GetCastFunc(mp->descr, out->descr->type_num);
- if (castfunc == NULL) return -1;
+ castfunc = PyArray_GetCastFunc(mp->descr, out->descr->type_num);
+ if (castfunc == NULL) return -1;
- simple = ((PyArray_ISCARRAY_RO(mp) && PyArray_ISCARRAY(out)) ||
- (PyArray_ISFARRAY_RO(mp) && PyArray_ISFARRAY(out)));
+ simple = ((PyArray_ISCARRAY_RO(mp) && PyArray_ISCARRAY(out)) ||
+ (PyArray_ISFARRAY_RO(mp) && PyArray_ISFARRAY(out)));
- if (simple) {
- castfunc(mp->data, out->data, mpsize, mp, out);
- return 0;
- }
+ if (simple) {
+ castfunc(mp->data, out->data, mpsize, mp, out);
+ return 0;
+ }
- if (PyArray_SAMESHAPE(out, mp)) {
- int iswap, oswap;
- iswap = PyArray_ISBYTESWAPPED(mp) && !PyArray_ISFLEXIBLE(mp);
- oswap = PyArray_ISBYTESWAPPED(out) && !PyArray_ISFLEXIBLE(out);
- return _broadcast_cast(out, mp, castfunc, iswap, oswap);
- }
+ if (PyArray_SAMESHAPE(out, mp)) {
+ int iswap, oswap;
+ iswap = PyArray_ISBYTESWAPPED(mp) && !PyArray_ISFLEXIBLE(mp);
+ oswap = PyArray_ISBYTESWAPPED(out) && !PyArray_ISFLEXIBLE(out);
+ return _broadcast_cast(out, mp, castfunc, iswap, oswap);
+ }
- return _bufferedcast(out, mp, castfunc);
+ return _bufferedcast(out, mp, castfunc);
}
@@ -7908,229 +7907,229 @@ static PyObject *
PyArray_FromArray(PyArrayObject *arr, PyArray_Descr *newtype, int flags)
{
- PyArrayObject *ret=NULL;
- int itemsize;
- int copy = 0;
- int arrflags;
- PyArray_Descr *oldtype;
- char *msg = "cannot copy back to a read-only array";
- PyTypeObject *subtype;
+ PyArrayObject *ret=NULL;
+ int itemsize;
+ int copy = 0;
+ int arrflags;
+ PyArray_Descr *oldtype;
+ char *msg = "cannot copy back to a read-only array";
+ PyTypeObject *subtype;
- oldtype = PyArray_DESCR(arr);
+ oldtype = PyArray_DESCR(arr);
- subtype = arr->ob_type;
+ subtype = arr->ob_type;
- if (newtype == NULL) {newtype = oldtype; Py_INCREF(oldtype);}
+ if (newtype == NULL) {newtype = oldtype; Py_INCREF(oldtype);}
+ itemsize = newtype->elsize;
+ if (itemsize == 0) {
+ PyArray_DESCR_REPLACE(newtype);
+ if (newtype == NULL) return NULL;
+ newtype->elsize = oldtype->elsize;
itemsize = newtype->elsize;
- if (itemsize == 0) {
- PyArray_DESCR_REPLACE(newtype);
- if (newtype == NULL) return NULL;
- newtype->elsize = oldtype->elsize;
- itemsize = newtype->elsize;
- }
+ }
- /* Can't cast unless ndim-0 array, FORCECAST is specified
- or the cast is safe.
- */
- if (!(flags & FORCECAST) && !PyArray_NDIM(arr)==0 &&
- !PyArray_CanCastTo(oldtype, newtype)) {
+ /* Can't cast unless ndim-0 array, FORCECAST is specified
+ or the cast is safe.
+ */
+ if (!(flags & FORCECAST) && !PyArray_NDIM(arr)==0 &&
+ !PyArray_CanCastTo(oldtype, newtype)) {
+ Py_DECREF(newtype);
+ PyErr_SetString(PyExc_TypeError,
+ "array cannot be safely cast " \
+ "to required type");
+ return NULL;
+ }
+
+ /* Don't copy if sizes are compatible */
+ if ((flags & ENSURECOPY) || PyArray_EquivTypes(oldtype, newtype)) {
+ arrflags = arr->flags;
+
+ copy = (flags & ENSURECOPY) || \
+ ((flags & CONTIGUOUS) && (!(arrflags & CONTIGUOUS))) \
+ || ((flags & ALIGNED) && (!(arrflags & ALIGNED))) \
+ || (arr->nd > 1 && \
+ ((flags & FORTRAN) && (!(arrflags & FORTRAN)))) \
+ || ((flags & WRITEABLE) && (!(arrflags & WRITEABLE)));
+
+ if (copy) {
+ if ((flags & UPDATEIFCOPY) && \
+ (!PyArray_ISWRITEABLE(arr))) {
Py_DECREF(newtype);
- PyErr_SetString(PyExc_TypeError,
- "array cannot be safely cast " \
- "to required type");
+ PyErr_SetString(PyExc_ValueError, msg);
return NULL;
+ }
+ if ((flags & ENSUREARRAY)) {
+ subtype = &PyArray_Type;
+ }
+ ret = (PyArrayObject *) \
+ PyArray_NewFromDescr(subtype, newtype,
+ arr->nd,
+ arr->dimensions,
+ NULL, NULL,
+ flags & FORTRAN,
+ (PyObject *)arr);
+ if (ret == NULL) return NULL;
+ if (PyArray_CopyInto(ret, arr) == -1)
+ {Py_DECREF(ret); return NULL;}
+ if (flags & UPDATEIFCOPY) {
+ ret->flags |= UPDATEIFCOPY;
+ ret->base = (PyObject *)arr;
+ PyArray_FLAGS(ret->base) &= ~WRITEABLE;
+ Py_INCREF(arr);
+ }
}
-
- /* Don't copy if sizes are compatible */
- if ((flags & ENSURECOPY) || PyArray_EquivTypes(oldtype, newtype)) {
- arrflags = arr->flags;
-
- copy = (flags & ENSURECOPY) || \
- ((flags & CONTIGUOUS) && (!(arrflags & CONTIGUOUS))) \
- || ((flags & ALIGNED) && (!(arrflags & ALIGNED))) \
- || (arr->nd > 1 && \
- ((flags & FORTRAN) && (!(arrflags & FORTRAN)))) \
- || ((flags & WRITEABLE) && (!(arrflags & WRITEABLE)));
-
- if (copy) {
- if ((flags & UPDATEIFCOPY) && \
- (!PyArray_ISWRITEABLE(arr))) {
- Py_DECREF(newtype);
- PyErr_SetString(PyExc_ValueError, msg);
- return NULL;
- }
- if ((flags & ENSUREARRAY)) {
- subtype = &PyArray_Type;
- }
- ret = (PyArrayObject *) \
- PyArray_NewFromDescr(subtype, newtype,
- arr->nd,
- arr->dimensions,
- NULL, NULL,
- flags & FORTRAN,
- (PyObject *)arr);
- if (ret == NULL) return NULL;
- if (PyArray_CopyInto(ret, arr) == -1)
- {Py_DECREF(ret); return NULL;}
- if (flags & UPDATEIFCOPY) {
- ret->flags |= UPDATEIFCOPY;
- ret->base = (PyObject *)arr;
- PyArray_FLAGS(ret->base) &= ~WRITEABLE;
- Py_INCREF(arr);
- }
- }
- /* If no copy then just increase the reference
- count and return the input */
- else {
- Py_DECREF(newtype);
- if ((flags & ENSUREARRAY) &&
- !PyArray_CheckExact(arr)) {
- Py_INCREF(arr->descr);
- ret = (PyArrayObject *) \
- PyArray_NewFromDescr(&PyArray_Type,
- arr->descr,
- arr->nd,
- arr->dimensions,
- arr->strides,
- arr->data,
- arr->flags,NULL);
- if (ret == NULL) return NULL;
- ret->base = (PyObject *)arr;
- }
- else {
- ret = arr;
- }
- Py_INCREF(arr);
- }
- }
-
- /* The desired output type is different than the input
- array type and copy was not specified */
+ /* If no copy then just increase the reference
+ count and return the input */
else {
- if ((flags & UPDATEIFCOPY) && \
- (!PyArray_ISWRITEABLE(arr))) {
- Py_DECREF(newtype);
- PyErr_SetString(PyExc_ValueError, msg);
- return NULL;
- }
- if ((flags & ENSUREARRAY)) {
- subtype = &PyArray_Type;
- }
- ret = (PyArrayObject *) \
- PyArray_NewFromDescr(subtype, newtype,
- arr->nd, arr->dimensions,
- NULL, NULL,
- flags & FORTRAN,
- (PyObject *)arr);
+ Py_DECREF(newtype);
+ if ((flags & ENSUREARRAY) &&
+ !PyArray_CheckExact(arr)) {
+ Py_INCREF(arr->descr);
+ ret = (PyArrayObject *) \
+ PyArray_NewFromDescr(&PyArray_Type,
+ arr->descr,
+ arr->nd,
+ arr->dimensions,
+ arr->strides,
+ arr->data,
+ arr->flags,NULL);
if (ret == NULL) return NULL;
- if (PyArray_CastTo(ret, arr) < 0) {
- Py_DECREF(ret);
- return NULL;
- }
- if (flags & UPDATEIFCOPY) {
- ret->flags |= UPDATEIFCOPY;
- ret->base = (PyObject *)arr;
- PyArray_FLAGS(ret->base) &= ~WRITEABLE;
- Py_INCREF(arr);
- }
+ ret->base = (PyObject *)arr;
+ }
+ else {
+ ret = arr;
+ }
+ Py_INCREF(arr);
}
- return (PyObject *)ret;
+ }
+
+ /* The desired output type is different than the input
+ array type and copy was not specified */
+ else {
+ if ((flags & UPDATEIFCOPY) && \
+ (!PyArray_ISWRITEABLE(arr))) {
+ Py_DECREF(newtype);
+ PyErr_SetString(PyExc_ValueError, msg);
+ return NULL;
+ }
+ if ((flags & ENSUREARRAY)) {
+ subtype = &PyArray_Type;
+ }
+ ret = (PyArrayObject *) \
+ PyArray_NewFromDescr(subtype, newtype,
+ arr->nd, arr->dimensions,
+ NULL, NULL,
+ flags & FORTRAN,
+ (PyObject *)arr);
+ if (ret == NULL) return NULL;
+ if (PyArray_CastTo(ret, arr) < 0) {
+ Py_DECREF(ret);
+ return NULL;
+ }
+ if (flags & UPDATEIFCOPY) {
+ ret->flags |= UPDATEIFCOPY;
+ ret->base = (PyObject *)arr;
+ PyArray_FLAGS(ret->base) &= ~WRITEABLE;
+ Py_INCREF(arr);
+ }
+ }
+ return (PyObject *)ret;
}
/* new reference */
static PyArray_Descr *
_array_typedescr_fromstr(char *str)
{
- PyArray_Descr *descr;
- int type_num;
- char typechar;
- int size;
- char msg[] = "unsupported typestring";
- int swap;
- char swapchar;
-
- swapchar = str[0];
- str += 1;
-
-#define _MY_FAIL { \
- PyErr_SetString(PyExc_ValueError, msg); \
- return NULL; \
- }
-
- typechar = str[0];
- size = atoi(str + 1);
- switch (typechar) {
- case 'b':
- if (size == sizeof(Bool))
- type_num = PyArray_BOOL;
- else _MY_FAIL
- break;
- case 'u':
- if (size == sizeof(uintp))
- type_num = PyArray_UINTP;
- else if (size == sizeof(char))
- type_num = PyArray_UBYTE;
- else if (size == sizeof(short))
- type_num = PyArray_USHORT;
- else if (size == sizeof(ulong))
- type_num = PyArray_ULONG;
- else if (size == sizeof(int))
- type_num = PyArray_UINT;
- else if (size == sizeof(ulonglong))
- type_num = PyArray_ULONGLONG;
- else _MY_FAIL
- break;
- case 'i':
- if (size == sizeof(intp))
- type_num = PyArray_INTP;
- else if (size == sizeof(char))
- type_num = PyArray_BYTE;
- else if (size == sizeof(short))
- type_num = PyArray_SHORT;
- else if (size == sizeof(long))
- type_num = PyArray_LONG;
- else if (size == sizeof(int))
- type_num = PyArray_INT;
- else if (size == sizeof(longlong))
- type_num = PyArray_LONGLONG;
- else _MY_FAIL
- break;
- case 'f':
- if (size == sizeof(float))
- type_num = PyArray_FLOAT;
- else if (size == sizeof(double))
- type_num = PyArray_DOUBLE;
- else if (size == sizeof(longdouble))
- type_num = PyArray_LONGDOUBLE;
- else _MY_FAIL
- break;
- case 'c':
- if (size == sizeof(float)*2)
- type_num = PyArray_CFLOAT;
- else if (size == sizeof(double)*2)
- type_num = PyArray_CDOUBLE;
- else if (size == sizeof(longdouble)*2)
- type_num = PyArray_CLONGDOUBLE;
- else _MY_FAIL
- break;
- case 'O':
- if (size == sizeof(PyObject *))
- type_num = PyArray_OBJECT;
- else _MY_FAIL
- break;
- case PyArray_STRINGLTR:
- type_num = PyArray_STRING;
- break;
- case PyArray_UNICODELTR:
- type_num = PyArray_UNICODE;
- size <<= 2;
- break;
- case 'V':
- type_num = PyArray_VOID;
- break;
- default:
- _MY_FAIL
- }
+ PyArray_Descr *descr;
+ int type_num;
+ char typechar;
+ int size;
+ char msg[] = "unsupported typestring";
+ int swap;
+ char swapchar;
+
+ swapchar = str[0];
+ str += 1;
+
+#define _MY_FAIL { \
+ PyErr_SetString(PyExc_ValueError, msg); \
+ return NULL; \
+ }
+
+ typechar = str[0];
+ size = atoi(str + 1);
+ switch (typechar) {
+ case 'b':
+ if (size == sizeof(Bool))
+ type_num = PyArray_BOOL;
+ else _MY_FAIL
+ break;
+ case 'u':
+ if (size == sizeof(uintp))
+ type_num = PyArray_UINTP;
+ else if (size == sizeof(char))
+ type_num = PyArray_UBYTE;
+ else if (size == sizeof(short))
+ type_num = PyArray_USHORT;
+ else if (size == sizeof(ulong))
+ type_num = PyArray_ULONG;
+ else if (size == sizeof(int))
+ type_num = PyArray_UINT;
+ else if (size == sizeof(ulonglong))
+ type_num = PyArray_ULONGLONG;
+ else _MY_FAIL
+ break;
+ case 'i':
+ if (size == sizeof(intp))
+ type_num = PyArray_INTP;
+ else if (size == sizeof(char))
+ type_num = PyArray_BYTE;
+ else if (size == sizeof(short))
+ type_num = PyArray_SHORT;
+ else if (size == sizeof(long))
+ type_num = PyArray_LONG;
+ else if (size == sizeof(int))
+ type_num = PyArray_INT;
+ else if (size == sizeof(longlong))
+ type_num = PyArray_LONGLONG;
+ else _MY_FAIL
+ break;
+ case 'f':
+ if (size == sizeof(float))
+ type_num = PyArray_FLOAT;
+ else if (size == sizeof(double))
+ type_num = PyArray_DOUBLE;
+ else if (size == sizeof(longdouble))
+ type_num = PyArray_LONGDOUBLE;
+ else _MY_FAIL
+ break;
+ case 'c':
+ if (size == sizeof(float)*2)
+ type_num = PyArray_CFLOAT;
+ else if (size == sizeof(double)*2)
+ type_num = PyArray_CDOUBLE;
+ else if (size == sizeof(longdouble)*2)
+ type_num = PyArray_CLONGDOUBLE;
+ else _MY_FAIL
+ break;
+ case 'O':
+ if (size == sizeof(PyObject *))
+ type_num = PyArray_OBJECT;
+ else _MY_FAIL
+ break;
+ case PyArray_STRINGLTR:
+ type_num = PyArray_STRING;
+ break;
+ case PyArray_UNICODELTR:
+ type_num = PyArray_UNICODE;
+ size <<= 2;
+ break;
+ case 'V':
+ type_num = PyArray_VOID;
+ break;
+ default:
+ _MY_FAIL
+ }
#undef _MY_FAIL
@@ -8138,13 +8137,13 @@ _array_typedescr_fromstr(char *str)
if (descr == NULL) return NULL;
swap = !PyArray_ISNBO(swapchar);
if (descr->elsize == 0 || swap) {
- /* Need to make a new PyArray_Descr */
- PyArray_DESCR_REPLACE(descr);
- if (descr==NULL) return NULL;
- if (descr->elsize == 0)
- descr->elsize = size;
- if (swap)
- descr->byteorder = swapchar;
+ /* Need to make a new PyArray_Descr */
+ PyArray_DESCR_REPLACE(descr);
+ if (descr==NULL) return NULL;
+ if (descr->elsize == 0)
+ descr->elsize = size;
+ if (swap)
+ descr->byteorder = swapchar;
}
return descr;
}
@@ -8153,54 +8152,54 @@ _array_typedescr_fromstr(char *str)
static PyObject *
PyArray_FromStructInterface(PyObject *input)
{
- PyArray_Descr *thetype=NULL;
- char buf[40];
- PyArrayInterface *inter;
- PyObject *attr, *r;
- char endian = PyArray_NATBYTE;
+ PyArray_Descr *thetype=NULL;
+ char buf[40];
+ PyArrayInterface *inter;
+ PyObject *attr, *r;
+ char endian = PyArray_NATBYTE;
- attr = PyObject_GetAttrString(input, "__array_struct__");
- if (attr == NULL) {
- PyErr_Clear();
- return Py_NotImplemented;
- }
- if (!PyCObject_Check(attr)) goto fail;
- inter = PyCObject_AsVoidPtr(attr);
- if (inter->two != 2) goto fail;
- if ((inter->flags & NOTSWAPPED) != NOTSWAPPED) {
- endian = PyArray_OPPBYTE;
- inter->flags &= ~NOTSWAPPED;
- }
+ attr = PyObject_GetAttrString(input, "__array_struct__");
+ if (attr == NULL) {
+ PyErr_Clear();
+ return Py_NotImplemented;
+ }
+ if (!PyCObject_Check(attr)) goto fail;
+ inter = PyCObject_AsVoidPtr(attr);
+ if (inter->two != 2) goto fail;
+ if ((inter->flags & NOTSWAPPED) != NOTSWAPPED) {
+ endian = PyArray_OPPBYTE;
+ inter->flags &= ~NOTSWAPPED;
+ }
- if (inter->flags & ARR_HAS_DESCR) {
- if (PyArray_DescrConverter(inter->descr, &thetype) == PY_FAIL) {
- thetype = NULL;
- PyErr_Clear();
- }
+ if (inter->flags & ARR_HAS_DESCR) {
+ if (PyArray_DescrConverter(inter->descr, &thetype) == PY_FAIL) {
+ thetype = NULL;
+ PyErr_Clear();
}
+ }
- if (thetype == NULL) {
- snprintf(buf, 40, "%c%c%d", endian, inter->typekind, inter->itemsize);
- if (!(thetype=_array_typedescr_fromstr(buf))) {
- Py_DECREF(attr);
- return NULL;
- }
+ if (thetype == NULL) {
+ snprintf(buf, 40, "%c%c%d", endian, inter->typekind, inter->itemsize);
+ if (!(thetype=_array_typedescr_fromstr(buf))) {
+ Py_DECREF(attr);
+ return NULL;
}
+ }
- r = PyArray_NewFromDescr(&PyArray_Type, thetype,
- inter->nd, inter->shape,
- inter->strides, inter->data,
- inter->flags, NULL);
- Py_INCREF(input);
- PyArray_BASE(r) = input;
- Py_DECREF(attr);
- PyArray_UpdateFlags((PyArrayObject *)r, UPDATE_ALL);
- return r;
+ r = PyArray_NewFromDescr(&PyArray_Type, thetype,
+ inter->nd, inter->shape,
+ inter->strides, inter->data,
+ inter->flags, NULL);
+ Py_INCREF(input);
+ PyArray_BASE(r) = input;
+ Py_DECREF(attr);
+ PyArray_UpdateFlags((PyArrayObject *)r, UPDATE_ALL);
+ return r;
fail:
- PyErr_SetString(PyExc_ValueError, "invalid __array_struct__");
- Py_DECREF(attr);
- return NULL;
+ PyErr_SetString(PyExc_ValueError, "invalid __array_struct__");
+ Py_DECREF(attr);
+ return NULL;
}
#define PyIntOrLong_Check(obj) (PyInt_Check(obj) || PyLong_Check(obj))
@@ -8209,198 +8208,198 @@ PyArray_FromStructInterface(PyObject *input)
static PyObject *
PyArray_FromInterface(PyObject *input)
{
- PyObject *attr=NULL, *item=NULL;
- PyObject *tstr=NULL, *shape=NULL;
- PyObject *inter=NULL;
- PyObject *base=NULL;
- PyArrayObject *ret;
- PyArray_Descr *type=NULL;
- char *data;
- Py_ssize_t buffer_len;
- int res, i, n;
- intp dims[MAX_DIMS], strides[MAX_DIMS];
- int dataflags = BEHAVED;
-
- /* Get the memory from __array_data__ and __array_offset__ */
- /* Get the shape */
- /* Get the typestring -- ignore array_descr */
- /* Get the strides */
-
- inter = PyObject_GetAttrString(input, "__array_interface__");
- if (inter == NULL) {PyErr_Clear(); return Py_NotImplemented;}
- if (!PyDict_Check(inter)) {Py_DECREF(inter); return Py_NotImplemented;}
-
- shape = PyDict_GetItemString(inter, "shape");
- if (shape == NULL) {Py_DECREF(inter); return Py_NotImplemented;}
- tstr = PyDict_GetItemString(inter, "typestr");
- if (tstr == NULL) {Py_DECREF(inter); return Py_NotImplemented;}
-
- attr = PyDict_GetItemString(inter, "data");
- base = input;
- if ((attr == NULL) || (attr==Py_None) || (!PyTuple_Check(attr))) {
- if (attr && (attr != Py_None)) item=attr;
- else item=input;
- res = PyObject_AsWriteBuffer(item, (void **)&data,
- &buffer_len);
- if (res < 0) {
- PyErr_Clear();
- res = PyObject_AsReadBuffer(item, (const void **)&data,
- &buffer_len);
- if (res < 0) goto fail;
- dataflags &= ~WRITEABLE;
- }
- attr = PyDict_GetItemString(inter, "offset");
- if (attr) {
- longlong num = PyLong_AsLongLong(attr);
- if (error_converting(num)) {
- PyErr_SetString(PyExc_TypeError,
- "offset "\
- "must be an integer");
- goto fail;
- }
- data += num;
- }
- base = item;
+ PyObject *attr=NULL, *item=NULL;
+ PyObject *tstr=NULL, *shape=NULL;
+ PyObject *inter=NULL;
+ PyObject *base=NULL;
+ PyArrayObject *ret;
+ PyArray_Descr *type=NULL;
+ char *data;
+ Py_ssize_t buffer_len;
+ int res, i, n;
+ intp dims[MAX_DIMS], strides[MAX_DIMS];
+ int dataflags = BEHAVED;
+
+ /* Get the memory from __array_data__ and __array_offset__ */
+ /* Get the shape */
+ /* Get the typestring -- ignore array_descr */
+ /* Get the strides */
+
+ inter = PyObject_GetAttrString(input, "__array_interface__");
+ if (inter == NULL) {PyErr_Clear(); return Py_NotImplemented;}
+ if (!PyDict_Check(inter)) {Py_DECREF(inter); return Py_NotImplemented;}
+
+ shape = PyDict_GetItemString(inter, "shape");
+ if (shape == NULL) {Py_DECREF(inter); return Py_NotImplemented;}
+ tstr = PyDict_GetItemString(inter, "typestr");
+ if (tstr == NULL) {Py_DECREF(inter); return Py_NotImplemented;}
+
+ attr = PyDict_GetItemString(inter, "data");
+ base = input;
+ if ((attr == NULL) || (attr==Py_None) || (!PyTuple_Check(attr))) {
+ if (attr && (attr != Py_None)) item=attr;
+ else item=input;
+ res = PyObject_AsWriteBuffer(item, (void **)&data,
+ &buffer_len);
+ if (res < 0) {
+ PyErr_Clear();
+ res = PyObject_AsReadBuffer(item, (const void **)&data,
+ &buffer_len);
+ if (res < 0) goto fail;
+ dataflags &= ~WRITEABLE;
+ }
+ attr = PyDict_GetItemString(inter, "offset");
+ if (attr) {
+ longlong num = PyLong_AsLongLong(attr);
+ if (error_converting(num)) {
+ PyErr_SetString(PyExc_TypeError,
+ "offset "\
+ "must be an integer");
+ goto fail;
+ }
+ data += num;
+ }
+ base = item;
+ }
+ else {
+ PyObject *dataptr;
+ if (PyTuple_GET_SIZE(attr) != 2) {
+ PyErr_SetString(PyExc_TypeError,
+ "data must return " \
+ "a 2-tuple with (data pointer "\
+ "integer, read-only flag)");
+ goto fail;
+ }
+ dataptr = PyTuple_GET_ITEM(attr, 0);
+ if (PyString_Check(dataptr)) {
+ res = sscanf(PyString_AsString(dataptr),
+ "%p", (void **)&data);
+ if (res < 1) {
+ PyErr_SetString(PyExc_TypeError,
+ "data string cannot be " \
+ "converted");
+ goto fail;
+ }
+ }
+ else if (PyIntOrLong_Check(dataptr)) {
+ data = PyLong_AsVoidPtr(dataptr);
}
else {
- PyObject *dataptr;
- if (PyTuple_GET_SIZE(attr) != 2) {
- PyErr_SetString(PyExc_TypeError,
- "data must return " \
- "a 2-tuple with (data pointer "\
- "integer, read-only flag)");
- goto fail;
- }
- dataptr = PyTuple_GET_ITEM(attr, 0);
- if (PyString_Check(dataptr)) {
- res = sscanf(PyString_AsString(dataptr),
- "%p", (void **)&data);
- if (res < 1) {
- PyErr_SetString(PyExc_TypeError,
- "data string cannot be " \
- "converted");
- goto fail;
- }
- }
- else if (PyIntOrLong_Check(dataptr)) {
- data = PyLong_AsVoidPtr(dataptr);
- }
- else {
- PyErr_SetString(PyExc_TypeError, "first element " \
- "of data tuple must be integer" \
- " or string.");
- goto fail;
- }
- if (PyObject_IsTrue(PyTuple_GET_ITEM(attr,1))) {
- dataflags &= ~WRITEABLE;
- }
+ PyErr_SetString(PyExc_TypeError, "first element " \
+ "of data tuple must be integer" \
+ " or string.");
+ goto fail;
}
- attr = tstr;
- if (!PyString_Check(attr)) {
- PyErr_SetString(PyExc_TypeError, "typestr must be a string");
- goto fail;
+ if (PyObject_IsTrue(PyTuple_GET_ITEM(attr,1))) {
+ dataflags &= ~WRITEABLE;
}
- type = _array_typedescr_fromstr(PyString_AS_STRING(attr));
- if (type==NULL) goto fail;
- attr = shape;
+ }
+ attr = tstr;
+ if (!PyString_Check(attr)) {
+ PyErr_SetString(PyExc_TypeError, "typestr must be a string");
+ goto fail;
+ }
+ type = _array_typedescr_fromstr(PyString_AS_STRING(attr));
+ if (type==NULL) goto fail;
+ attr = shape;
+ if (!PyTuple_Check(attr)) {
+ PyErr_SetString(PyExc_TypeError, "shape must be a tuple");
+ Py_DECREF(type);
+ goto fail;
+ }
+ n = PyTuple_GET_SIZE(attr);
+ for (i=0; i<n; i++) {
+ item = PyTuple_GET_ITEM(attr, i);
+ dims[i] = PyArray_PyIntAsIntp(item);
+ if (error_converting(dims[i])) break;
+ }
+
+ ret = (PyArrayObject *)PyArray_NewFromDescr(&PyArray_Type, type,
+ n, dims,
+ NULL, data,
+ dataflags, NULL);
+ if (ret == NULL) return NULL;
+ Py_INCREF(base);
+ ret->base = base;
+
+ attr = PyDict_GetItemString(inter, "strides");
+ if (attr != NULL && attr != Py_None) {
if (!PyTuple_Check(attr)) {
- PyErr_SetString(PyExc_TypeError, "shape must be a tuple");
- Py_DECREF(type);
- goto fail;
+ PyErr_SetString(PyExc_TypeError,
+ "strides must be a tuple");
+ Py_DECREF(ret);
+ return NULL;
}
- n = PyTuple_GET_SIZE(attr);
- for (i=0; i<n; i++) {
- item = PyTuple_GET_ITEM(attr, i);
- dims[i] = PyArray_PyIntAsIntp(item);
- if (error_converting(dims[i])) break;
+ if (n != PyTuple_GET_SIZE(attr)) {
+ PyErr_SetString(PyExc_ValueError,
+ "mismatch in length of "\
+ "strides and shape");
+ Py_DECREF(ret);
+ return NULL;
}
-
- ret = (PyArrayObject *)PyArray_NewFromDescr(&PyArray_Type, type,
- n, dims,
- NULL, data,
- dataflags, NULL);
- if (ret == NULL) return NULL;
- Py_INCREF(base);
- ret->base = base;
-
- attr = PyDict_GetItemString(inter, "strides");
- if (attr != NULL && attr != Py_None) {
- if (!PyTuple_Check(attr)) {
- PyErr_SetString(PyExc_TypeError,
- "strides must be a tuple");
- Py_DECREF(ret);
- return NULL;
- }
- if (n != PyTuple_GET_SIZE(attr)) {
- PyErr_SetString(PyExc_ValueError,
- "mismatch in length of "\
- "strides and shape");
- Py_DECREF(ret);
- return NULL;
- }
- for (i=0; i<n; i++) {
- item = PyTuple_GET_ITEM(attr, i);
- strides[i] = PyArray_PyIntAsIntp(item);
- if (error_converting(strides[i])) break;
- }
- if (PyErr_Occurred()) PyErr_Clear();
- memcpy(ret->strides, strides, n*sizeof(intp));
+ for (i=0; i<n; i++) {
+ item = PyTuple_GET_ITEM(attr, i);
+ strides[i] = PyArray_PyIntAsIntp(item);
+ if (error_converting(strides[i])) break;
}
- else PyErr_Clear();
- PyArray_UpdateFlags(ret, UPDATE_ALL);
- Py_DECREF(inter);
- return (PyObject *)ret;
+ if (PyErr_Occurred()) PyErr_Clear();
+ memcpy(ret->strides, strides, n*sizeof(intp));
+ }
+ else PyErr_Clear();
+ PyArray_UpdateFlags(ret, UPDATE_ALL);
+ Py_DECREF(inter);
+ return (PyObject *)ret;
fail:
- Py_XDECREF(inter);
- return NULL;
+ Py_XDECREF(inter);
+ return NULL;
}
/*OBJECT_API*/
static PyObject *
PyArray_FromArrayAttr(PyObject *op, PyArray_Descr *typecode, PyObject *context)
{
- PyObject *new;
- PyObject *array_meth;
+ PyObject *new;
+ PyObject *array_meth;
- array_meth = PyObject_GetAttrString(op, "__array__");
- if (array_meth == NULL) {PyErr_Clear(); return Py_NotImplemented;}
- if (context == NULL) {
- if (typecode == NULL) new = PyObject_CallFunction(array_meth,
- NULL);
- else new = PyObject_CallFunction(array_meth, "O", typecode);
+ array_meth = PyObject_GetAttrString(op, "__array__");
+ if (array_meth == NULL) {PyErr_Clear(); return Py_NotImplemented;}
+ if (context == NULL) {
+ if (typecode == NULL) new = PyObject_CallFunction(array_meth,
+ NULL);
+ else new = PyObject_CallFunction(array_meth, "O", typecode);
+ }
+ else {
+ if (typecode == NULL) {
+ new = PyObject_CallFunction(array_meth, "OO", Py_None,
+ context);
+ if (new == NULL && \
+ PyErr_ExceptionMatches(PyExc_TypeError)) {
+ PyErr_Clear();
+ new = PyObject_CallFunction(array_meth, "");
+ }
}
else {
- if (typecode == NULL) {
- new = PyObject_CallFunction(array_meth, "OO", Py_None,
- context);
- if (new == NULL && \
- PyErr_ExceptionMatches(PyExc_TypeError)) {
- PyErr_Clear();
- new = PyObject_CallFunction(array_meth, "");
- }
- }
- else {
- new = PyObject_CallFunction(array_meth, "OO",
- typecode, context);
- if (new == NULL && \
- PyErr_ExceptionMatches(PyExc_TypeError)) {
- PyErr_Clear();
- new = PyObject_CallFunction(array_meth, "O",
- typecode);
- }
- }
- }
- Py_DECREF(array_meth);
- if (new == NULL) return NULL;
- if (!PyArray_Check(new)) {
- PyErr_SetString(PyExc_ValueError,
- "object __array__ method not " \
- "producing an array");
- Py_DECREF(new);
- return NULL;
+ new = PyObject_CallFunction(array_meth, "OO",
+ typecode, context);
+ if (new == NULL && \
+ PyErr_ExceptionMatches(PyExc_TypeError)) {
+ PyErr_Clear();
+ new = PyObject_CallFunction(array_meth, "O",
+ typecode);
+ }
}
- return new;
+ }
+ Py_DECREF(array_meth);
+ if (new == NULL) return NULL;
+ if (!PyArray_Check(new)) {
+ PyErr_SetString(PyExc_ValueError,
+ "object __array__ method not " \
+ "producing an array");
+ Py_DECREF(new);
+ return NULL;
+ }
+ return new;
}
/* Does not check for ENSURECOPY and NOTSWAPPED in flags */
@@ -8410,108 +8409,108 @@ static PyObject *
PyArray_FromAny(PyObject *op, PyArray_Descr *newtype, int min_depth,
int max_depth, int flags, PyObject *context)
{
- /* This is the main code to make a NumPy array from a Python
- Object. It is called from lot's of different places which
- is why there are so many checks. The comments try to
- explain some of the checks. */
-
- PyObject *r=NULL;
- int seq = FALSE;
-
- /* Is input object already an array? */
- /* This is where the flags are used */
- if (PyArray_Check(op))
- r = PyArray_FromArray((PyArrayObject *)op, newtype, flags);
- else if (PyArray_IsScalar(op, Generic)) {
- if (flags & UPDATEIFCOPY) goto err;
- r = PyArray_FromScalar(op, newtype);
- } else if (newtype == NULL &&
- (newtype = _array_find_python_scalar_type(op))) {
- if (flags & UPDATEIFCOPY) goto err;
- r = Array_FromPyScalar(op, newtype);
+ /* This is the main code to make a NumPy array from a Python
+ Object. It is called from lot's of different places which
+ is why there are so many checks. The comments try to
+ explain some of the checks. */
+
+ PyObject *r=NULL;
+ int seq = FALSE;
+
+ /* Is input object already an array? */
+ /* This is where the flags are used */
+ if (PyArray_Check(op))
+ r = PyArray_FromArray((PyArrayObject *)op, newtype, flags);
+ else if (PyArray_IsScalar(op, Generic)) {
+ if (flags & UPDATEIFCOPY) goto err;
+ r = PyArray_FromScalar(op, newtype);
+ } else if (newtype == NULL &&
+ (newtype = _array_find_python_scalar_type(op))) {
+ if (flags & UPDATEIFCOPY) goto err;
+ r = Array_FromPyScalar(op, newtype);
+ }
+ else if (PyArray_HasArrayInterfaceType(op, newtype, context, r)) {
+ PyObject *new;
+ if (r == NULL) {Py_XDECREF(newtype); return NULL;}
+ if (newtype != NULL || flags != 0) {
+ new = PyArray_FromArray((PyArrayObject *)r, newtype,
+ flags);
+ Py_DECREF(r);
+ r = new;
}
- else if (PyArray_HasArrayInterfaceType(op, newtype, context, r)) {
- PyObject *new;
- if (r == NULL) {Py_XDECREF(newtype); return NULL;}
- if (newtype != NULL || flags != 0) {
- new = PyArray_FromArray((PyArrayObject *)r, newtype,
- flags);
- Py_DECREF(r);
- r = new;
- }
+ }
+ else {
+ int isobject=0;
+ if (flags & UPDATEIFCOPY) goto err;
+ if (newtype == NULL) {
+ newtype = _array_find_type(op, NULL, MAX_DIMS);
}
- else {
- int isobject=0;
- if (flags & UPDATEIFCOPY) goto err;
- if (newtype == NULL) {
- newtype = _array_find_type(op, NULL, MAX_DIMS);
- }
- else if (newtype->type_num == PyArray_OBJECT) {
- isobject = 1;
- }
- if (PySequence_Check(op)) {
- PyObject *thiserr=NULL;
- /* necessary but not sufficient */
- Py_INCREF(newtype);
- r = Array_FromSequence(op, newtype, flags & FORTRAN,
- min_depth, max_depth);
- if (r == NULL && (thiserr=PyErr_Occurred())) {
- if (PyErr_GivenExceptionMatches(thiserr,
- PyExc_MemoryError))
- return NULL;
- /* If object was explicitly requested,
- then try nested list object array creation
- */
- PyErr_Clear();
- if (isobject) {
- Py_INCREF(newtype);
- r = ObjectArray_FromNestedList \
- (op, newtype, flags & FORTRAN);
- seq = TRUE;
- Py_DECREF(newtype);
- }
- }
- else {
- seq = TRUE;
- Py_DECREF(newtype);
- }
+ else if (newtype->type_num == PyArray_OBJECT) {
+ isobject = 1;
+ }
+ if (PySequence_Check(op)) {
+ PyObject *thiserr=NULL;
+ /* necessary but not sufficient */
+ Py_INCREF(newtype);
+ r = Array_FromSequence(op, newtype, flags & FORTRAN,
+ min_depth, max_depth);
+ if (r == NULL && (thiserr=PyErr_Occurred())) {
+ if (PyErr_GivenExceptionMatches(thiserr,
+ PyExc_MemoryError))
+ return NULL;
+ /* If object was explicitly requested,
+ then try nested list object array creation
+ */
+ PyErr_Clear();
+ if (isobject) {
+ Py_INCREF(newtype);
+ r = ObjectArray_FromNestedList \
+ (op, newtype, flags & FORTRAN);
+ seq = TRUE;
+ Py_DECREF(newtype);
}
- if (!seq)
- r = Array_FromPyScalar(op, newtype);
+ }
+ else {
+ seq = TRUE;
+ Py_DECREF(newtype);
+ }
}
+ if (!seq)
+ r = Array_FromPyScalar(op, newtype);
+ }
- /* If we didn't succeed return NULL */
- if (r == NULL) return NULL;
+ /* If we didn't succeed return NULL */
+ if (r == NULL) return NULL;
- /* Be sure we succeed here */
+ /* Be sure we succeed here */
- if(!PyArray_Check(r)) {
- PyErr_SetString(PyExc_RuntimeError,
- "internal error: PyArray_FromAny "\
- "not producing an array");
- Py_DECREF(r);
- return NULL;
- }
+ if(!PyArray_Check(r)) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "internal error: PyArray_FromAny "\
+ "not producing an array");
+ Py_DECREF(r);
+ return NULL;
+ }
- if (min_depth != 0 && ((PyArrayObject *)r)->nd < min_depth) {
- PyErr_SetString(PyExc_ValueError,
- "object of too small depth for desired array");
- Py_DECREF(r);
- return NULL;
- }
- if (max_depth != 0 && ((PyArrayObject *)r)->nd > max_depth) {
- PyErr_SetString(PyExc_ValueError,
- "object too deep for desired array");
- Py_DECREF(r);
- return NULL;
- }
- return r;
+ if (min_depth != 0 && ((PyArrayObject *)r)->nd < min_depth) {
+ PyErr_SetString(PyExc_ValueError,
+ "object of too small depth for desired array");
+ Py_DECREF(r);
+ return NULL;
+ }
+ if (max_depth != 0 && ((PyArrayObject *)r)->nd > max_depth) {
+ PyErr_SetString(PyExc_ValueError,
+ "object too deep for desired array");
+ Py_DECREF(r);
+ return NULL;
+ }
+ return r;
err:
- Py_XDECREF(newtype);
- PyErr_SetString(PyExc_TypeError,
- "UPDATEIFCOPY used for non-array input.");
- return NULL;
+ Py_XDECREF(newtype);
+ PyErr_SetString(PyExc_TypeError,
+ "UPDATEIFCOPY used for non-array input.");
+ return NULL;
}
/* new reference -- accepts NULL for mintype*/
@@ -8519,41 +8518,41 @@ PyArray_FromAny(PyObject *op, PyArray_Descr *newtype, int min_depth,
static PyArray_Descr *
PyArray_DescrFromObject(PyObject *op, PyArray_Descr *mintype)
{
- return _array_find_type(op, mintype, MAX_DIMS);
+ return _array_find_type(op, mintype, MAX_DIMS);
}
/*OBJECT_API
- Return the typecode of the array a Python object would be converted
- to
+ Return the typecode of the array a Python object would be converted
+ to
*/
static int
PyArray_ObjectType(PyObject *op, int minimum_type)
{
- PyArray_Descr *intype;
- PyArray_Descr *outtype;
- int ret;
+ PyArray_Descr *intype;
+ PyArray_Descr *outtype;
+ int ret;
- intype = PyArray_DescrFromType(minimum_type);
- if (intype == NULL) PyErr_Clear();
- outtype = _array_find_type(op, intype, MAX_DIMS);
- ret = outtype->type_num;
- Py_DECREF(outtype);
- Py_XDECREF(intype);
- return ret;
+ intype = PyArray_DescrFromType(minimum_type);
+ if (intype == NULL) PyErr_Clear();
+ outtype = _array_find_type(op, intype, MAX_DIMS);
+ ret = outtype->type_num;
+ Py_DECREF(outtype);
+ Py_XDECREF(intype);
+ return ret;
}
/* flags is any of
- CONTIGUOUS,
- FORTRAN,
- ALIGNED,
- WRITEABLE,
- NOTSWAPPED,
- ENSURECOPY,
- UPDATEIFCOPY,
- FORCECAST,
- ENSUREARRAY,
- ELEMENTSTRIDES
+ CONTIGUOUS,
+ FORTRAN,
+ ALIGNED,
+ WRITEABLE,
+ NOTSWAPPED,
+ ENSURECOPY,
+ UPDATEIFCOPY,
+ FORCECAST,
+ ENSUREARRAY,
+ ELEMENTSTRIDES
or'd (|) together
@@ -8590,35 +8589,35 @@ static PyObject *
PyArray_CheckFromAny(PyObject *op, PyArray_Descr *descr, int min_depth,
int max_depth, int requires, PyObject *context)
{
- PyObject *obj;
- if (requires & NOTSWAPPED) {
- if (!descr && PyArray_Check(op) && \
- !PyArray_ISNBO(PyArray_DESCR(op)->byteorder)) {
- descr = PyArray_DescrNew(PyArray_DESCR(op));
- }
- else if (descr && !PyArray_ISNBO(descr->byteorder)) {
- PyArray_DESCR_REPLACE(descr);
- }
- if (descr) {
- descr->byteorder = PyArray_NATIVE;
- }
+ PyObject *obj;
+ if (requires & NOTSWAPPED) {
+ if (!descr && PyArray_Check(op) && \
+ !PyArray_ISNBO(PyArray_DESCR(op)->byteorder)) {
+ descr = PyArray_DescrNew(PyArray_DESCR(op));
}
-
- obj = PyArray_FromAny(op, descr, min_depth, max_depth,
- requires, context);
- if (obj == NULL) return NULL;
- if ((requires & ELEMENTSTRIDES) &&
- !PyArray_ElementStrides(obj)) {
- PyObject *new;
- new = PyArray_NewCopy((PyArrayObject *)obj, PyArray_ANYORDER);
- Py_DECREF(obj);
- obj = new;
+ else if (descr && !PyArray_ISNBO(descr->byteorder)) {
+ PyArray_DESCR_REPLACE(descr);
}
- return obj;
+ if (descr) {
+ descr->byteorder = PyArray_NATIVE;
+ }
+ }
+
+ obj = PyArray_FromAny(op, descr, min_depth, max_depth,
+ requires, context);
+ if (obj == NULL) return NULL;
+ if ((requires & ELEMENTSTRIDES) &&
+ !PyArray_ElementStrides(obj)) {
+ PyObject *new;
+ new = PyArray_NewCopy((PyArrayObject *)obj, PyArray_ANYORDER);
+ Py_DECREF(obj);
+ obj = new;
+ }
+ return obj;
}
/* This is a quick wrapper around PyArray_FromAny(op, NULL, 0, 0,
- ENSUREARRAY) */
+ ENSUREARRAY) */
/* that special cases Arrays and PyArray_Scalars up front */
/* It *steals a reference* to the object */
/* It also guarantees that the result is PyArray_Type */
@@ -8630,139 +8629,139 @@ PyArray_CheckFromAny(PyObject *op, PyArray_Descr *descr, int min_depth,
static PyObject *
PyArray_EnsureArray(PyObject *op)
{
- PyObject *new;
+ PyObject *new;
- if (op == NULL) return NULL;
+ if (op == NULL) return NULL;
- if (PyArray_CheckExact(op)) return op;
+ if (PyArray_CheckExact(op)) return op;
- if (PyArray_Check(op)) {
- new = PyArray_View((PyArrayObject *)op, NULL, &PyArray_Type);
- Py_DECREF(op);
- return new;
- }
- if (PyArray_IsScalar(op, Generic)) {
- new = PyArray_FromScalar(op, NULL);
- Py_DECREF(op);
- return new;
- }
- new = PyArray_FromAny(op, NULL, 0, 0, ENSUREARRAY, NULL);
+ if (PyArray_Check(op)) {
+ new = PyArray_View((PyArrayObject *)op, NULL, &PyArray_Type);
Py_DECREF(op);
return new;
+ }
+ if (PyArray_IsScalar(op, Generic)) {
+ new = PyArray_FromScalar(op, NULL);
+ Py_DECREF(op);
+ return new;
+ }
+ new = PyArray_FromAny(op, NULL, 0, 0, ENSUREARRAY, NULL);
+ Py_DECREF(op);
+ return new;
}
/*OBJECT_API*/
static PyObject *
PyArray_EnsureAnyArray(PyObject *op)
{
- if (op && PyArray_Check(op)) return op;
- return PyArray_EnsureArray(op);
+ if (op && PyArray_Check(op)) return op;
+ return PyArray_EnsureArray(op);
}
/*OBJECT_API
- Check the type coercion rules.
+ Check the type coercion rules.
*/
static int
PyArray_CanCastSafely(int fromtype, int totype)
{
- PyArray_Descr *from, *to;
- register int felsize, telsize;
-
- if (fromtype == totype) return 1;
- if (fromtype == PyArray_BOOL) return 1;
- if (totype == PyArray_BOOL) return 0;
- if (totype == PyArray_OBJECT || totype == PyArray_VOID) return 1;
- if (fromtype == PyArray_OBJECT || fromtype == PyArray_VOID) return 0;
-
- from = PyArray_DescrFromType(fromtype);
- /* cancastto is a PyArray_NOTYPE terminated C-int-array of types that
- the data-type can be cast to safely.
- */
- if (from->f->cancastto) {
- int *curtype;
- curtype = from->f->cancastto;
- while (*curtype != PyArray_NOTYPE) {
- if (*curtype++ == totype) return 1;
- }
+ PyArray_Descr *from, *to;
+ register int felsize, telsize;
+
+ if (fromtype == totype) return 1;
+ if (fromtype == PyArray_BOOL) return 1;
+ if (totype == PyArray_BOOL) return 0;
+ if (totype == PyArray_OBJECT || totype == PyArray_VOID) return 1;
+ if (fromtype == PyArray_OBJECT || fromtype == PyArray_VOID) return 0;
+
+ from = PyArray_DescrFromType(fromtype);
+ /* cancastto is a PyArray_NOTYPE terminated C-int-array of types that
+ the data-type can be cast to safely.
+ */
+ if (from->f->cancastto) {
+ int *curtype;
+ curtype = from->f->cancastto;
+ while (*curtype != PyArray_NOTYPE) {
+ if (*curtype++ == totype) return 1;
}
- if (PyTypeNum_ISUSERDEF(totype)) return 0;
-
- to = PyArray_DescrFromType(totype);
- telsize = to->elsize;
- felsize = from->elsize;
- Py_DECREF(from);
- Py_DECREF(to);
-
- switch(fromtype) {
- case PyArray_BYTE:
- case PyArray_SHORT:
- case PyArray_INT:
- case PyArray_LONG:
- case PyArray_LONGLONG:
- if (PyTypeNum_ISINTEGER(totype)) {
- if (PyTypeNum_ISUNSIGNED(totype)) {
- return 0;
- }
- else {
- return (telsize >= felsize);
- }
- }
- else if (PyTypeNum_ISFLOAT(totype)) {
- if (felsize < 8)
- return (telsize > felsize);
- else
- return (telsize >= felsize);
- }
- else if (PyTypeNum_ISCOMPLEX(totype)) {
- if (felsize < 8)
- return ((telsize >> 1) > felsize);
- else
- return ((telsize >> 1) >= felsize);
- }
- else return totype > fromtype;
- case PyArray_UBYTE:
- case PyArray_USHORT:
- case PyArray_UINT:
- case PyArray_ULONG:
- case PyArray_ULONGLONG:
- if (PyTypeNum_ISINTEGER(totype)) {
- if (PyTypeNum_ISSIGNED(totype)) {
- return (telsize > felsize);
- }
- else {
- return (telsize >= felsize);
- }
- }
- else if (PyTypeNum_ISFLOAT(totype)) {
- if (felsize < 8)
- return (telsize > felsize);
- else
- return (telsize >= felsize);
- }
- else if (PyTypeNum_ISCOMPLEX(totype)) {
- if (felsize < 8)
- return ((telsize >> 1) > felsize);
- else
- return ((telsize >> 1) >= felsize);
- }
- else return totype > fromtype;
- case PyArray_FLOAT:
- case PyArray_DOUBLE:
- case PyArray_LONGDOUBLE:
- if (PyTypeNum_ISCOMPLEX(totype))
- return ((telsize >> 1) >= felsize);
- else
- return (totype > fromtype);
- case PyArray_CFLOAT:
- case PyArray_CDOUBLE:
- case PyArray_CLONGDOUBLE:
- return (totype > fromtype);
- case PyArray_STRING:
- case PyArray_UNICODE:
- return (totype > fromtype);
- default:
+ }
+ if (PyTypeNum_ISUSERDEF(totype)) return 0;
+
+ to = PyArray_DescrFromType(totype);
+ telsize = to->elsize;
+ felsize = from->elsize;
+ Py_DECREF(from);
+ Py_DECREF(to);
+
+ switch(fromtype) {
+ case PyArray_BYTE:
+ case PyArray_SHORT:
+ case PyArray_INT:
+ case PyArray_LONG:
+ case PyArray_LONGLONG:
+ if (PyTypeNum_ISINTEGER(totype)) {
+ if (PyTypeNum_ISUNSIGNED(totype)) {
return 0;
+ }
+ else {
+ return (telsize >= felsize);
+ }
+ }
+ else if (PyTypeNum_ISFLOAT(totype)) {
+ if (felsize < 8)
+ return (telsize > felsize);
+ else
+ return (telsize >= felsize);
+ }
+ else if (PyTypeNum_ISCOMPLEX(totype)) {
+ if (felsize < 8)
+ return ((telsize >> 1) > felsize);
+ else
+ return ((telsize >> 1) >= felsize);
+ }
+ else return totype > fromtype;
+ case PyArray_UBYTE:
+ case PyArray_USHORT:
+ case PyArray_UINT:
+ case PyArray_ULONG:
+ case PyArray_ULONGLONG:
+ if (PyTypeNum_ISINTEGER(totype)) {
+ if (PyTypeNum_ISSIGNED(totype)) {
+ return (telsize > felsize);
+ }
+ else {
+ return (telsize >= felsize);
+ }
}
+ else if (PyTypeNum_ISFLOAT(totype)) {
+ if (felsize < 8)
+ return (telsize > felsize);
+ else
+ return (telsize >= felsize);
+ }
+ else if (PyTypeNum_ISCOMPLEX(totype)) {
+ if (felsize < 8)
+ return ((telsize >> 1) > felsize);
+ else
+ return ((telsize >> 1) >= felsize);
+ }
+ else return totype > fromtype;
+ case PyArray_FLOAT:
+ case PyArray_DOUBLE:
+ case PyArray_LONGDOUBLE:
+ if (PyTypeNum_ISCOMPLEX(totype))
+ return ((telsize >> 1) >= felsize);
+ else
+ return (totype > fromtype);
+ case PyArray_CFLOAT:
+ case PyArray_CDOUBLE:
+ case PyArray_CLONGDOUBLE:
+ return (totype > fromtype);
+ case PyArray_STRING:
+ case PyArray_UNICODE:
+ return (totype > fromtype);
+ default:
+ return 0;
+ }
}
/* leaves reference count alone --- cannot be NULL*/
@@ -8770,48 +8769,48 @@ PyArray_CanCastSafely(int fromtype, int totype)
static Bool
PyArray_CanCastTo(PyArray_Descr *from, PyArray_Descr *to)
{
- int fromtype=from->type_num;
- int totype=to->type_num;
- Bool ret;
-
- ret = (Bool) PyArray_CanCastSafely(fromtype, totype);
- if (ret) { /* Check String and Unicode more closely */
- if (fromtype == PyArray_STRING) {
- if (totype == PyArray_STRING) {
- ret = (from->elsize <= to->elsize);
- }
- else if (totype == PyArray_UNICODE) {
- ret = (from->elsize << 2 \
- <= to->elsize);
- }
- }
- else if (fromtype == PyArray_UNICODE) {
- if (totype == PyArray_UNICODE) {
- ret = (from->elsize <= to->elsize);
- }
- }
- /* TODO: If totype is STRING or unicode
- see if the length is long enough to hold the
- stringified value of the object.
- */
+ int fromtype=from->type_num;
+ int totype=to->type_num;
+ Bool ret;
+
+ ret = (Bool) PyArray_CanCastSafely(fromtype, totype);
+ if (ret) { /* Check String and Unicode more closely */
+ if (fromtype == PyArray_STRING) {
+ if (totype == PyArray_STRING) {
+ ret = (from->elsize <= to->elsize);
+ }
+ else if (totype == PyArray_UNICODE) {
+ ret = (from->elsize << 2 \
+ <= to->elsize);
+ }
}
- return ret;
+ else if (fromtype == PyArray_UNICODE) {
+ if (totype == PyArray_UNICODE) {
+ ret = (from->elsize <= to->elsize);
+ }
+ }
+ /* TODO: If totype is STRING or unicode
+ see if the length is long enough to hold the
+ stringified value of the object.
+ */
+ }
+ return ret;
}
/*OBJECT_API
See if array scalars can be cast.
- */
+*/
static Bool
PyArray_CanCastScalar(PyTypeObject *from, PyTypeObject *to)
{
- int fromtype;
- int totype;
+ int fromtype;
+ int totype;
- fromtype = _typenum_fromtypeobj((PyObject *)from, 0);
- totype = _typenum_fromtypeobj((PyObject *)to, 0);
- if (fromtype == PyArray_NOTYPE || totype == PyArray_NOTYPE)
- return FALSE;
- return (Bool) PyArray_CanCastSafely(fromtype, totype);
+ fromtype = _typenum_fromtypeobj((PyObject *)from, 0);
+ totype = _typenum_fromtypeobj((PyObject *)to, 0);
+ if (fromtype == PyArray_NOTYPE || totype == PyArray_NOTYPE)
+ return FALSE;
+ return (Bool) PyArray_CanCastSafely(fromtype, totype);
}
@@ -8820,110 +8819,110 @@ PyArray_CanCastScalar(PyTypeObject *from, PyTypeObject *to)
/* and Python's array iterator ***/
/*OBJECT_API
- Get Iterator.
+ Get Iterator.
*/
static PyObject *
PyArray_IterNew(PyObject *obj)
{
- PyArrayIterObject *it;
- int i, nd;
- PyArrayObject *ao = (PyArrayObject *)obj;
+ PyArrayIterObject *it;
+ int i, nd;
+ PyArrayObject *ao = (PyArrayObject *)obj;
- if (!PyArray_Check(ao)) {
- PyErr_BadInternalCall();
- return NULL;
- }
+ if (!PyArray_Check(ao)) {
+ PyErr_BadInternalCall();
+ return NULL;
+ }
- it = (PyArrayIterObject *)_pya_malloc(sizeof(PyArrayIterObject));
- PyObject_Init((PyObject *)it, &PyArrayIter_Type);
- /* it = PyObject_New(PyArrayIterObject, &PyArrayIter_Type);*/
- if (it == NULL)
- return NULL;
+ it = (PyArrayIterObject *)_pya_malloc(sizeof(PyArrayIterObject));
+ PyObject_Init((PyObject *)it, &PyArrayIter_Type);
+ /* it = PyObject_New(PyArrayIterObject, &PyArrayIter_Type);*/
+ if (it == NULL)
+ return NULL;
- nd = ao->nd;
- PyArray_UpdateFlags(ao, CONTIGUOUS);
- if PyArray_ISCONTIGUOUS(ao) it->contiguous = 1;
- else it->contiguous = 0;
- Py_INCREF(ao);
- it->ao = ao;
- it->size = PyArray_SIZE(ao);
- it->nd_m1 = nd - 1;
- it->factors[nd-1] = 1;
- for (i=0; i < nd; i++) {
- it->dims_m1[i] = ao->dimensions[i] - 1;
- it->strides[i] = ao->strides[i];
- it->backstrides[i] = it->strides[i] * \
- it->dims_m1[i];
- if (i > 0)
- it->factors[nd-i-1] = it->factors[nd-i] * \
- ao->dimensions[nd-i];
- }
- PyArray_ITER_RESET(it);
+ nd = ao->nd;
+ PyArray_UpdateFlags(ao, CONTIGUOUS);
+ if PyArray_ISCONTIGUOUS(ao) it->contiguous = 1;
+ else it->contiguous = 0;
+ Py_INCREF(ao);
+ it->ao = ao;
+ it->size = PyArray_SIZE(ao);
+ it->nd_m1 = nd - 1;
+ it->factors[nd-1] = 1;
+ for (i=0; i < nd; i++) {
+ it->dims_m1[i] = ao->dimensions[i] - 1;
+ it->strides[i] = ao->strides[i];
+ it->backstrides[i] = it->strides[i] * \
+ it->dims_m1[i];
+ if (i > 0)
+ it->factors[nd-i-1] = it->factors[nd-i] * \
+ ao->dimensions[nd-i];
+ }
+ PyArray_ITER_RESET(it);
- return (PyObject *)it;
+ return (PyObject *)it;
}
/*MULTIARRAY_API
Get Iterator broadcast to a particular shape
- */
+*/
static PyObject *
PyArray_BroadcastToShape(PyObject *obj, intp *dims, int nd)
{
- PyArrayIterObject *it;
- int i, diff, j, compat, k;
- PyArrayObject *ao = (PyArrayObject *)obj;
-
- if (ao->nd > nd) goto err;
- compat = 1;
- diff = j = nd - ao->nd;
- for (i=0; i<ao->nd; i++, j++) {
- if (ao->dimensions[i] == 1) continue;
- if (ao->dimensions[i] != dims[j]) {
- compat = 0;
- break;
- }
+ PyArrayIterObject *it;
+ int i, diff, j, compat, k;
+ PyArrayObject *ao = (PyArrayObject *)obj;
+
+ if (ao->nd > nd) goto err;
+ compat = 1;
+ diff = j = nd - ao->nd;
+ for (i=0; i<ao->nd; i++, j++) {
+ if (ao->dimensions[i] == 1) continue;
+ if (ao->dimensions[i] != dims[j]) {
+ compat = 0;
+ break;
}
- if (!compat) goto err;
+ }
+ if (!compat) goto err;
- it = (PyArrayIterObject *)_pya_malloc(sizeof(PyArrayIterObject));
- PyObject_Init((PyObject *)it, &PyArrayIter_Type);
+ it = (PyArrayIterObject *)_pya_malloc(sizeof(PyArrayIterObject));
+ PyObject_Init((PyObject *)it, &PyArrayIter_Type);
- if (it == NULL)
- return NULL;
+ if (it == NULL)
+ return NULL;
- PyArray_UpdateFlags(ao, CONTIGUOUS);
- if PyArray_ISCONTIGUOUS(ao) it->contiguous = 1;
- else it->contiguous = 0;
- Py_INCREF(ao);
- it->ao = ao;
- it->size = PyArray_MultiplyList(dims, nd);
- it->nd_m1 = nd - 1;
- it->factors[nd-1] = 1;
- for (i=0; i < nd; i++) {
- it->dims_m1[i] = dims[i] - 1;
- k = i - diff;
- if ((k < 0) ||
- ao->dimensions[k] != dims[i]) {
- it->contiguous = 0;
- it->strides[i] = 0;
- }
- else {
- it->strides[i] = ao->strides[k];
- }
- it->backstrides[i] = it->strides[i] * \
- it->dims_m1[i];
- if (i > 0)
- it->factors[nd-i-1] = it->factors[nd-i] * \
- dims[nd-i];
+ PyArray_UpdateFlags(ao, CONTIGUOUS);
+ if PyArray_ISCONTIGUOUS(ao) it->contiguous = 1;
+ else it->contiguous = 0;
+ Py_INCREF(ao);
+ it->ao = ao;
+ it->size = PyArray_MultiplyList(dims, nd);
+ it->nd_m1 = nd - 1;
+ it->factors[nd-1] = 1;
+ for (i=0; i < nd; i++) {
+ it->dims_m1[i] = dims[i] - 1;
+ k = i - diff;
+ if ((k < 0) ||
+ ao->dimensions[k] != dims[i]) {
+ it->contiguous = 0;
+ it->strides[i] = 0;
}
- PyArray_ITER_RESET(it);
+ else {
+ it->strides[i] = ao->strides[k];
+ }
+ it->backstrides[i] = it->strides[i] * \
+ it->dims_m1[i];
+ if (i > 0)
+ it->factors[nd-i-1] = it->factors[nd-i] * \
+ dims[nd-i];
+ }
+ PyArray_ITER_RESET(it);
- return (PyObject *)it;
+ return (PyObject *)it;
err:
- PyErr_SetString(PyExc_ValueError, "array is not broadcastable to "\
- "correct shape");
- return NULL;
+ PyErr_SetString(PyExc_ValueError, "array is not broadcastable to "\
+ "correct shape");
+ return NULL;
}
@@ -8931,49 +8930,49 @@ PyArray_BroadcastToShape(PyObject *obj, intp *dims, int nd)
/*OBJECT_API
- Get Iterator that iterates over all but one axis (don't use this with
- PyArray_ITER_GOTO1D). The axis will be over-written if negative
- with the axis having the smallest stride.
+ Get Iterator that iterates over all but one axis (don't use this with
+ PyArray_ITER_GOTO1D). The axis will be over-written if negative
+ with the axis having the smallest stride.
*/
static PyObject *
PyArray_IterAllButAxis(PyObject *obj, int *inaxis)
{
- PyArrayIterObject *it;
- int axis;
- it = (PyArrayIterObject *)PyArray_IterNew(obj);
- if (it == NULL) return NULL;
-
- if (PyArray_NDIM(obj)==0)
- return (PyObject *)it;
- if (*inaxis < 0) {
- int i, minaxis=0;
- intp minstride=0;
- i = 0;
- while (minstride==0 && i<PyArray_NDIM(obj)) {
- minstride = PyArray_STRIDE(obj,i);
- i++;
- }
- for (i=1; i<PyArray_NDIM(obj); i++) {
- if (PyArray_STRIDE(obj,i) > 0 &&
- PyArray_STRIDE(obj, i) < minstride) {
- minaxis = i;
- minstride = PyArray_STRIDE(obj,i);
- }
- }
- *inaxis = minaxis;
- }
- axis = *inaxis;
- /* adjust so that will not iterate over axis */
- it->contiguous = 0;
- if (it->size != 0) {
- it->size /= PyArray_DIM(obj,axis);
- }
- it->dims_m1[axis] = 0;
- it->backstrides[axis] = 0;
+ PyArrayIterObject *it;
+ int axis;
+ it = (PyArrayIterObject *)PyArray_IterNew(obj);
+ if (it == NULL) return NULL;
- /* (won't fix factors so don't use
- PyArray_ITER_GOTO1D with this iterator) */
+ if (PyArray_NDIM(obj)==0)
return (PyObject *)it;
+ if (*inaxis < 0) {
+ int i, minaxis=0;
+ intp minstride=0;
+ i = 0;
+ while (minstride==0 && i<PyArray_NDIM(obj)) {
+ minstride = PyArray_STRIDE(obj,i);
+ i++;
+ }
+ for (i=1; i<PyArray_NDIM(obj); i++) {
+ if (PyArray_STRIDE(obj,i) > 0 &&
+ PyArray_STRIDE(obj, i) < minstride) {
+ minaxis = i;
+ minstride = PyArray_STRIDE(obj,i);
+ }
+ }
+ *inaxis = minaxis;
+ }
+ axis = *inaxis;
+ /* adjust so that will not iterate over axis */
+ it->contiguous = 0;
+ if (it->size != 0) {
+ it->size /= PyArray_DIM(obj,axis);
+ }
+ it->dims_m1[axis] = 0;
+ it->backstrides[axis] = 0;
+
+ /* (won't fix factors so don't use
+ PyArray_ITER_GOTO1D with this iterator) */
+ return (PyObject *)it;
}
@@ -8981,50 +8980,50 @@ PyArray_IterAllButAxis(PyObject *obj, int *inaxis)
adjusted */
/*OBJECT_API
- Adjusts previously broadcasted iterators so that the axis with
+ Adjusts previously broadcasted iterators so that the axis with
the smallest sum of iterator strides is not iterated over.
Returns dimension which is smallest in the range [0,multi->nd).
A -1 is returned if multi->nd == 0.
- */
+*/
static int
PyArray_RemoveSmallest(PyArrayMultiIterObject *multi)
{
- PyArrayIterObject *it;
- int i, j;
- int axis;
- intp smallest;
- intp sumstrides[NPY_MAXDIMS];
+ PyArrayIterObject *it;
+ int i, j;
+ int axis;
+ intp smallest;
+ intp sumstrides[NPY_MAXDIMS];
- if (multi->nd == 0) return -1;
+ if (multi->nd == 0) return -1;
- for (i=0; i<multi->nd; i++) {
- sumstrides[i] = 0;
- for (j=0; j<multi->numiter; j++) {
- sumstrides[i] += multi->iters[j]->strides[i];
- }
+ for (i=0; i<multi->nd; i++) {
+ sumstrides[i] = 0;
+ for (j=0; j<multi->numiter; j++) {
+ sumstrides[i] += multi->iters[j]->strides[i];
}
- axis=0;
- smallest = sumstrides[0];
- /* Find longest dimension */
- for (i=1; i<multi->nd; i++) {
- if (sumstrides[i] < smallest) {
- axis = i;
- smallest = sumstrides[i];
- }
+ }
+ axis=0;
+ smallest = sumstrides[0];
+ /* Find longest dimension */
+ for (i=1; i<multi->nd; i++) {
+ if (sumstrides[i] < smallest) {
+ axis = i;
+ smallest = sumstrides[i];
}
+ }
- for (i=0; i<multi->numiter; i++) {
- it = multi->iters[i];
- it->contiguous = 0;
- if (it->size != 0)
- it->size /= (it->dims_m1[axis]+1);
- it->dims_m1[axis] = 0;
- it->backstrides[axis] = 0;
- }
+ for (i=0; i<multi->numiter; i++) {
+ it = multi->iters[i];
+ it->contiguous = 0;
+ if (it->size != 0)
+ it->size /= (it->dims_m1[axis]+1);
+ it->dims_m1[axis] = 0;
+ it->backstrides[axis] = 0;
+ }
- multi->size = multi->iters[0]->size;
- return axis;
+ multi->size = multi->iters[0]->size;
+ return axis;
}
/* Returns an array scalar holding the element desired */
@@ -9032,294 +9031,294 @@ PyArray_RemoveSmallest(PyArrayMultiIterObject *multi)
static PyObject *
arrayiter_next(PyArrayIterObject *it)
{
- PyObject *ret;
+ PyObject *ret;
- if (it->index < it->size) {
- ret = PyArray_ToScalar(it->dataptr, it->ao);
- PyArray_ITER_NEXT(it);
- return ret;
- }
- return NULL;
+ if (it->index < it->size) {
+ ret = PyArray_ToScalar(it->dataptr, it->ao);
+ PyArray_ITER_NEXT(it);
+ return ret;
+ }
+ return NULL;
}
static void
arrayiter_dealloc(PyArrayIterObject *it)
{
- Py_XDECREF(it->ao);
- _pya_free(it);
+ Py_XDECREF(it->ao);
+ _pya_free(it);
}
static Py_ssize_t
iter_length(PyArrayIterObject *self)
{
- return self->size;
+ return self->size;
}
static PyObject *
iter_subscript_Bool(PyArrayIterObject *self, PyArrayObject *ind)
{
- int index, strides, itemsize;
- intp count=0;
- char *dptr, *optr;
- PyObject *r;
- int swap;
- PyArray_CopySwapFunc *copyswap;
+ int index, strides, itemsize;
+ intp count=0;
+ char *dptr, *optr;
+ PyObject *r;
+ int swap;
+ PyArray_CopySwapFunc *copyswap;
- if (ind->nd != 1) {
- PyErr_SetString(PyExc_ValueError,
- "boolean index array should have 1 dimension");
- return NULL;
- }
- index = ind->dimensions[0];
- if (index > self->size) {
- PyErr_SetString(PyExc_ValueError,
- "too many boolean indices");
- return NULL;
- }
-
- strides = ind->strides[0];
- dptr = ind->data;
- /* Get size of return array */
- while(index--) {
- if (*((Bool *)dptr) != 0)
- count++;
- dptr += strides;
- }
- itemsize = self->ao->descr->elsize;
- Py_INCREF(self->ao->descr);
- r = PyArray_NewFromDescr(self->ao->ob_type,
- self->ao->descr, 1, &count,
- NULL, NULL,
- 0, (PyObject *)self->ao);
- if (r==NULL) return NULL;
-
- /* Set up loop */
- optr = PyArray_DATA(r);
- index = ind->dimensions[0];
- dptr = ind->data;
+ if (ind->nd != 1) {
+ PyErr_SetString(PyExc_ValueError,
+ "boolean index array should have 1 dimension");
+ return NULL;
+ }
+ index = ind->dimensions[0];
+ if (index > self->size) {
+ PyErr_SetString(PyExc_ValueError,
+ "too many boolean indices");
+ return NULL;
+ }
- copyswap = self->ao->descr->f->copyswap;
- /* Loop over Boolean array */
- swap = (PyArray_ISNOTSWAPPED(self->ao) != PyArray_ISNOTSWAPPED(r));
- while(index--) {
- if (*((Bool *)dptr) != 0) {
- copyswap(optr, self->dataptr, swap, self->ao);
- optr += itemsize;
- }
- dptr += strides;
- PyArray_ITER_NEXT(self);
- }
- PyArray_ITER_RESET(self);
- return r;
+ strides = ind->strides[0];
+ dptr = ind->data;
+ /* Get size of return array */
+ while(index--) {
+ if (*((Bool *)dptr) != 0)
+ count++;
+ dptr += strides;
+ }
+ itemsize = self->ao->descr->elsize;
+ Py_INCREF(self->ao->descr);
+ r = PyArray_NewFromDescr(self->ao->ob_type,
+ self->ao->descr, 1, &count,
+ NULL, NULL,
+ 0, (PyObject *)self->ao);
+ if (r==NULL) return NULL;
+
+ /* Set up loop */
+ optr = PyArray_DATA(r);
+ index = ind->dimensions[0];
+ dptr = ind->data;
+
+ copyswap = self->ao->descr->f->copyswap;
+ /* Loop over Boolean array */
+ swap = (PyArray_ISNOTSWAPPED(self->ao) != PyArray_ISNOTSWAPPED(r));
+ while(index--) {
+ if (*((Bool *)dptr) != 0) {
+ copyswap(optr, self->dataptr, swap, self->ao);
+ optr += itemsize;
+ }
+ dptr += strides;
+ PyArray_ITER_NEXT(self);
+ }
+ PyArray_ITER_RESET(self);
+ return r;
}
static PyObject *
iter_subscript_int(PyArrayIterObject *self, PyArrayObject *ind)
{
- intp num;
- PyObject *r;
- PyArrayIterObject *ind_it;
- int itemsize;
- int swap;
- char *optr;
- int index;
- PyArray_CopySwapFunc *copyswap;
-
- itemsize = self->ao->descr->elsize;
- if (ind->nd == 0) {
- num = *((intp *)ind->data);
- if (num < 0) num += self->size;
- if (num < 0 || num >= self->size) {
- PyErr_Format(PyExc_IndexError,
- "index %d out of bounds" \
- " 0<=index<%d", (int) num,
- (int) self->size);
- r = NULL;
- }
- else {
- PyArray_ITER_GOTO1D(self, num);
- r = PyArray_ToScalar(self->dataptr, self->ao);
- }
- PyArray_ITER_RESET(self);
- return r;
+ intp num;
+ PyObject *r;
+ PyArrayIterObject *ind_it;
+ int itemsize;
+ int swap;
+ char *optr;
+ int index;
+ PyArray_CopySwapFunc *copyswap;
+
+ itemsize = self->ao->descr->elsize;
+ if (ind->nd == 0) {
+ num = *((intp *)ind->data);
+ if (num < 0) num += self->size;
+ if (num < 0 || num >= self->size) {
+ PyErr_Format(PyExc_IndexError,
+ "index %d out of bounds" \
+ " 0<=index<%d", (int) num,
+ (int) self->size);
+ r = NULL;
}
-
- Py_INCREF(self->ao->descr);
- r = PyArray_NewFromDescr(self->ao->ob_type, self->ao->descr,
- ind->nd, ind->dimensions,
- NULL, NULL,
- 0, (PyObject *)self->ao);
- if (r==NULL) return NULL;
-
- optr = PyArray_DATA(r);
- ind_it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ind);
- if (ind_it == NULL) {Py_DECREF(r); return NULL;}
- index = ind_it->size;
- copyswap = PyArray_DESCR(r)->f->copyswap;
- swap = (PyArray_ISNOTSWAPPED(r) != PyArray_ISNOTSWAPPED(self->ao));
- while(index--) {
- num = *((intp *)(ind_it->dataptr));
- if (num < 0) num += self->size;
- if (num < 0 || num >= self->size) {
- PyErr_Format(PyExc_IndexError,
- "index %d out of bounds" \
- " 0<=index<%d", (int) num,
- (int) self->size);
- Py_DECREF(ind_it);
- Py_DECREF(r);
- PyArray_ITER_RESET(self);
- return NULL;
- }
- PyArray_ITER_GOTO1D(self, num);
- copyswap(optr, self->dataptr, swap, r);
- optr += itemsize;
- PyArray_ITER_NEXT(ind_it);
+ else {
+ PyArray_ITER_GOTO1D(self, num);
+ r = PyArray_ToScalar(self->dataptr, self->ao);
}
- Py_DECREF(ind_it);
PyArray_ITER_RESET(self);
return r;
+ }
+
+ Py_INCREF(self->ao->descr);
+ r = PyArray_NewFromDescr(self->ao->ob_type, self->ao->descr,
+ ind->nd, ind->dimensions,
+ NULL, NULL,
+ 0, (PyObject *)self->ao);
+ if (r==NULL) return NULL;
+
+ optr = PyArray_DATA(r);
+ ind_it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ind);
+ if (ind_it == NULL) {Py_DECREF(r); return NULL;}
+ index = ind_it->size;
+ copyswap = PyArray_DESCR(r)->f->copyswap;
+ swap = (PyArray_ISNOTSWAPPED(r) != PyArray_ISNOTSWAPPED(self->ao));
+ while(index--) {
+ num = *((intp *)(ind_it->dataptr));
+ if (num < 0) num += self->size;
+ if (num < 0 || num >= self->size) {
+ PyErr_Format(PyExc_IndexError,
+ "index %d out of bounds" \
+ " 0<=index<%d", (int) num,
+ (int) self->size);
+ Py_DECREF(ind_it);
+ Py_DECREF(r);
+ PyArray_ITER_RESET(self);
+ return NULL;
+ }
+ PyArray_ITER_GOTO1D(self, num);
+ copyswap(optr, self->dataptr, swap, r);
+ optr += itemsize;
+ PyArray_ITER_NEXT(ind_it);
+ }
+ Py_DECREF(ind_it);
+ PyArray_ITER_RESET(self);
+ return r;
}
static PyObject *
iter_subscript(PyArrayIterObject *self, PyObject *ind)
{
- PyArray_Descr *indtype=NULL;
- intp start, step_size;
- intp n_steps;
- PyObject *r;
- char *dptr;
- int size;
- PyObject *obj = NULL;
- int swap;
- PyArray_CopySwapFunc *copyswap;
-
- if (ind == Py_Ellipsis) {
- ind = PySlice_New(NULL, NULL, NULL);
- obj = iter_subscript(self, ind);
- Py_DECREF(ind);
- return obj;
- }
- if (PyTuple_Check(ind)) {
- int len;
- len = PyTuple_GET_SIZE(ind);
- if (len > 1) goto fail;
- if (len == 0) {
- Py_INCREF(self->ao);
- return (PyObject *)self->ao;
- }
- ind = PyTuple_GET_ITEM(ind, 0);
+ PyArray_Descr *indtype=NULL;
+ intp start, step_size;
+ intp n_steps;
+ PyObject *r;
+ char *dptr;
+ int size;
+ PyObject *obj = NULL;
+ int swap;
+ PyArray_CopySwapFunc *copyswap;
+
+ if (ind == Py_Ellipsis) {
+ ind = PySlice_New(NULL, NULL, NULL);
+ obj = iter_subscript(self, ind);
+ Py_DECREF(ind);
+ return obj;
+ }
+ if (PyTuple_Check(ind)) {
+ int len;
+ len = PyTuple_GET_SIZE(ind);
+ if (len > 1) goto fail;
+ if (len == 0) {
+ Py_INCREF(self->ao);
+ return (PyObject *)self->ao;
}
+ ind = PyTuple_GET_ITEM(ind, 0);
+ }
- /* Tuples >1d not accepted --- i.e. no newaxis */
- /* Could implement this with adjusted strides
- and dimensions in iterator */
+ /* Tuples >1d not accepted --- i.e. no newaxis */
+ /* Could implement this with adjusted strides
+ and dimensions in iterator */
- /* Check for Boolean -- this is first becasue
- Bool is a subclass of Int */
- PyArray_ITER_RESET(self);
+ /* Check for Boolean -- this is first becasue
+ Bool is a subclass of Int */
+ PyArray_ITER_RESET(self);
- if (PyBool_Check(ind)) {
- if (PyObject_IsTrue(ind)) {
- return PyArray_ToScalar(self->dataptr, self->ao);
- }
- else { /* empty array */
- intp ii = 0;
- Py_INCREF(self->ao->descr);
- r = PyArray_NewFromDescr(self->ao->ob_type,
- self->ao->descr,
- 1, &ii,
- NULL, NULL, 0,
- (PyObject *)self->ao);
- return r;
- }
+ if (PyBool_Check(ind)) {
+ if (PyObject_IsTrue(ind)) {
+ return PyArray_ToScalar(self->dataptr, self->ao);
}
+ else { /* empty array */
+ intp ii = 0;
+ Py_INCREF(self->ao->descr);
+ r = PyArray_NewFromDescr(self->ao->ob_type,
+ self->ao->descr,
+ 1, &ii,
+ NULL, NULL, 0,
+ (PyObject *)self->ao);
+ return r;
+ }
+ }
- /* Check for Integer or Slice */
-
- if (PyLong_Check(ind) || PyInt_Check(ind) || PySlice_Check(ind)) {
- start = parse_subindex(ind, &step_size, &n_steps,
- self->size);
- if (start == -1)
- goto fail;
- if (n_steps == RubberIndex || n_steps == PseudoIndex) {
- PyErr_SetString(PyExc_IndexError,
- "cannot use Ellipsis or newaxes here");
- goto fail;
- }
- PyArray_ITER_GOTO1D(self, start)
- if (n_steps == SingleIndex) { /* Integer */
- r = PyArray_ToScalar(self->dataptr, self->ao);
- PyArray_ITER_RESET(self);
- return r;
- }
- size = self->ao->descr->elsize;
- Py_INCREF(self->ao->descr);
- r = PyArray_NewFromDescr(self->ao->ob_type,
- self->ao->descr,
- 1, &n_steps,
- NULL, NULL,
- 0, (PyObject *)self->ao);
- if (r==NULL) goto fail;
- dptr = PyArray_DATA(r);
- swap = !PyArray_ISNOTSWAPPED(self->ao);
- copyswap = PyArray_DESCR(r)->f->copyswap;
- while(n_steps--) {
- copyswap(dptr, self->dataptr, swap, r);
- start += step_size;
- PyArray_ITER_GOTO1D(self, start)
- dptr += size;
- }
+ /* Check for Integer or Slice */
+
+ if (PyLong_Check(ind) || PyInt_Check(ind) || PySlice_Check(ind)) {
+ start = parse_subindex(ind, &step_size, &n_steps,
+ self->size);
+ if (start == -1)
+ goto fail;
+ if (n_steps == RubberIndex || n_steps == PseudoIndex) {
+ PyErr_SetString(PyExc_IndexError,
+ "cannot use Ellipsis or newaxes here");
+ goto fail;
+ }
+ PyArray_ITER_GOTO1D(self, start)
+ if (n_steps == SingleIndex) { /* Integer */
+ r = PyArray_ToScalar(self->dataptr, self->ao);
PyArray_ITER_RESET(self);
return r;
+ }
+ size = self->ao->descr->elsize;
+ Py_INCREF(self->ao->descr);
+ r = PyArray_NewFromDescr(self->ao->ob_type,
+ self->ao->descr,
+ 1, &n_steps,
+ NULL, NULL,
+ 0, (PyObject *)self->ao);
+ if (r==NULL) goto fail;
+ dptr = PyArray_DATA(r);
+ swap = !PyArray_ISNOTSWAPPED(self->ao);
+ copyswap = PyArray_DESCR(r)->f->copyswap;
+ while(n_steps--) {
+ copyswap(dptr, self->dataptr, swap, r);
+ start += step_size;
+ PyArray_ITER_GOTO1D(self, start)
+ dptr += size;
}
+ PyArray_ITER_RESET(self);
+ return r;
+ }
- /* convert to INTP array if Integer array scalar or List */
+ /* convert to INTP array if Integer array scalar or List */
- indtype = PyArray_DescrFromType(PyArray_INTP);
- if (PyArray_IsScalar(ind, Integer) || PyList_Check(ind)) {
- Py_INCREF(indtype);
- obj = PyArray_FromAny(ind, indtype, 0, 0, FORCECAST, NULL);
- if (obj == NULL) goto fail;
+ indtype = PyArray_DescrFromType(PyArray_INTP);
+ if (PyArray_IsScalar(ind, Integer) || PyList_Check(ind)) {
+ Py_INCREF(indtype);
+ obj = PyArray_FromAny(ind, indtype, 0, 0, FORCECAST, NULL);
+ if (obj == NULL) goto fail;
+ }
+ else {
+ Py_INCREF(ind);
+ obj = ind;
+ }
+
+ if (PyArray_Check(obj)) {
+ /* Check for Boolean object */
+ if (PyArray_TYPE(obj)==PyArray_BOOL) {
+ r = iter_subscript_Bool(self, (PyArrayObject *)obj);
+ Py_DECREF(indtype);
+ }
+ /* Check for integer array */
+ else if (PyArray_ISINTEGER(obj)) {
+ PyObject *new;
+ new = PyArray_FromAny(obj, indtype, 0, 0,
+ FORCECAST | ALIGNED, NULL);
+ if (new==NULL) goto fail;
+ Py_DECREF(obj);
+ obj = new;
+ r = iter_subscript_int(self, (PyArrayObject *)obj);
}
else {
- Py_INCREF(ind);
- obj = ind;
- }
-
- if (PyArray_Check(obj)) {
- /* Check for Boolean object */
- if (PyArray_TYPE(obj)==PyArray_BOOL) {
- r = iter_subscript_Bool(self, (PyArrayObject *)obj);
- Py_DECREF(indtype);
- }
- /* Check for integer array */
- else if (PyArray_ISINTEGER(obj)) {
- PyObject *new;
- new = PyArray_FromAny(obj, indtype, 0, 0,
- FORCECAST | ALIGNED, NULL);
- if (new==NULL) goto fail;
- Py_DECREF(obj);
- obj = new;
- r = iter_subscript_int(self, (PyArrayObject *)obj);
- }
- else {
- goto fail;
- }
- Py_DECREF(obj);
- return r;
+ goto fail;
}
- else Py_DECREF(indtype);
+ Py_DECREF(obj);
+ return r;
+ }
+ else Py_DECREF(indtype);
fail:
- if (!PyErr_Occurred())
- PyErr_SetString(PyExc_IndexError, "unsupported iterator index");
- Py_XDECREF(indtype);
- Py_XDECREF(obj);
- return NULL;
+ if (!PyErr_Occurred())
+ PyErr_SetString(PyExc_IndexError, "unsupported iterator index");
+ Py_XDECREF(indtype);
+ Py_XDECREF(obj);
+ return NULL;
}
@@ -9328,241 +9327,241 @@ static int
iter_ass_sub_Bool(PyArrayIterObject *self, PyArrayObject *ind,
PyArrayIterObject *val, int swap)
{
- int index, strides;
- char *dptr;
- PyArray_CopySwapFunc *copyswap;
+ int index, strides;
+ char *dptr;
+ PyArray_CopySwapFunc *copyswap;
- if (ind->nd != 1) {
- PyErr_SetString(PyExc_ValueError,
- "boolean index array should have 1 dimension");
- return -1;
- }
- index = ind->dimensions[0];
- strides = ind->strides[0];
- dptr = ind->data;
- PyArray_ITER_RESET(self);
- /* Loop over Boolean array */
- copyswap = self->ao->descr->f->copyswap;
- while(index--) {
- if (*((Bool *)dptr) != 0) {
- copyswap(self->dataptr, val->dataptr, swap, self->ao);
- PyArray_ITER_NEXT(val);
- if (val->index==val->size)
- PyArray_ITER_RESET(val);
- }
- dptr += strides;
- PyArray_ITER_NEXT(self);
- }
- PyArray_ITER_RESET(self);
- return 0;
+ if (ind->nd != 1) {
+ PyErr_SetString(PyExc_ValueError,
+ "boolean index array should have 1 dimension");
+ return -1;
+ }
+ index = ind->dimensions[0];
+ strides = ind->strides[0];
+ dptr = ind->data;
+ PyArray_ITER_RESET(self);
+ /* Loop over Boolean array */
+ copyswap = self->ao->descr->f->copyswap;
+ while(index--) {
+ if (*((Bool *)dptr) != 0) {
+ copyswap(self->dataptr, val->dataptr, swap, self->ao);
+ PyArray_ITER_NEXT(val);
+ if (val->index==val->size)
+ PyArray_ITER_RESET(val);
+ }
+ dptr += strides;
+ PyArray_ITER_NEXT(self);
+ }
+ PyArray_ITER_RESET(self);
+ return 0;
}
static int
iter_ass_sub_int(PyArrayIterObject *self, PyArrayObject *ind,
- PyArrayIterObject *val, int swap)
-{
- PyArray_Descr *typecode;
- intp num;
- PyArrayIterObject *ind_it;
- int index;
- PyArray_CopySwapFunc *copyswap;
-
- typecode = self->ao->descr;
- copyswap = self->ao->descr->f->copyswap;
- if (ind->nd == 0) {
- num = *((intp *)ind->data);
- PyArray_ITER_GOTO1D(self, num);
- copyswap(self->dataptr, val->dataptr, swap, self->ao);
- return 0;
- }
- ind_it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ind);
- if (ind_it == NULL) return -1;
- index = ind_it->size;
- while(index--) {
- num = *((intp *)(ind_it->dataptr));
- if (num < 0) num += self->size;
- if ((num < 0) || (num >= self->size)) {
- PyErr_Format(PyExc_IndexError,
- "index %d out of bounds" \
- " 0<=index<%d", (int) num,
- (int) self->size);
- Py_DECREF(ind_it);
- return -1;
- }
- PyArray_ITER_GOTO1D(self, num);
- copyswap(self->dataptr, val->dataptr, swap, self->ao);
- PyArray_ITER_NEXT(ind_it);
- PyArray_ITER_NEXT(val);
- if (val->index == val->size)
- PyArray_ITER_RESET(val);
- }
- Py_DECREF(ind_it);
+ PyArrayIterObject *val, int swap)
+{
+ PyArray_Descr *typecode;
+ intp num;
+ PyArrayIterObject *ind_it;
+ int index;
+ PyArray_CopySwapFunc *copyswap;
+
+ typecode = self->ao->descr;
+ copyswap = self->ao->descr->f->copyswap;
+ if (ind->nd == 0) {
+ num = *((intp *)ind->data);
+ PyArray_ITER_GOTO1D(self, num);
+ copyswap(self->dataptr, val->dataptr, swap, self->ao);
return 0;
+ }
+ ind_it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ind);
+ if (ind_it == NULL) return -1;
+ index = ind_it->size;
+ while(index--) {
+ num = *((intp *)(ind_it->dataptr));
+ if (num < 0) num += self->size;
+ if ((num < 0) || (num >= self->size)) {
+ PyErr_Format(PyExc_IndexError,
+ "index %d out of bounds" \
+ " 0<=index<%d", (int) num,
+ (int) self->size);
+ Py_DECREF(ind_it);
+ return -1;
+ }
+ PyArray_ITER_GOTO1D(self, num);
+ copyswap(self->dataptr, val->dataptr, swap, self->ao);
+ PyArray_ITER_NEXT(ind_it);
+ PyArray_ITER_NEXT(val);
+ if (val->index == val->size)
+ PyArray_ITER_RESET(val);
+ }
+ Py_DECREF(ind_it);
+ return 0;
}
static int
iter_ass_subscript(PyArrayIterObject *self, PyObject *ind, PyObject *val)
{
- PyObject *arrval=NULL;
- PyArrayIterObject *val_it=NULL;
- PyArray_Descr *type;
- PyArray_Descr *indtype=NULL;
- int swap, retval=-1;
- intp start, step_size;
- intp n_steps;
- PyObject *obj=NULL;
- PyArray_CopySwapFunc *copyswap;
-
-
- if (ind == Py_Ellipsis) {
- ind = PySlice_New(NULL, NULL, NULL);
- retval = iter_ass_subscript(self, ind, val);
- Py_DECREF(ind);
- return retval;
- }
+ PyObject *arrval=NULL;
+ PyArrayIterObject *val_it=NULL;
+ PyArray_Descr *type;
+ PyArray_Descr *indtype=NULL;
+ int swap, retval=-1;
+ intp start, step_size;
+ intp n_steps;
+ PyObject *obj=NULL;
+ PyArray_CopySwapFunc *copyswap;
+
+
+ if (ind == Py_Ellipsis) {
+ ind = PySlice_New(NULL, NULL, NULL);
+ retval = iter_ass_subscript(self, ind, val);
+ Py_DECREF(ind);
+ return retval;
+ }
- if (PyTuple_Check(ind)) {
- int len;
- len = PyTuple_GET_SIZE(ind);
- if (len > 1) goto finish;
- ind = PyTuple_GET_ITEM(ind, 0);
- }
+ if (PyTuple_Check(ind)) {
+ int len;
+ len = PyTuple_GET_SIZE(ind);
+ if (len > 1) goto finish;
+ ind = PyTuple_GET_ITEM(ind, 0);
+ }
- type = self->ao->descr;
+ type = self->ao->descr;
- /* Check for Boolean -- this is first becasue
- Bool is a subclass of Int */
+ /* Check for Boolean -- this is first becasue
+ Bool is a subclass of Int */
- if (PyBool_Check(ind)) {
- retval = 0;
- if (PyObject_IsTrue(ind)) {
- retval = type->f->setitem(val, self->dataptr, self->ao);
- }
- goto finish;
+ if (PyBool_Check(ind)) {
+ retval = 0;
+ if (PyObject_IsTrue(ind)) {
+ retval = type->f->setitem(val, self->dataptr, self->ao);
}
+ goto finish;
+ }
- if (PySequence_Check(ind) || PySlice_Check(ind)) goto skip;
- start = PyArray_PyIntAsIntp(ind);
- if (start==-1 && PyErr_Occurred()) PyErr_Clear();
- else {
- if (start < -self->size || start >= self->size) {
- PyErr_Format(PyExc_ValueError,
- "index (%" NPY_INTP_FMT \
- ") out of range", start);
- goto finish;
- }
- retval = 0;
- PyArray_ITER_GOTO1D(self, start);
- retval = type->f->setitem(val, self->dataptr, self->ao);
- PyArray_ITER_RESET(self);
- if (retval < 0) {
- PyErr_SetString(PyExc_ValueError,
- "Error setting single item of array.");
- }
- goto finish;
+ if (PySequence_Check(ind) || PySlice_Check(ind)) goto skip;
+ start = PyArray_PyIntAsIntp(ind);
+ if (start==-1 && PyErr_Occurred()) PyErr_Clear();
+ else {
+ if (start < -self->size || start >= self->size) {
+ PyErr_Format(PyExc_ValueError,
+ "index (%" NPY_INTP_FMT \
+ ") out of range", start);
+ goto finish;
}
+ retval = 0;
+ PyArray_ITER_GOTO1D(self, start);
+ retval = type->f->setitem(val, self->dataptr, self->ao);
+ PyArray_ITER_RESET(self);
+ if (retval < 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "Error setting single item of array.");
+ }
+ goto finish;
+ }
skip:
- Py_INCREF(type);
- arrval = PyArray_FromAny(val, type, 0, 0, 0, NULL);
- if (arrval==NULL) return -1;
- val_it = (PyArrayIterObject *)PyArray_IterNew(arrval);
- if (val_it==NULL) goto finish;
- if (val_it->size == 0) {retval = 0; goto finish;}
-
- copyswap = PyArray_DESCR(arrval)->f->copyswap;
- swap = (PyArray_ISNOTSWAPPED(self->ao)!=PyArray_ISNOTSWAPPED(arrval));
-
- /* Check Slice */
-
- if (PySlice_Check(ind)) {
- start = parse_subindex(ind, &step_size, &n_steps,
- self->size);
- if (start == -1) goto finish;
- if (n_steps == RubberIndex || n_steps == PseudoIndex) {
- PyErr_SetString(PyExc_IndexError,
- "cannot use Ellipsis or newaxes here");
- goto finish;
- }
- PyArray_ITER_GOTO1D(self, start);
- if (n_steps == SingleIndex) { /* Integer */
- copyswap(self->dataptr, PyArray_DATA(arrval),
- swap, arrval);
- PyArray_ITER_RESET(self);
- retval=0;
- goto finish;
- }
- while(n_steps--) {
- copyswap(self->dataptr, val_it->dataptr,
- swap, arrval);
- start += step_size;
- PyArray_ITER_GOTO1D(self, start)
- PyArray_ITER_NEXT(val_it);
- if (val_it->index == val_it->size)
- PyArray_ITER_RESET(val_it);
- }
- PyArray_ITER_RESET(self);
- retval = 0;
- goto finish;
+ Py_INCREF(type);
+ arrval = PyArray_FromAny(val, type, 0, 0, 0, NULL);
+ if (arrval==NULL) return -1;
+ val_it = (PyArrayIterObject *)PyArray_IterNew(arrval);
+ if (val_it==NULL) goto finish;
+ if (val_it->size == 0) {retval = 0; goto finish;}
+
+ copyswap = PyArray_DESCR(arrval)->f->copyswap;
+ swap = (PyArray_ISNOTSWAPPED(self->ao)!=PyArray_ISNOTSWAPPED(arrval));
+
+ /* Check Slice */
+
+ if (PySlice_Check(ind)) {
+ start = parse_subindex(ind, &step_size, &n_steps,
+ self->size);
+ if (start == -1) goto finish;
+ if (n_steps == RubberIndex || n_steps == PseudoIndex) {
+ PyErr_SetString(PyExc_IndexError,
+ "cannot use Ellipsis or newaxes here");
+ goto finish;
}
-
- /* convert to INTP array if Integer array scalar or List */
-
- indtype = PyArray_DescrFromType(PyArray_INTP);
- if (PyList_Check(ind)) {
- Py_INCREF(indtype);
- obj = PyArray_FromAny(ind, indtype, 0, 0, FORCECAST, NULL);
+ PyArray_ITER_GOTO1D(self, start);
+ if (n_steps == SingleIndex) { /* Integer */
+ copyswap(self->dataptr, PyArray_DATA(arrval),
+ swap, arrval);
+ PyArray_ITER_RESET(self);
+ retval=0;
+ goto finish;
}
- else {
- Py_INCREF(ind);
- obj = ind;
+ while(n_steps--) {
+ copyswap(self->dataptr, val_it->dataptr,
+ swap, arrval);
+ start += step_size;
+ PyArray_ITER_GOTO1D(self, start)
+ PyArray_ITER_NEXT(val_it);
+ if (val_it->index == val_it->size)
+ PyArray_ITER_RESET(val_it);
}
+ PyArray_ITER_RESET(self);
+ retval = 0;
+ goto finish;
+ }
- if (obj != NULL && PyArray_Check(obj)) {
- /* Check for Boolean object */
- if (PyArray_TYPE(obj)==PyArray_BOOL) {
- if (iter_ass_sub_Bool(self, (PyArrayObject *)obj,
- val_it, swap) < 0)
- goto finish;
- retval=0;
- }
- /* Check for integer array */
- else if (PyArray_ISINTEGER(obj)) {
- PyObject *new;
- Py_INCREF(indtype);
- new = PyArray_CheckFromAny(obj, indtype, 0, 0,
- FORCECAST | BEHAVED_NS, NULL);
- Py_DECREF(obj);
- obj = new;
- if (new==NULL) goto finish;
- if (iter_ass_sub_int(self, (PyArrayObject *)obj,
- val_it, swap) < 0)
- goto finish;
- retval=0;
- }
+ /* convert to INTP array if Integer array scalar or List */
+
+ indtype = PyArray_DescrFromType(PyArray_INTP);
+ if (PyList_Check(ind)) {
+ Py_INCREF(indtype);
+ obj = PyArray_FromAny(ind, indtype, 0, 0, FORCECAST, NULL);
+ }
+ else {
+ Py_INCREF(ind);
+ obj = ind;
+ }
+
+ if (obj != NULL && PyArray_Check(obj)) {
+ /* Check for Boolean object */
+ if (PyArray_TYPE(obj)==PyArray_BOOL) {
+ if (iter_ass_sub_Bool(self, (PyArrayObject *)obj,
+ val_it, swap) < 0)
+ goto finish;
+ retval=0;
+ }
+ /* Check for integer array */
+ else if (PyArray_ISINTEGER(obj)) {
+ PyObject *new;
+ Py_INCREF(indtype);
+ new = PyArray_CheckFromAny(obj, indtype, 0, 0,
+ FORCECAST | BEHAVED_NS, NULL);
+ Py_DECREF(obj);
+ obj = new;
+ if (new==NULL) goto finish;
+ if (iter_ass_sub_int(self, (PyArrayObject *)obj,
+ val_it, swap) < 0)
+ goto finish;
+ retval=0;
}
+ }
finish:
- if (!PyErr_Occurred() && retval < 0)
- PyErr_SetString(PyExc_IndexError,
- "unsupported iterator index");
- Py_XDECREF(indtype);
- Py_XDECREF(obj);
- Py_XDECREF(val_it);
- Py_XDECREF(arrval);
- return retval;
+ if (!PyErr_Occurred() && retval < 0)
+ PyErr_SetString(PyExc_IndexError,
+ "unsupported iterator index");
+ Py_XDECREF(indtype);
+ Py_XDECREF(obj);
+ Py_XDECREF(val_it);
+ Py_XDECREF(arrval);
+ return retval;
}
static PyMappingMethods iter_as_mapping = {
#if PY_VERSION_HEX >= 0x02050000
- (lenfunc)iter_length, /*mp_length*/
+ (lenfunc)iter_length, /*mp_length*/
#else
- (inquiry)iter_length, /*mp_length*/
+ (inquiry)iter_length, /*mp_length*/
#endif
- (binaryfunc)iter_subscript, /*mp_subscript*/
- (objobjargproc)iter_ass_subscript, /*mp_ass_subscript*/
+ (binaryfunc)iter_subscript, /*mp_subscript*/
+ (objobjargproc)iter_ass_subscript, /*mp_ass_subscript*/
};
@@ -9571,143 +9570,143 @@ static PyObject *
iter_array(PyArrayIterObject *it, PyObject *op)
{
- PyObject *r;
- intp size;
-
- /* Any argument ignored */
-
- /* Two options:
- 1) underlying array is contiguous
- -- return 1-d wrapper around it
- 2) underlying array is not contiguous
- -- make new 1-d contiguous array with updateifcopy flag set
- to copy back to the old array
- */
-
- size = PyArray_SIZE(it->ao);
- Py_INCREF(it->ao->descr);
- if (PyArray_ISCONTIGUOUS(it->ao)) {
- r = PyArray_NewFromDescr(&PyArray_Type,
- it->ao->descr,
- 1, &size,
- NULL, it->ao->data,
- it->ao->flags,
- (PyObject *)it->ao);
- if (r==NULL) return NULL;
- }
- else {
- r = PyArray_NewFromDescr(&PyArray_Type,
- it->ao->descr,
- 1, &size,
- NULL, NULL,
- 0, (PyObject *)it->ao);
- if (r==NULL) return NULL;
- if (_flat_copyinto(r, (PyObject *)it->ao,
- PyArray_CORDER) < 0) {
- Py_DECREF(r);
- return NULL;
- }
- PyArray_FLAGS(r) |= UPDATEIFCOPY;
- it->ao->flags &= ~WRITEABLE;
+ PyObject *r;
+ intp size;
+
+ /* Any argument ignored */
+
+ /* Two options:
+ 1) underlying array is contiguous
+ -- return 1-d wrapper around it
+ 2) underlying array is not contiguous
+ -- make new 1-d contiguous array with updateifcopy flag set
+ to copy back to the old array
+ */
+
+ size = PyArray_SIZE(it->ao);
+ Py_INCREF(it->ao->descr);
+ if (PyArray_ISCONTIGUOUS(it->ao)) {
+ r = PyArray_NewFromDescr(&PyArray_Type,
+ it->ao->descr,
+ 1, &size,
+ NULL, it->ao->data,
+ it->ao->flags,
+ (PyObject *)it->ao);
+ if (r==NULL) return NULL;
+ }
+ else {
+ r = PyArray_NewFromDescr(&PyArray_Type,
+ it->ao->descr,
+ 1, &size,
+ NULL, NULL,
+ 0, (PyObject *)it->ao);
+ if (r==NULL) return NULL;
+ if (_flat_copyinto(r, (PyObject *)it->ao,
+ PyArray_CORDER) < 0) {
+ Py_DECREF(r);
+ return NULL;
}
- Py_INCREF(it->ao);
- PyArray_BASE(r) = (PyObject *)it->ao;
- return r;
+ PyArray_FLAGS(r) |= UPDATEIFCOPY;
+ it->ao->flags &= ~WRITEABLE;
+ }
+ Py_INCREF(it->ao);
+ PyArray_BASE(r) = (PyObject *)it->ao;
+ return r;
}
static PyObject *
iter_copy(PyArrayIterObject *it, PyObject *args)
{
- if (!PyArg_ParseTuple(args, "")) return NULL;
- return PyArray_Flatten(it->ao, 0);
+ if (!PyArg_ParseTuple(args, "")) return NULL;
+ return PyArray_Flatten(it->ao, 0);
}
static PyMethodDef iter_methods[] = {
- /* to get array */
- {"__array__", (PyCFunction)iter_array, 1, NULL},
- {"copy", (PyCFunction)iter_copy, 1, NULL},
- {NULL, NULL} /* sentinel */
+ /* to get array */
+ {"__array__", (PyCFunction)iter_array, 1, NULL},
+ {"copy", (PyCFunction)iter_copy, 1, NULL},
+ {NULL, NULL} /* sentinel */
};
static PyObject *
iter_richcompare(PyArrayIterObject *self, PyObject *other, int cmp_op)
{
- PyArrayObject *new;
- PyObject *ret;
- new = (PyArrayObject *)iter_array(self, NULL);
- if (new == NULL) return NULL;
- ret = array_richcompare(new, other, cmp_op);
- Py_DECREF(new);
- return ret;
+ PyArrayObject *new;
+ PyObject *ret;
+ new = (PyArrayObject *)iter_array(self, NULL);
+ if (new == NULL) return NULL;
+ ret = array_richcompare(new, other, cmp_op);
+ Py_DECREF(new);
+ return ret;
}
static PyMemberDef iter_members[] = {
- {"base", T_OBJECT, offsetof(PyArrayIterObject, ao), RO, NULL},
- {"index", T_INT, offsetof(PyArrayIterObject, index), RO, NULL},
- {NULL},
+ {"base", T_OBJECT, offsetof(PyArrayIterObject, ao), RO, NULL},
+ {"index", T_INT, offsetof(PyArrayIterObject, index), RO, NULL},
+ {NULL},
};
static PyObject *
iter_coords_get(PyArrayIterObject *self)
{
- int nd;
- nd = self->ao->nd;
- if (self->contiguous) { /* coordinates not kept track of --- need to generate
- from index */
- intp val;
- int i;
- val = self->index;
- for (i=0;i<nd; i++) {
- self->coordinates[i] = val / self->factors[i];
- val = val % self->factors[i];
- }
+ int nd;
+ nd = self->ao->nd;
+ if (self->contiguous) { /* coordinates not kept track of --- need to generate
+ from index */
+ intp val;
+ int i;
+ val = self->index;
+ for (i=0;i<nd; i++) {
+ self->coordinates[i] = val / self->factors[i];
+ val = val % self->factors[i];
}
- return PyArray_IntTupleFromIntp(nd, self->coordinates);
+ }
+ return PyArray_IntTupleFromIntp(nd, self->coordinates);
}
static PyGetSetDef iter_getsets[] = {
- {"coords",
- (getter)iter_coords_get,
- NULL,
- NULL},
- {NULL, NULL, NULL, NULL},
+ {"coords",
+ (getter)iter_coords_get,
+ NULL,
+ NULL},
+ {NULL, NULL, NULL, NULL},
};
static PyTypeObject PyArrayIter_Type = {
- PyObject_HEAD_INIT(NULL)
- 0, /* ob_size */
- "numpy.flatiter", /* tp_name */
- sizeof(PyArrayIterObject), /* tp_basicsize */
- 0, /* tp_itemsize */
- /* methods */
- (destructor)arrayiter_dealloc, /* tp_dealloc */
- 0, /* tp_print */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_compare */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- &iter_as_mapping, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
- 0, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- (richcmpfunc)iter_richcompare, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- (iternextfunc)arrayiter_next, /* tp_iternext */
- iter_methods, /* tp_methods */
- iter_members, /* tp_members */
- iter_getsets, /* tp_getset */
+ PyObject_HEAD_INIT(NULL)
+ 0, /* ob_size */
+ "numpy.flatiter", /* tp_name */
+ sizeof(PyArrayIterObject), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ /* methods */
+ (destructor)arrayiter_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_compare */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ &iter_as_mapping, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ 0, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ (richcmpfunc)iter_richcompare, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ (iternextfunc)arrayiter_next, /* tp_iternext */
+ iter_methods, /* tp_methods */
+ iter_members, /* tp_members */
+ iter_getsets, /* tp_getset */
};
@@ -9730,147 +9729,147 @@ static int _nonzero_indices(PyObject *myBool, PyArrayIterObject **iters);
if possible -- otherwise, it is a Slice or Ellipsis object
and has to be interpreted on bind to a particular
array so leave it NULL for now.
- */
+*/
static int
_convert_obj(PyObject *obj, PyArrayIterObject **iter)
{
- PyArray_Descr *indtype;
- PyObject *arr;
+ PyArray_Descr *indtype;
+ PyObject *arr;
- if (PySlice_Check(obj) || (obj == Py_Ellipsis))
- return 0;
- else if (PyArray_Check(obj) && PyArray_ISBOOL(obj)) {
- return _nonzero_indices(obj, iter);
- }
- else {
- indtype = PyArray_DescrFromType(PyArray_INTP);
- arr = PyArray_FromAny(obj, indtype, 0, 0, FORCECAST, NULL);
- if (arr == NULL) return -1;
- *iter = (PyArrayIterObject *)PyArray_IterNew(arr);
- Py_DECREF(arr);
- if (*iter == NULL) return -1;
- }
- return 1;
+ if (PySlice_Check(obj) || (obj == Py_Ellipsis))
+ return 0;
+ else if (PyArray_Check(obj) && PyArray_ISBOOL(obj)) {
+ return _nonzero_indices(obj, iter);
+ }
+ else {
+ indtype = PyArray_DescrFromType(PyArray_INTP);
+ arr = PyArray_FromAny(obj, indtype, 0, 0, FORCECAST, NULL);
+ if (arr == NULL) return -1;
+ *iter = (PyArrayIterObject *)PyArray_IterNew(arr);
+ Py_DECREF(arr);
+ if (*iter == NULL) return -1;
+ }
+ return 1;
}
/* Adjust dimensionality and strides for index object iterators
--- i.e. broadcast
- */
+*/
/*OBJECT_API*/
static int
PyArray_Broadcast(PyArrayMultiIterObject *mit)
{
- int i, nd, k, j;
- intp tmp;
- PyArrayIterObject *it;
-
- /* Discover the broadcast number of dimensions */
- for (i=0, nd=0; i<mit->numiter; i++)
- nd = MAX(nd, mit->iters[i]->ao->nd);
- mit->nd = nd;
-
- /* Discover the broadcast shape in each dimension */
- for (i=0; i<nd; i++) {
- mit->dimensions[i] = 1;
- for (j=0; j<mit->numiter; j++) {
- it = mit->iters[j];
- /* This prepends 1 to shapes not already
- equal to nd */
- k = i + it->ao->nd - nd;
- if (k>=0) {
- tmp = it->ao->dimensions[k];
- if (tmp == 1) continue;
- if (mit->dimensions[i] == 1)
- mit->dimensions[i] = tmp;
- else if (mit->dimensions[i] != tmp) {
- PyErr_SetString(PyExc_ValueError,
- "shape mismatch: objects" \
- " cannot be broadcast" \
- " to a single shape");
- return -1;
- }
- }
+ int i, nd, k, j;
+ intp tmp;
+ PyArrayIterObject *it;
+
+ /* Discover the broadcast number of dimensions */
+ for (i=0, nd=0; i<mit->numiter; i++)
+ nd = MAX(nd, mit->iters[i]->ao->nd);
+ mit->nd = nd;
+
+ /* Discover the broadcast shape in each dimension */
+ for (i=0; i<nd; i++) {
+ mit->dimensions[i] = 1;
+ for (j=0; j<mit->numiter; j++) {
+ it = mit->iters[j];
+ /* This prepends 1 to shapes not already
+ equal to nd */
+ k = i + it->ao->nd - nd;
+ if (k>=0) {
+ tmp = it->ao->dimensions[k];
+ if (tmp == 1) continue;
+ if (mit->dimensions[i] == 1)
+ mit->dimensions[i] = tmp;
+ else if (mit->dimensions[i] != tmp) {
+ PyErr_SetString(PyExc_ValueError,
+ "shape mismatch: objects" \
+ " cannot be broadcast" \
+ " to a single shape");
+ return -1;
}
+ }
}
+ }
- /* Reset the iterator dimensions and strides of each iterator
- object -- using 0 valued strides for broadcasting */
-
- tmp = PyArray_MultiplyList(mit->dimensions, mit->nd);
- mit->size = tmp;
- for (i=0; i<mit->numiter; i++) {
- it = mit->iters[i];
- it->nd_m1 = mit->nd - 1;
- it->size = tmp;
- nd = it->ao->nd;
- it->factors[mit->nd-1] = 1;
- for (j=0; j < mit->nd; j++) {
- it->dims_m1[j] = mit->dimensions[j] - 1;
- k = j + nd - mit->nd;
- /* If this dimension was added or shape
- of underlying array was 1 */
- if ((k < 0) || \
- it->ao->dimensions[k] != mit->dimensions[j]) {
- it->contiguous = 0;
- it->strides[j] = 0;
- }
- else {
- it->strides[j] = it->ao->strides[k];
- }
- it->backstrides[j] = it->strides[j] * \
- it->dims_m1[j];
- if (j > 0)
- it->factors[mit->nd-j-1] = \
- it->factors[mit->nd-j] * \
- mit->dimensions[mit->nd-j];
- }
- PyArray_ITER_RESET(it);
+ /* Reset the iterator dimensions and strides of each iterator
+ object -- using 0 valued strides for broadcasting */
+
+ tmp = PyArray_MultiplyList(mit->dimensions, mit->nd);
+ mit->size = tmp;
+ for (i=0; i<mit->numiter; i++) {
+ it = mit->iters[i];
+ it->nd_m1 = mit->nd - 1;
+ it->size = tmp;
+ nd = it->ao->nd;
+ it->factors[mit->nd-1] = 1;
+ for (j=0; j < mit->nd; j++) {
+ it->dims_m1[j] = mit->dimensions[j] - 1;
+ k = j + nd - mit->nd;
+ /* If this dimension was added or shape
+ of underlying array was 1 */
+ if ((k < 0) || \
+ it->ao->dimensions[k] != mit->dimensions[j]) {
+ it->contiguous = 0;
+ it->strides[j] = 0;
+ }
+ else {
+ it->strides[j] = it->ao->strides[k];
+ }
+ it->backstrides[j] = it->strides[j] * \
+ it->dims_m1[j];
+ if (j > 0)
+ it->factors[mit->nd-j-1] = \
+ it->factors[mit->nd-j] * \
+ mit->dimensions[mit->nd-j];
}
- return 0;
+ PyArray_ITER_RESET(it);
+ }
+ return 0;
}
/* Reset the map iterator to the beginning */
static void
PyArray_MapIterReset(PyArrayMapIterObject *mit)
{
- int i,j; intp coord[MAX_DIMS];
- PyArrayIterObject *it;
- PyArray_CopySwapFunc *copyswap;
+ int i,j; intp coord[MAX_DIMS];
+ PyArrayIterObject *it;
+ PyArray_CopySwapFunc *copyswap;
- mit->index = 0;
+ mit->index = 0;
- copyswap = mit->iters[0]->ao->descr->f->copyswap;
+ copyswap = mit->iters[0]->ao->descr->f->copyswap;
- if (mit->subspace != NULL) {
- memcpy(coord, mit->bscoord, sizeof(intp)*mit->ait->ao->nd);
- PyArray_ITER_RESET(mit->subspace);
- for (i=0; i<mit->numiter; i++) {
- it = mit->iters[i];
- PyArray_ITER_RESET(it);
- j = mit->iteraxes[i];
- copyswap(coord+j,it->dataptr,
- !PyArray_ISNOTSWAPPED(it->ao),
- it->ao);
- }
- PyArray_ITER_GOTO(mit->ait, coord);
- mit->subspace->dataptr = mit->ait->dataptr;
- mit->dataptr = mit->subspace->dataptr;
- }
- else {
- for (i=0; i<mit->numiter; i++) {
- it = mit->iters[i];
- if (it->size != 0) {
- PyArray_ITER_RESET(it);
- copyswap(coord+i,it->dataptr,
- !PyArray_ISNOTSWAPPED(it->ao),
- it->ao);
- }
- else coord[i] = 0;
- }
- PyArray_ITER_GOTO(mit->ait, coord);
- mit->dataptr = mit->ait->dataptr;
+ if (mit->subspace != NULL) {
+ memcpy(coord, mit->bscoord, sizeof(intp)*mit->ait->ao->nd);
+ PyArray_ITER_RESET(mit->subspace);
+ for (i=0; i<mit->numiter; i++) {
+ it = mit->iters[i];
+ PyArray_ITER_RESET(it);
+ j = mit->iteraxes[i];
+ copyswap(coord+j,it->dataptr,
+ !PyArray_ISNOTSWAPPED(it->ao),
+ it->ao);
+ }
+ PyArray_ITER_GOTO(mit->ait, coord);
+ mit->subspace->dataptr = mit->ait->dataptr;
+ mit->dataptr = mit->subspace->dataptr;
+ }
+ else {
+ for (i=0; i<mit->numiter; i++) {
+ it = mit->iters[i];
+ if (it->size != 0) {
+ PyArray_ITER_RESET(it);
+ copyswap(coord+i,it->dataptr,
+ !PyArray_ISNOTSWAPPED(it->ao),
+ it->ao);
+ }
+ else coord[i] = 0;
}
- return;
+ PyArray_ITER_GOTO(mit->ait, coord);
+ mit->dataptr = mit->ait->dataptr;
+ }
+ return;
}
/* This function needs to update the state of the map iterator
@@ -9879,56 +9878,56 @@ PyArray_MapIterReset(PyArrayMapIterObject *mit)
static void
PyArray_MapIterNext(PyArrayMapIterObject *mit)
{
- int i, j;
- intp coord[MAX_DIMS];
- PyArrayIterObject *it;
- PyArray_CopySwapFunc *copyswap;
-
- mit->index += 1;
- if (mit->index >= mit->size) return;
- copyswap = mit->iters[0]->ao->descr->f->copyswap;
- /* Sub-space iteration */
- if (mit->subspace != NULL) {
- PyArray_ITER_NEXT(mit->subspace);
- if (mit->subspace->index >= mit->subspace->size) {
- /* reset coord to coordinates of
- beginning of the subspace */
- memcpy(coord, mit->bscoord,
- sizeof(intp)*mit->ait->ao->nd);
- PyArray_ITER_RESET(mit->subspace);
- for (i=0; i<mit->numiter; i++) {
- it = mit->iters[i];
- PyArray_ITER_NEXT(it);
- j = mit->iteraxes[i];
- copyswap(coord+j,it->dataptr,
- !PyArray_ISNOTSWAPPED(it->ao),
- it->ao);
- }
- PyArray_ITER_GOTO(mit->ait, coord);
- mit->subspace->dataptr = mit->ait->dataptr;
- }
- mit->dataptr = mit->subspace->dataptr;
- }
- else {
- for (i=0; i<mit->numiter; i++) {
- it = mit->iters[i];
- PyArray_ITER_NEXT(it);
- copyswap(coord+i,it->dataptr,
- !PyArray_ISNOTSWAPPED(it->ao),
- it->ao);
- }
- PyArray_ITER_GOTO(mit->ait, coord);
- mit->dataptr = mit->ait->dataptr;
+ int i, j;
+ intp coord[MAX_DIMS];
+ PyArrayIterObject *it;
+ PyArray_CopySwapFunc *copyswap;
+
+ mit->index += 1;
+ if (mit->index >= mit->size) return;
+ copyswap = mit->iters[0]->ao->descr->f->copyswap;
+ /* Sub-space iteration */
+ if (mit->subspace != NULL) {
+ PyArray_ITER_NEXT(mit->subspace);
+ if (mit->subspace->index >= mit->subspace->size) {
+ /* reset coord to coordinates of
+ beginning of the subspace */
+ memcpy(coord, mit->bscoord,
+ sizeof(intp)*mit->ait->ao->nd);
+ PyArray_ITER_RESET(mit->subspace);
+ for (i=0; i<mit->numiter; i++) {
+ it = mit->iters[i];
+ PyArray_ITER_NEXT(it);
+ j = mit->iteraxes[i];
+ copyswap(coord+j,it->dataptr,
+ !PyArray_ISNOTSWAPPED(it->ao),
+ it->ao);
+ }
+ PyArray_ITER_GOTO(mit->ait, coord);
+ mit->subspace->dataptr = mit->ait->dataptr;
}
- return;
+ mit->dataptr = mit->subspace->dataptr;
+ }
+ else {
+ for (i=0; i<mit->numiter; i++) {
+ it = mit->iters[i];
+ PyArray_ITER_NEXT(it);
+ copyswap(coord+i,it->dataptr,
+ !PyArray_ISNOTSWAPPED(it->ao),
+ it->ao);
+ }
+ PyArray_ITER_GOTO(mit->ait, coord);
+ mit->dataptr = mit->ait->dataptr;
+ }
+ return;
}
/* Bind a mapiteration to a particular array */
/* Determine if subspace iteration is necessary. If so,
- 1) Fill in mit->iteraxes
- 2) Create subspace iterator
- 3) Update nd, dimensions, and size.
+ 1) Fill in mit->iteraxes
+ 2) Create subspace iterator
+ 3) Update nd, dimensions, and size.
Subspace iteration is necessary if: arr->nd > mit->numiter
*/
@@ -9941,146 +9940,146 @@ PyArray_MapIterNext(PyArrayMapIterObject *mit)
static void
PyArray_MapIterBind(PyArrayMapIterObject *mit, PyArrayObject *arr)
{
- int subnd;
- PyObject *sub, *obj=NULL;
- int i, j, n, curraxis, ellipexp, noellip;
- PyArrayIterObject *it;
- intp dimsize;
- intp *indptr;
+ int subnd;
+ PyObject *sub, *obj=NULL;
+ int i, j, n, curraxis, ellipexp, noellip;
+ PyArrayIterObject *it;
+ intp dimsize;
+ intp *indptr;
- subnd = arr->nd - mit->numiter;
- if (subnd < 0) {
- PyErr_SetString(PyExc_ValueError,
- "too many indices for array");
- return;
- }
-
- mit->ait = (PyArrayIterObject *)PyArray_IterNew((PyObject *)arr);
- if (mit->ait == NULL) return;
+ subnd = arr->nd - mit->numiter;
+ if (subnd < 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "too many indices for array");
+ return;
+ }
- /* no subspace iteration needed. Finish up and Return */
- if (subnd == 0) {
- n = arr->nd;
- for (i=0; i<n; i++) {
- mit->iteraxes[i] = i;
- }
- goto finish;
- }
+ mit->ait = (PyArrayIterObject *)PyArray_IterNew((PyObject *)arr);
+ if (mit->ait == NULL) return;
- /* all indexing arrays have been converted to 0
- therefore we can extract the subspace with a simple
- getitem call which will use view semantics
- */
- /* But, be sure to do it with a true array.
- */
- if (PyArray_CheckExact(arr)) {
- sub = array_subscript_simple(arr, mit->indexobj);
- }
- else {
- Py_INCREF(arr);
- obj = PyArray_EnsureArray((PyObject *)arr);
- if (obj == NULL) goto fail;
- sub = array_subscript_simple((PyArrayObject *)obj, mit->indexobj);
- Py_DECREF(obj);
+ /* no subspace iteration needed. Finish up and Return */
+ if (subnd == 0) {
+ n = arr->nd;
+ for (i=0; i<n; i++) {
+ mit->iteraxes[i] = i;
}
+ goto finish;
+ }
- if (sub == NULL) goto fail;
- mit->subspace = (PyArrayIterObject *)PyArray_IterNew(sub);
- Py_DECREF(sub);
- if (mit->subspace == NULL) goto fail;
-
- /* Expand dimensions of result */
- n = mit->subspace->ao->nd;
- for (i=0; i<n; i++)
- mit->dimensions[mit->nd+i] = mit->subspace->ao->dimensions[i];
- mit->nd += n;
-
- /* Now, we still need to interpret the ellipsis and slice objects
- to determine which axes the indexing arrays are referring to
- */
- n = PyTuple_GET_SIZE(mit->indexobj);
+ /* all indexing arrays have been converted to 0
+ therefore we can extract the subspace with a simple
+ getitem call which will use view semantics
+ */
+ /* But, be sure to do it with a true array.
+ */
+ if (PyArray_CheckExact(arr)) {
+ sub = array_subscript_simple(arr, mit->indexobj);
+ }
+ else {
+ Py_INCREF(arr);
+ obj = PyArray_EnsureArray((PyObject *)arr);
+ if (obj == NULL) goto fail;
+ sub = array_subscript_simple((PyArrayObject *)obj, mit->indexobj);
+ Py_DECREF(obj);
+ }
- /* The number of dimensions an ellipsis takes up */
- ellipexp = arr->nd - n + 1;
- /* Now fill in iteraxes -- remember indexing arrays have been
- converted to 0's in mit->indexobj */
- curraxis = 0;
- j = 0;
- noellip = 1; /* Only expand the first ellipsis */
- memset(mit->bscoord, 0, sizeof(intp)*arr->nd);
- for (i=0; i<n; i++) {
- /* We need to fill in the starting coordinates for
- the subspace */
- obj = PyTuple_GET_ITEM(mit->indexobj, i);
- if (PyInt_Check(obj) || PyLong_Check(obj))
- mit->iteraxes[j++] = curraxis++;
- else if (noellip && obj == Py_Ellipsis) {
- curraxis += ellipexp;
- noellip = 0;
- }
- else {
- intp start=0;
- intp stop, step;
- /* Should be slice object or
- another Ellipsis */
- if (obj == Py_Ellipsis) {
- mit->bscoord[curraxis] = 0;
- }
- else if (!PySlice_Check(obj) || \
- (slice_GetIndices((PySliceObject *)obj,
- arr->dimensions[curraxis],
- &start, &stop, &step,
- &dimsize) < 0)) {
- PyErr_Format(PyExc_ValueError,
- "unexpected object " \
- "(%s) in selection position %d",
- obj->ob_type->tp_name, i);
- goto fail;
- }
- else {
- mit->bscoord[curraxis] = start;
- }
- curraxis += 1;
- }
+ if (sub == NULL) goto fail;
+ mit->subspace = (PyArrayIterObject *)PyArray_IterNew(sub);
+ Py_DECREF(sub);
+ if (mit->subspace == NULL) goto fail;
+
+ /* Expand dimensions of result */
+ n = mit->subspace->ao->nd;
+ for (i=0; i<n; i++)
+ mit->dimensions[mit->nd+i] = mit->subspace->ao->dimensions[i];
+ mit->nd += n;
+
+ /* Now, we still need to interpret the ellipsis and slice objects
+ to determine which axes the indexing arrays are referring to
+ */
+ n = PyTuple_GET_SIZE(mit->indexobj);
+
+ /* The number of dimensions an ellipsis takes up */
+ ellipexp = arr->nd - n + 1;
+ /* Now fill in iteraxes -- remember indexing arrays have been
+ converted to 0's in mit->indexobj */
+ curraxis = 0;
+ j = 0;
+ noellip = 1; /* Only expand the first ellipsis */
+ memset(mit->bscoord, 0, sizeof(intp)*arr->nd);
+ for (i=0; i<n; i++) {
+ /* We need to fill in the starting coordinates for
+ the subspace */
+ obj = PyTuple_GET_ITEM(mit->indexobj, i);
+ if (PyInt_Check(obj) || PyLong_Check(obj))
+ mit->iteraxes[j++] = curraxis++;
+ else if (noellip && obj == Py_Ellipsis) {
+ curraxis += ellipexp;
+ noellip = 0;
}
- finish:
- /* Here check the indexes (now that we have iteraxes) */
- mit->size = PyArray_MultiplyList(mit->dimensions, mit->nd);
- if (mit->ait->size == 0 && mit->size != 0) {
- PyErr_SetString(PyExc_ValueError,
- "invalid index into a 0-size array");
+ else {
+ intp start=0;
+ intp stop, step;
+ /* Should be slice object or
+ another Ellipsis */
+ if (obj == Py_Ellipsis) {
+ mit->bscoord[curraxis] = 0;
+ }
+ else if (!PySlice_Check(obj) || \
+ (slice_GetIndices((PySliceObject *)obj,
+ arr->dimensions[curraxis],
+ &start, &stop, &step,
+ &dimsize) < 0)) {
+ PyErr_Format(PyExc_ValueError,
+ "unexpected object " \
+ "(%s) in selection position %d",
+ obj->ob_type->tp_name, i);
goto fail;
+ }
+ else {
+ mit->bscoord[curraxis] = start;
+ }
+ curraxis += 1;
}
+ }
+ finish:
+ /* Here check the indexes (now that we have iteraxes) */
+ mit->size = PyArray_MultiplyList(mit->dimensions, mit->nd);
+ if (mit->ait->size == 0 && mit->size != 0) {
+ PyErr_SetString(PyExc_ValueError,
+ "invalid index into a 0-size array");
+ goto fail;
+ }
- for (i=0; i<mit->numiter; i++) {
- intp indval;
- it = mit->iters[i];
- PyArray_ITER_RESET(it);
- dimsize = arr->dimensions[mit->iteraxes[i]];
- while(it->index < it->size) {
- indptr = ((intp *)it->dataptr);
- indval = *indptr;
- if (indval < 0) indval += dimsize;
- if (indval < 0 || indval >= dimsize) {
- PyErr_Format(PyExc_IndexError,
- "index (%d) out of range "\
- "(0<=index<=%d) in dimension %d",
- (int) indval, (int) (dimsize-1),
- mit->iteraxes[i]);
- goto fail;
- }
- PyArray_ITER_NEXT(it);
- }
- PyArray_ITER_RESET(it);
+ for (i=0; i<mit->numiter; i++) {
+ intp indval;
+ it = mit->iters[i];
+ PyArray_ITER_RESET(it);
+ dimsize = arr->dimensions[mit->iteraxes[i]];
+ while(it->index < it->size) {
+ indptr = ((intp *)it->dataptr);
+ indval = *indptr;
+ if (indval < 0) indval += dimsize;
+ if (indval < 0 || indval >= dimsize) {
+ PyErr_Format(PyExc_IndexError,
+ "index (%d) out of range "\
+ "(0<=index<=%d) in dimension %d",
+ (int) indval, (int) (dimsize-1),
+ mit->iteraxes[i]);
+ goto fail;
+ }
+ PyArray_ITER_NEXT(it);
}
- return;
+ PyArray_ITER_RESET(it);
+ }
+ return;
fail:
- Py_XDECREF(mit->subspace);
- Py_XDECREF(mit->ait);
- mit->subspace = NULL;
- mit->ait = NULL;
- return;
+ Py_XDECREF(mit->subspace);
+ Py_XDECREF(mit->ait);
+ mit->subspace = NULL;
+ mit->ait = NULL;
+ return;
}
/* This function takes a Boolean array and constructs index objects and
@@ -10089,119 +10088,119 @@ PyArray_MapIterBind(PyArrayMapIterObject *mit, PyArrayObject *arr)
static int
_nonzero_indices(PyObject *myBool, PyArrayIterObject **iters)
{
- PyArray_Descr *typecode;
- PyArrayObject *ba =NULL, *new=NULL;
- int nd, j;
- intp size, i, count;
- Bool *ptr;
- intp coords[MAX_DIMS], dims_m1[MAX_DIMS];
- intp *dptr[MAX_DIMS];
-
- typecode=PyArray_DescrFromType(PyArray_BOOL);
- ba = (PyArrayObject *)PyArray_FromAny(myBool, typecode, 0, 0,
- CARRAY, NULL);
- if (ba == NULL) return -1;
- nd = ba->nd;
- for (j=0; j<nd; j++) iters[j] = NULL;
- size = PyArray_SIZE(ba);
- ptr = (Bool *)ba->data;
- count = 0;
-
- /* pre-determine how many nonzero entries there are */
- for (i=0; i<size; i++)
- if (*(ptr++)) count++;
-
- /* create count-sized index arrays for each dimension */
- for (j=0; j<nd; j++) {
- new = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, &count,
- PyArray_INTP, NULL, NULL,
- 0, 0, NULL);
- if (new == NULL) goto fail;
- iters[j] = (PyArrayIterObject *) \
- PyArray_IterNew((PyObject *)new);
- Py_DECREF(new);
- if (iters[j] == NULL) goto fail;
- dptr[j] = (intp *)iters[j]->ao->data;
- coords[j] = 0;
- dims_m1[j] = ba->dimensions[j]-1;
- }
+ PyArray_Descr *typecode;
+ PyArrayObject *ba =NULL, *new=NULL;
+ int nd, j;
+ intp size, i, count;
+ Bool *ptr;
+ intp coords[MAX_DIMS], dims_m1[MAX_DIMS];
+ intp *dptr[MAX_DIMS];
+
+ typecode=PyArray_DescrFromType(PyArray_BOOL);
+ ba = (PyArrayObject *)PyArray_FromAny(myBool, typecode, 0, 0,
+ CARRAY, NULL);
+ if (ba == NULL) return -1;
+ nd = ba->nd;
+ for (j=0; j<nd; j++) iters[j] = NULL;
+ size = PyArray_SIZE(ba);
+ ptr = (Bool *)ba->data;
+ count = 0;
+
+ /* pre-determine how many nonzero entries there are */
+ for (i=0; i<size; i++)
+ if (*(ptr++)) count++;
+
+ /* create count-sized index arrays for each dimension */
+ for (j=0; j<nd; j++) {
+ new = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, &count,
+ PyArray_INTP, NULL, NULL,
+ 0, 0, NULL);
+ if (new == NULL) goto fail;
+ iters[j] = (PyArrayIterObject *) \
+ PyArray_IterNew((PyObject *)new);
+ Py_DECREF(new);
+ if (iters[j] == NULL) goto fail;
+ dptr[j] = (intp *)iters[j]->ao->data;
+ coords[j] = 0;
+ dims_m1[j] = ba->dimensions[j]-1;
+ }
- ptr = (Bool *)ba->data;
+ ptr = (Bool *)ba->data;
- if (count == 0) goto finish;
+ if (count == 0) goto finish;
- /* Loop through the Boolean array and copy coordinates
- for non-zero entries */
- for (i=0; i<size; i++) {
- if (*(ptr++)) {
- for (j=0; j<nd; j++)
- *(dptr[j]++) = coords[j];
- }
- /* Borrowed from ITER_NEXT macro */
- for (j=nd-1; j>=0; j--) {
- if (coords[j] < dims_m1[j]) {
- coords[j]++;
- break;
- }
- else {
- coords[j] = 0;
- }
- }
+ /* Loop through the Boolean array and copy coordinates
+ for non-zero entries */
+ for (i=0; i<size; i++) {
+ if (*(ptr++)) {
+ for (j=0; j<nd; j++)
+ *(dptr[j]++) = coords[j];
+ }
+ /* Borrowed from ITER_NEXT macro */
+ for (j=nd-1; j>=0; j--) {
+ if (coords[j] < dims_m1[j]) {
+ coords[j]++;
+ break;
+ }
+ else {
+ coords[j] = 0;
+ }
}
+ }
finish:
- Py_DECREF(ba);
- return nd;
+ Py_DECREF(ba);
+ return nd;
fail:
- for (j=0; j<nd; j++) {
- Py_XDECREF(iters[j]);
- }
- Py_XDECREF(ba);
- return -1;
+ for (j=0; j<nd; j++) {
+ Py_XDECREF(iters[j]);
+ }
+ Py_XDECREF(ba);
+ return -1;
}
static PyObject *
PyArray_MapIterNew(PyObject *indexobj, int oned, int fancy)
{
- PyArrayMapIterObject *mit;
- PyArray_Descr *indtype;
- PyObject *arr = NULL;
- int i, n, started, nonindex;
+ PyArrayMapIterObject *mit;
+ PyArray_Descr *indtype;
+ PyObject *arr = NULL;
+ int i, n, started, nonindex;
- if (fancy == SOBJ_BADARRAY) {
- PyErr_SetString(PyExc_IndexError, \
- "arrays used as indices must be of " \
- "integer (or boolean) type");
- return NULL;
- }
- if (fancy == SOBJ_TOOMANY) {
- PyErr_SetString(PyExc_IndexError, "too many indices");
- return NULL;
- }
+ if (fancy == SOBJ_BADARRAY) {
+ PyErr_SetString(PyExc_IndexError, \
+ "arrays used as indices must be of " \
+ "integer (or boolean) type");
+ return NULL;
+ }
+ if (fancy == SOBJ_TOOMANY) {
+ PyErr_SetString(PyExc_IndexError, "too many indices");
+ return NULL;
+ }
- mit = (PyArrayMapIterObject *)_pya_malloc(sizeof(PyArrayMapIterObject));
- PyObject_Init((PyObject *)mit, &PyArrayMapIter_Type);
- if (mit == NULL)
- return NULL;
- for (i=0; i<MAX_DIMS; i++)
- mit->iters[i] = NULL;
- mit->index = 0;
- mit->ait = NULL;
- mit->subspace = NULL;
- mit->numiter = 0;
- mit->consec = 1;
- Py_INCREF(indexobj);
+ mit = (PyArrayMapIterObject *)_pya_malloc(sizeof(PyArrayMapIterObject));
+ PyObject_Init((PyObject *)mit, &PyArrayMapIter_Type);
+ if (mit == NULL)
+ return NULL;
+ for (i=0; i<MAX_DIMS; i++)
+ mit->iters[i] = NULL;
+ mit->index = 0;
+ mit->ait = NULL;
+ mit->subspace = NULL;
+ mit->numiter = 0;
+ mit->consec = 1;
+ Py_INCREF(indexobj);
+ mit->indexobj = indexobj;
+
+ if (fancy == SOBJ_LISTTUP) {
+ PyObject *newobj;
+ newobj = PySequence_Tuple(indexobj);
+ if (newobj == NULL) goto fail;
+ Py_DECREF(indexobj);
+ indexobj = newobj;
mit->indexobj = indexobj;
-
- if (fancy == SOBJ_LISTTUP) {
- PyObject *newobj;
- newobj = PySequence_Tuple(indexobj);
- if (newobj == NULL) goto fail;
- Py_DECREF(indexobj);
- indexobj = newobj;
- mit->indexobj = indexobj;
- }
+ }
#undef SOBJ_NOTFANCY
#undef SOBJ_ISFANCY
@@ -10209,118 +10208,118 @@ PyArray_MapIterNew(PyObject *indexobj, int oned, int fancy)
#undef SOBJ_TOOMANY
#undef SOBJ_LISTTUP
- if (oned) return (PyObject *)mit;
-
- /* Must have some kind of fancy indexing if we are here */
- /* indexobj is either a list, an arrayobject, or a tuple
- (with at least 1 list or arrayobject or Bool object), */
-
- /* convert all inputs to iterators */
- if (PyArray_Check(indexobj) && \
- (PyArray_TYPE(indexobj) == PyArray_BOOL)) {
- mit->numiter = _nonzero_indices(indexobj, mit->iters);
- if (mit->numiter < 0) goto fail;
- mit->nd = 1;
- mit->dimensions[0] = mit->iters[0]->dims_m1[0]+1;
- Py_DECREF(mit->indexobj);
- mit->indexobj = PyTuple_New(mit->numiter);
- if (mit->indexobj == NULL) goto fail;
- for (i=0; i<mit->numiter; i++) {
- PyTuple_SET_ITEM(mit->indexobj, i,
- PyInt_FromLong(0));
- }
+ if (oned) return (PyObject *)mit;
+
+ /* Must have some kind of fancy indexing if we are here */
+ /* indexobj is either a list, an arrayobject, or a tuple
+ (with at least 1 list or arrayobject or Bool object), */
+
+ /* convert all inputs to iterators */
+ if (PyArray_Check(indexobj) && \
+ (PyArray_TYPE(indexobj) == PyArray_BOOL)) {
+ mit->numiter = _nonzero_indices(indexobj, mit->iters);
+ if (mit->numiter < 0) goto fail;
+ mit->nd = 1;
+ mit->dimensions[0] = mit->iters[0]->dims_m1[0]+1;
+ Py_DECREF(mit->indexobj);
+ mit->indexobj = PyTuple_New(mit->numiter);
+ if (mit->indexobj == NULL) goto fail;
+ for (i=0; i<mit->numiter; i++) {
+ PyTuple_SET_ITEM(mit->indexobj, i,
+ PyInt_FromLong(0));
}
+ }
- else if (PyArray_Check(indexobj) || !PyTuple_Check(indexobj)) {
- mit->numiter = 1;
- indtype = PyArray_DescrFromType(PyArray_INTP);
- arr = PyArray_FromAny(indexobj, indtype, 0, 0, FORCECAST, NULL);
- if (arr == NULL) goto fail;
- mit->iters[0] = (PyArrayIterObject *)PyArray_IterNew(arr);
- if (mit->iters[0] == NULL) {Py_DECREF(arr); goto fail;}
- mit->nd = PyArray_NDIM(arr);
- memcpy(mit->dimensions,PyArray_DIMS(arr),mit->nd*sizeof(intp));
- mit->size = PyArray_SIZE(arr);
- Py_DECREF(arr);
- Py_DECREF(mit->indexobj);
- mit->indexobj = Py_BuildValue("(N)", PyInt_FromLong(0));
- }
- else { /* must be a tuple */
- PyObject *obj;
- PyArrayIterObject **iterp;
- PyObject *new;
- int numiters, j, n2;
- /* Make a copy of the tuple -- we will be replacing
- index objects with 0's */
- n = PyTuple_GET_SIZE(indexobj);
- n2 = n;
- new = PyTuple_New(n2);
- if (new == NULL) goto fail;
- started = 0;
- nonindex = 0;
- j = 0;
- for (i=0; i<n; i++) {
- obj = PyTuple_GET_ITEM(indexobj,i);
- iterp = mit->iters + mit->numiter;
- if ((numiters=_convert_obj(obj, iterp)) < 0) {
- Py_DECREF(new);
- goto fail;
- }
- if (numiters > 0) {
- started = 1;
- if (nonindex) mit->consec = 0;
- mit->numiter += numiters;
- if (numiters == 1) {
- PyTuple_SET_ITEM(new,j++,
- PyInt_FromLong(0));
- }
- else { /* we need to grow the
- new indexing object and fill
- it with 0s for each of the iterators
- produced */
- int k;
- n2 += numiters - 1;
- if (_PyTuple_Resize(&new, n2) < 0)
- goto fail;
- for (k=0;k<numiters;k++) {
- PyTuple_SET_ITEM \
- (new,j++,
- PyInt_FromLong(0));
- }
- }
- }
- else {
- if (started) nonindex = 1;
- Py_INCREF(obj);
- PyTuple_SET_ITEM(new,j++,obj);
- }
- }
- Py_DECREF(mit->indexobj);
- mit->indexobj = new;
- /* Store the number of iterators actually converted */
- /* These will be mapped to actual axes at bind time */
- if (PyArray_Broadcast((PyArrayMultiIterObject *)mit) < 0)
+ else if (PyArray_Check(indexobj) || !PyTuple_Check(indexobj)) {
+ mit->numiter = 1;
+ indtype = PyArray_DescrFromType(PyArray_INTP);
+ arr = PyArray_FromAny(indexobj, indtype, 0, 0, FORCECAST, NULL);
+ if (arr == NULL) goto fail;
+ mit->iters[0] = (PyArrayIterObject *)PyArray_IterNew(arr);
+ if (mit->iters[0] == NULL) {Py_DECREF(arr); goto fail;}
+ mit->nd = PyArray_NDIM(arr);
+ memcpy(mit->dimensions,PyArray_DIMS(arr),mit->nd*sizeof(intp));
+ mit->size = PyArray_SIZE(arr);
+ Py_DECREF(arr);
+ Py_DECREF(mit->indexobj);
+ mit->indexobj = Py_BuildValue("(N)", PyInt_FromLong(0));
+ }
+ else { /* must be a tuple */
+ PyObject *obj;
+ PyArrayIterObject **iterp;
+ PyObject *new;
+ int numiters, j, n2;
+ /* Make a copy of the tuple -- we will be replacing
+ index objects with 0's */
+ n = PyTuple_GET_SIZE(indexobj);
+ n2 = n;
+ new = PyTuple_New(n2);
+ if (new == NULL) goto fail;
+ started = 0;
+ nonindex = 0;
+ j = 0;
+ for (i=0; i<n; i++) {
+ obj = PyTuple_GET_ITEM(indexobj,i);
+ iterp = mit->iters + mit->numiter;
+ if ((numiters=_convert_obj(obj, iterp)) < 0) {
+ Py_DECREF(new);
+ goto fail;
+ }
+ if (numiters > 0) {
+ started = 1;
+ if (nonindex) mit->consec = 0;
+ mit->numiter += numiters;
+ if (numiters == 1) {
+ PyTuple_SET_ITEM(new,j++,
+ PyInt_FromLong(0));
+ }
+ else { /* we need to grow the
+ new indexing object and fill
+ it with 0s for each of the iterators
+ produced */
+ int k;
+ n2 += numiters - 1;
+ if (_PyTuple_Resize(&new, n2) < 0)
goto fail;
+ for (k=0;k<numiters;k++) {
+ PyTuple_SET_ITEM \
+ (new,j++,
+ PyInt_FromLong(0));
+ }
+ }
+ }
+ else {
+ if (started) nonindex = 1;
+ Py_INCREF(obj);
+ PyTuple_SET_ITEM(new,j++,obj);
+ }
}
+ Py_DECREF(mit->indexobj);
+ mit->indexobj = new;
+ /* Store the number of iterators actually converted */
+ /* These will be mapped to actual axes at bind time */
+ if (PyArray_Broadcast((PyArrayMultiIterObject *)mit) < 0)
+ goto fail;
+ }
- return (PyObject *)mit;
+ return (PyObject *)mit;
fail:
- Py_DECREF(mit);
- return NULL;
+ Py_DECREF(mit);
+ return NULL;
}
static void
arraymapiter_dealloc(PyArrayMapIterObject *mit)
{
- int i;
- Py_XDECREF(mit->indexobj);
- Py_XDECREF(mit->ait);
- Py_XDECREF(mit->subspace);
- for (i=0; i<mit->numiter; i++)
- Py_XDECREF(mit->iters[i]);
- _pya_free(mit);
+ int i;
+ Py_XDECREF(mit->indexobj);
+ Py_XDECREF(mit->ait);
+ Py_XDECREF(mit->subspace);
+ for (i=0; i<mit->numiter; i++)
+ Py_XDECREF(mit->iters[i]);
+ _pya_free(mit);
}
/* The mapiter object must be created new each time. It does not work
@@ -10335,53 +10334,53 @@ arraymapiter_dealloc(PyArrayMapIterObject *mit)
*/
static PyTypeObject PyArrayMapIter_Type = {
- PyObject_HEAD_INIT(NULL)
- 0, /* ob_size */
- "numpy.mapiter", /* tp_name */
- sizeof(PyArrayIterObject), /* tp_basicsize */
- 0, /* tp_itemsize */
- /* methods */
- (destructor)arraymapiter_dealloc, /* tp_dealloc */
- 0, /* tp_print */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_compare */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
- 0, /* tp_doc */
- (traverseproc)0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- (iternextfunc)0, /* tp_iternext */
- 0, /* tp_methods */
- 0, /* tp_members */
- 0, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)0, /* tp_init */
- 0, /* tp_alloc */
- 0, /* tp_new */
- 0, /* tp_free */
- 0, /* tp_is_gc */
- 0, /* tp_bases */
- 0, /* tp_mro */
- 0, /* tp_cache */
- 0, /* tp_subclasses */
- 0 /* tp_weaklist */
+ PyObject_HEAD_INIT(NULL)
+ 0, /* ob_size */
+ "numpy.mapiter", /* tp_name */
+ sizeof(PyArrayIterObject), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ /* methods */
+ (destructor)arraymapiter_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_compare */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ 0, /* tp_doc */
+ (traverseproc)0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ (iternextfunc)0, /* tp_iternext */
+ 0, /* tp_methods */
+ 0, /* tp_members */
+ 0, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)0, /* tp_init */
+ 0, /* tp_alloc */
+ 0, /* tp_new */
+ 0, /* tp_free */
+ 0, /* tp_is_gc */
+ 0, /* tp_bases */
+ 0, /* tp_mro */
+ 0, /* tp_cache */
+ 0, /* tp_subclasses */
+ 0 /* tp_weaklist */
};
@@ -10389,152 +10388,152 @@ static PyTypeObject PyArrayMapIter_Type = {
/*OBJECT_API
- Get MultiIterator,
+ Get MultiIterator,
*/
static PyObject *
PyArray_MultiIterNew(int n, ...)
{
- va_list va;
- PyArrayMultiIterObject *multi;
- PyObject *current;
- PyObject *arr;
+ va_list va;
+ PyArrayMultiIterObject *multi;
+ PyObject *current;
+ PyObject *arr;
- int i, err=0;
+ int i, err=0;
- if (n < 2 || n > NPY_MAXARGS) {
- PyErr_Format(PyExc_ValueError,
- "Need between 2 and (%d) " \
- "array objects (inclusive).", NPY_MAXARGS);
- return NULL;
- }
+ if (n < 2 || n > NPY_MAXARGS) {
+ PyErr_Format(PyExc_ValueError,
+ "Need between 2 and (%d) " \
+ "array objects (inclusive).", NPY_MAXARGS);
+ return NULL;
+ }
- /* fprintf(stderr, "multi new...");*/
+ /* fprintf(stderr, "multi new...");*/
- multi = _pya_malloc(sizeof(PyArrayMultiIterObject));
- if (multi == NULL) return PyErr_NoMemory();
- PyObject_Init((PyObject *)multi, &PyArrayMultiIter_Type);
+ multi = _pya_malloc(sizeof(PyArrayMultiIterObject));
+ if (multi == NULL) return PyErr_NoMemory();
+ PyObject_Init((PyObject *)multi, &PyArrayMultiIter_Type);
- for (i=0; i<n; i++) multi->iters[i] = NULL;
- multi->numiter = n;
- multi->index = 0;
+ for (i=0; i<n; i++) multi->iters[i] = NULL;
+ multi->numiter = n;
+ multi->index = 0;
- va_start(va, n);
- for (i=0; i<n; i++) {
- current = va_arg(va, PyObject *);
- arr = PyArray_FROM_O(current);
- if (arr==NULL) {
- err=1; break;
- }
- else {
- multi->iters[i] = (PyArrayIterObject *)PyArray_IterNew(arr);
- Py_DECREF(arr);
- }
+ va_start(va, n);
+ for (i=0; i<n; i++) {
+ current = va_arg(va, PyObject *);
+ arr = PyArray_FROM_O(current);
+ if (arr==NULL) {
+ err=1; break;
+ }
+ else {
+ multi->iters[i] = (PyArrayIterObject *)PyArray_IterNew(arr);
+ Py_DECREF(arr);
}
+ }
- va_end(va);
+ va_end(va);
- if (!err && PyArray_Broadcast(multi) < 0) err=1;
+ if (!err && PyArray_Broadcast(multi) < 0) err=1;
- if (err) {
- Py_DECREF(multi);
- return NULL;
- }
+ if (err) {
+ Py_DECREF(multi);
+ return NULL;
+ }
- PyArray_MultiIter_RESET(multi);
+ PyArray_MultiIter_RESET(multi);
- return (PyObject *)multi;
+ return (PyObject *)multi;
}
static PyObject *
arraymultiter_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds)
{
- int n, i;
- PyArrayMultiIterObject *multi;
- PyObject *arr;
+ int n, i;
+ PyArrayMultiIterObject *multi;
+ PyObject *arr;
- if (kwds != NULL) {
- PyErr_SetString(PyExc_ValueError,
- "keyword arguments not accepted.");
- return NULL;
- }
-
- n = PyTuple_Size(args);
- if (n < 2 || n > NPY_MAXARGS) {
- if (PyErr_Occurred()) return NULL;
- PyErr_Format(PyExc_ValueError,
- "Need at least two and fewer than (%d) " \
- "array objects.", NPY_MAXARGS);
- return NULL;
- }
+ if (kwds != NULL) {
+ PyErr_SetString(PyExc_ValueError,
+ "keyword arguments not accepted.");
+ return NULL;
+ }
- multi = _pya_malloc(sizeof(PyArrayMultiIterObject));
- if (multi == NULL) return PyErr_NoMemory();
- PyObject_Init((PyObject *)multi, &PyArrayMultiIter_Type);
+ n = PyTuple_Size(args);
+ if (n < 2 || n > NPY_MAXARGS) {
+ if (PyErr_Occurred()) return NULL;
+ PyErr_Format(PyExc_ValueError,
+ "Need at least two and fewer than (%d) " \
+ "array objects.", NPY_MAXARGS);
+ return NULL;
+ }
- multi->numiter = n;
- multi->index = 0;
- for (i=0; i<n; i++) multi->iters[i] = NULL;
- for (i=0; i<n; i++) {
- arr = PyArray_FromAny(PyTuple_GET_ITEM(args, i), NULL, 0, 0, 0, NULL);
- if (arr == NULL) goto fail;
- if ((multi->iters[i] = \
- (PyArrayIterObject *)PyArray_IterNew(arr))==NULL)
- goto fail;
- Py_DECREF(arr);
- }
- if (PyArray_Broadcast(multi) < 0) goto fail;
- PyArray_MultiIter_RESET(multi);
+ multi = _pya_malloc(sizeof(PyArrayMultiIterObject));
+ if (multi == NULL) return PyErr_NoMemory();
+ PyObject_Init((PyObject *)multi, &PyArrayMultiIter_Type);
+
+ multi->numiter = n;
+ multi->index = 0;
+ for (i=0; i<n; i++) multi->iters[i] = NULL;
+ for (i=0; i<n; i++) {
+ arr = PyArray_FromAny(PyTuple_GET_ITEM(args, i), NULL, 0, 0, 0, NULL);
+ if (arr == NULL) goto fail;
+ if ((multi->iters[i] = \
+ (PyArrayIterObject *)PyArray_IterNew(arr))==NULL)
+ goto fail;
+ Py_DECREF(arr);
+ }
+ if (PyArray_Broadcast(multi) < 0) goto fail;
+ PyArray_MultiIter_RESET(multi);
- return (PyObject *)multi;
+ return (PyObject *)multi;
fail:
- Py_DECREF(multi);
- return NULL;
+ Py_DECREF(multi);
+ return NULL;
}
static PyObject *
arraymultiter_next(PyArrayMultiIterObject *multi)
{
- PyObject *ret;
- int i, n;
+ PyObject *ret;
+ int i, n;
- n = multi->numiter;
- ret = PyTuple_New(n);
- if (ret == NULL) return NULL;
- if (multi->index < multi->size) {
- for (i=0; i < n; i++) {
- PyArrayIterObject *it=multi->iters[i];
- PyTuple_SET_ITEM(ret, i,
- PyArray_ToScalar(it->dataptr, it->ao));
- PyArray_ITER_NEXT(it);
- }
- multi->index++;
- return ret;
+ n = multi->numiter;
+ ret = PyTuple_New(n);
+ if (ret == NULL) return NULL;
+ if (multi->index < multi->size) {
+ for (i=0; i < n; i++) {
+ PyArrayIterObject *it=multi->iters[i];
+ PyTuple_SET_ITEM(ret, i,
+ PyArray_ToScalar(it->dataptr, it->ao));
+ PyArray_ITER_NEXT(it);
}
- return NULL;
+ multi->index++;
+ return ret;
+ }
+ return NULL;
}
static void
arraymultiter_dealloc(PyArrayMultiIterObject *multi)
{
- int i;
+ int i;
- for (i=0; i<multi->numiter; i++)
- Py_XDECREF(multi->iters[i]);
- multi->ob_type->tp_free((PyObject *)multi);
+ for (i=0; i<multi->numiter; i++)
+ Py_XDECREF(multi->iters[i]);
+ multi->ob_type->tp_free((PyObject *)multi);
}
static PyObject *
arraymultiter_size_get(PyArrayMultiIterObject *self)
{
#if SIZEOF_INTP <= SIZEOF_LONG
- return PyInt_FromLong((long) self->size);
+ return PyInt_FromLong((long) self->size);
#else
- if (self->size < MAX_LONG)
- return PyInt_FromLong((long) self->size);
- else
- return PyLong_FromLongLong((longlong) self->size);
+ if (self->size < MAX_LONG)
+ return PyInt_FromLong((long) self->size);
+ else
+ return PyLong_FromLongLong((longlong) self->size);
#endif
}
@@ -10542,135 +10541,135 @@ static PyObject *
arraymultiter_index_get(PyArrayMultiIterObject *self)
{
#if SIZEOF_INTP <= SIZEOF_LONG
- return PyInt_FromLong((long) self->index);
+ return PyInt_FromLong((long) self->index);
#else
- if (self->size < MAX_LONG)
- return PyInt_FromLong((long) self->index);
- else
- return PyLong_FromLongLong((longlong) self->index);
+ if (self->size < MAX_LONG)
+ return PyInt_FromLong((long) self->index);
+ else
+ return PyLong_FromLongLong((longlong) self->index);
#endif
}
static PyObject *
arraymultiter_shape_get(PyArrayMultiIterObject *self)
{
- return PyArray_IntTupleFromIntp(self->nd, self->dimensions);
+ return PyArray_IntTupleFromIntp(self->nd, self->dimensions);
}
static PyObject *
arraymultiter_iters_get(PyArrayMultiIterObject *self)
{
- PyObject *res;
- int i, n;
- n = self->numiter;
- res = PyTuple_New(n);
- if (res == NULL) return res;
- for (i=0; i<n; i++) {
- Py_INCREF(self->iters[i]);
- PyTuple_SET_ITEM(res, i, (PyObject *)self->iters[i]);
- }
- return res;
+ PyObject *res;
+ int i, n;
+ n = self->numiter;
+ res = PyTuple_New(n);
+ if (res == NULL) return res;
+ for (i=0; i<n; i++) {
+ Py_INCREF(self->iters[i]);
+ PyTuple_SET_ITEM(res, i, (PyObject *)self->iters[i]);
+ }
+ return res;
}
static PyGetSetDef arraymultiter_getsetlist[] = {
- {"size",
- (getter)arraymultiter_size_get,
- NULL, NULL},
- {"index",
- (getter)arraymultiter_index_get,
- NULL, NULL},
- {"shape",
- (getter)arraymultiter_shape_get,
- NULL, NULL},
- {"iters",
- (getter)arraymultiter_iters_get,
- NULL, NULL},
- {NULL, NULL, NULL, NULL},
+ {"size",
+ (getter)arraymultiter_size_get,
+ NULL, NULL},
+ {"index",
+ (getter)arraymultiter_index_get,
+ NULL, NULL},
+ {"shape",
+ (getter)arraymultiter_shape_get,
+ NULL, NULL},
+ {"iters",
+ (getter)arraymultiter_iters_get,
+ NULL, NULL},
+ {NULL, NULL, NULL, NULL},
};
static PyMemberDef arraymultiter_members[] = {
- {"numiter", T_INT, offsetof(PyArrayMultiIterObject, numiter),
- RO, NULL},
- {"nd", T_INT, offsetof(PyArrayMultiIterObject, nd), RO, NULL},
- {NULL},
+ {"numiter", T_INT, offsetof(PyArrayMultiIterObject, numiter),
+ RO, NULL},
+ {"nd", T_INT, offsetof(PyArrayMultiIterObject, nd), RO, NULL},
+ {NULL},
};
static PyObject *
arraymultiter_reset(PyArrayMultiIterObject *self, PyObject *args)
{
- if (!PyArg_ParseTuple(args, "")) return NULL;
+ if (!PyArg_ParseTuple(args, "")) return NULL;
- PyArray_MultiIter_RESET(self);
- Py_INCREF(Py_None);
- return Py_None;
+ PyArray_MultiIter_RESET(self);
+ Py_INCREF(Py_None);
+ return Py_None;
}
static PyMethodDef arraymultiter_methods[] = {
- {"reset", (PyCFunction) arraymultiter_reset, METH_VARARGS, NULL},
- {NULL, NULL},
+ {"reset", (PyCFunction) arraymultiter_reset, METH_VARARGS, NULL},
+ {NULL, NULL},
};
static PyTypeObject PyArrayMultiIter_Type = {
- PyObject_HEAD_INIT(NULL)
- 0, /* ob_size */
- "numpy.broadcast", /* tp_name */
- sizeof(PyArrayMultiIterObject), /* tp_basicsize */
- 0, /* tp_itemsize */
- /* methods */
- (destructor)arraymultiter_dealloc, /* tp_dealloc */
- 0, /* tp_print */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_compare */
- 0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- 0, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
- 0, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- (iternextfunc)arraymultiter_next, /* tp_iternext */
- arraymultiter_methods, /* tp_methods */
- arraymultiter_members, /* tp_members */
- arraymultiter_getsetlist, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)0, /* tp_init */
- 0, /* tp_alloc */
- arraymultiter_new, /* tp_new */
- 0, /* tp_free */
- 0, /* tp_is_gc */
- 0, /* tp_bases */
- 0, /* tp_mro */
- 0, /* tp_cache */
- 0, /* tp_subclasses */
- 0 /* tp_weaklist */
+ PyObject_HEAD_INIT(NULL)
+ 0, /* ob_size */
+ "numpy.broadcast", /* tp_name */
+ sizeof(PyArrayMultiIterObject), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ /* methods */
+ (destructor)arraymultiter_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_compare */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ 0, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ 0, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ (iternextfunc)arraymultiter_next, /* tp_iternext */
+ arraymultiter_methods, /* tp_methods */
+ arraymultiter_members, /* tp_members */
+ arraymultiter_getsetlist, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)0, /* tp_init */
+ 0, /* tp_alloc */
+ arraymultiter_new, /* tp_new */
+ 0, /* tp_free */
+ 0, /* tp_is_gc */
+ 0, /* tp_bases */
+ 0, /* tp_mro */
+ 0, /* tp_cache */
+ 0, /* tp_subclasses */
+ 0 /* tp_weaklist */
};
/*OBJECT_API*/
static PyArray_Descr *
PyArray_DescrNewFromType(int type_num)
{
- PyArray_Descr *old;
- PyArray_Descr *new;
+ PyArray_Descr *old;
+ PyArray_Descr *new;
- old = PyArray_DescrFromType(type_num);
- new = PyArray_DescrNew(old);
- Py_DECREF(old);
- return new;
+ old = PyArray_DescrFromType(type_num);
+ new = PyArray_DescrNew(old);
+ Py_DECREF(old);
+ return new;
}
/*** Array Descr Objects for dynamic types **/
@@ -10691,27 +10690,27 @@ PyArray_DescrNewFromType(int type_num)
static PyArray_Descr *
PyArray_DescrNew(PyArray_Descr *base)
{
- PyArray_Descr *new;
-
- new = PyObject_New(PyArray_Descr, &PyArrayDescr_Type);
- if (new == NULL) return NULL;
- /* Don't copy PyObject_HEAD part */
- memcpy((char *)new+sizeof(PyObject),
- (char *)base+sizeof(PyObject),
- sizeof(PyArray_Descr)-sizeof(PyObject));
-
- if (new->fields == Py_None) new->fields = NULL;
- Py_XINCREF(new->fields);
- Py_XINCREF(new->names);
- if (new->subarray) {
- new->subarray = _pya_malloc(sizeof(PyArray_ArrayDescr));
- memcpy(new->subarray, base->subarray,
- sizeof(PyArray_ArrayDescr));
- Py_INCREF(new->subarray->shape);
- Py_INCREF(new->subarray->base);
- }
- Py_XINCREF(new->typeobj);
- return new;
+ PyArray_Descr *new;
+
+ new = PyObject_New(PyArray_Descr, &PyArrayDescr_Type);
+ if (new == NULL) return NULL;
+ /* Don't copy PyObject_HEAD part */
+ memcpy((char *)new+sizeof(PyObject),
+ (char *)base+sizeof(PyObject),
+ sizeof(PyArray_Descr)-sizeof(PyObject));
+
+ if (new->fields == Py_None) new->fields = NULL;
+ Py_XINCREF(new->fields);
+ Py_XINCREF(new->names);
+ if (new->subarray) {
+ new->subarray = _pya_malloc(sizeof(PyArray_ArrayDescr));
+ memcpy(new->subarray, base->subarray,
+ sizeof(PyArray_ArrayDescr));
+ Py_INCREF(new->subarray->shape);
+ Py_INCREF(new->subarray->base);
+ }
+ Py_XINCREF(new->typeobj);
+ return new;
}
/* should never be called for builtin-types unless
@@ -10720,23 +10719,23 @@ PyArray_DescrNew(PyArray_Descr *base)
static void
arraydescr_dealloc(PyArray_Descr *self)
{
- if (self->fields == Py_None) {
- fprintf(stderr, "*** Reference count error detected: \n" \
- "an attempt was made to deallocate %d (%c) ***\n",
- self->type_num, self->type);
- Py_INCREF(self);
- Py_INCREF(self);
- return;
- }
- Py_XDECREF(self->typeobj);
- Py_XDECREF(self->names);
- Py_XDECREF(self->fields);
- if (self->subarray) {
- Py_DECREF(self->subarray->shape);
- Py_DECREF(self->subarray->base);
- _pya_free(self->subarray);
- }
- self->ob_type->tp_free((PyObject *)self);
+ if (self->fields == Py_None) {
+ fprintf(stderr, "*** Reference count error detected: \n" \
+ "an attempt was made to deallocate %d (%c) ***\n",
+ self->type_num, self->type);
+ Py_INCREF(self);
+ Py_INCREF(self);
+ return;
+ }
+ Py_XDECREF(self->typeobj);
+ Py_XDECREF(self->names);
+ Py_XDECREF(self->fields);
+ if (self->subarray) {
+ Py_DECREF(self->subarray->shape);
+ Py_DECREF(self->subarray->base);
+ _pya_free(self->subarray);
+ }
+ self->ob_type->tp_free((PyObject *)self);
}
/* we need to be careful about setting attributes because these
@@ -10744,133 +10743,133 @@ arraydescr_dealloc(PyArray_Descr *self)
data. Currently no attributes of dtype objects can be set.
*/
static PyMemberDef arraydescr_members[] = {
- {"type", T_OBJECT, offsetof(PyArray_Descr, typeobj), RO, NULL},
- {"kind", T_CHAR, offsetof(PyArray_Descr, kind), RO, NULL},
- {"char", T_CHAR, offsetof(PyArray_Descr, type), RO, NULL},
- {"num", T_INT, offsetof(PyArray_Descr, type_num), RO, NULL},
- {"byteorder", T_CHAR, offsetof(PyArray_Descr, byteorder), RO, NULL},
- {"itemsize", T_INT, offsetof(PyArray_Descr, elsize), RO, NULL},
- {"alignment", T_INT, offsetof(PyArray_Descr, alignment), RO, NULL},
- {"flags", T_UBYTE, offsetof(PyArray_Descr, hasobject), RO, NULL},
- {"names", T_OBJECT, offsetof(PyArray_Descr, names), RO, NULL},
- {NULL},
+ {"type", T_OBJECT, offsetof(PyArray_Descr, typeobj), RO, NULL},
+ {"kind", T_CHAR, offsetof(PyArray_Descr, kind), RO, NULL},
+ {"char", T_CHAR, offsetof(PyArray_Descr, type), RO, NULL},
+ {"num", T_INT, offsetof(PyArray_Descr, type_num), RO, NULL},
+ {"byteorder", T_CHAR, offsetof(PyArray_Descr, byteorder), RO, NULL},
+ {"itemsize", T_INT, offsetof(PyArray_Descr, elsize), RO, NULL},
+ {"alignment", T_INT, offsetof(PyArray_Descr, alignment), RO, NULL},
+ {"flags", T_UBYTE, offsetof(PyArray_Descr, hasobject), RO, NULL},
+ {"names", T_OBJECT, offsetof(PyArray_Descr, names), RO, NULL},
+ {NULL},
};
static PyObject *
arraydescr_subdescr_get(PyArray_Descr *self)
{
- if (self->subarray == NULL) {
- Py_INCREF(Py_None);
- return Py_None;
- }
- return Py_BuildValue("OO", (PyObject *)self->subarray->base,
- self->subarray->shape);
+ if (self->subarray == NULL) {
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
+ return Py_BuildValue("OO", (PyObject *)self->subarray->base,
+ self->subarray->shape);
}
static PyObject *
arraydescr_protocol_typestr_get(PyArray_Descr *self)
{
- char basic_=self->kind;
- char endian = self->byteorder;
- int size=self->elsize;
+ char basic_=self->kind;
+ char endian = self->byteorder;
+ int size=self->elsize;
- if (endian == '=') {
- endian = '<';
- if (!PyArray_IsNativeByteOrder(endian)) endian = '>';
- }
+ if (endian == '=') {
+ endian = '<';
+ if (!PyArray_IsNativeByteOrder(endian)) endian = '>';
+ }
- if (self->type_num == PyArray_UNICODE) {
- size >>= 2;
- }
- return PyString_FromFormat("%c%c%d", endian, basic_, size);
+ if (self->type_num == PyArray_UNICODE) {
+ size >>= 2;
+ }
+ return PyString_FromFormat("%c%c%d", endian, basic_, size);
}
static PyObject *
arraydescr_typename_get(PyArray_Descr *self)
{
- int len;
- PyTypeObject *typeobj = self->typeobj;
- PyObject *res;
- char *s;
- static int prefix_len=0;
-
- if (PyTypeNum_ISUSERDEF(self->type_num)) {
- s = strrchr(typeobj->tp_name, '.');
- if (s == NULL) {
- res = PyString_FromString(typeobj->tp_name);
- }
- else {
- res = PyString_FromStringAndSize(s+1, strlen(s)-1);
- }
- return res;
- }
- else {
- if (prefix_len == 0)
- prefix_len = strlen("numpy.");
+ int len;
+ PyTypeObject *typeobj = self->typeobj;
+ PyObject *res;
+ char *s;
+ static int prefix_len=0;
- len = strlen(typeobj->tp_name);
- if (*(typeobj->tp_name + (len-1)) == '_')
- len-=1;
- len -= prefix_len;
- res = PyString_FromStringAndSize(typeobj->tp_name+prefix_len, len);
+ if (PyTypeNum_ISUSERDEF(self->type_num)) {
+ s = strrchr(typeobj->tp_name, '.');
+ if (s == NULL) {
+ res = PyString_FromString(typeobj->tp_name);
}
- if (PyTypeNum_ISFLEXIBLE(self->type_num) && self->elsize != 0) {
- PyObject *p;
- p = PyString_FromFormat("%d", self->elsize * 8);
- PyString_ConcatAndDel(&res, p);
+ else {
+ res = PyString_FromStringAndSize(s+1, strlen(s)-1);
}
return res;
+ }
+ else {
+ if (prefix_len == 0)
+ prefix_len = strlen("numpy.");
+
+ len = strlen(typeobj->tp_name);
+ if (*(typeobj->tp_name + (len-1)) == '_')
+ len-=1;
+ len -= prefix_len;
+ res = PyString_FromStringAndSize(typeobj->tp_name+prefix_len, len);
+ }
+ if (PyTypeNum_ISFLEXIBLE(self->type_num) && self->elsize != 0) {
+ PyObject *p;
+ p = PyString_FromFormat("%d", self->elsize * 8);
+ PyString_ConcatAndDel(&res, p);
+ }
+ return res;
}
static PyObject *
arraydescr_base_get(PyArray_Descr *self)
{
- if (self->subarray == NULL) {
- Py_INCREF(self);
- return (PyObject *)self;
- }
- Py_INCREF(self->subarray->base);
- return (PyObject *)(self->subarray->base);
+ if (self->subarray == NULL) {
+ Py_INCREF(self);
+ return (PyObject *)self;
+ }
+ Py_INCREF(self->subarray->base);
+ return (PyObject *)(self->subarray->base);
}
static PyObject *
arraydescr_shape_get(PyArray_Descr *self)
{
- if (self->subarray == NULL) {
- return PyTuple_New(0);
- }
- if (PyTuple_Check(self->subarray->shape)) {
- Py_INCREF(self->subarray->shape);
- return (PyObject *)(self->subarray->shape);
- }
- return Py_BuildValue("(O)", self->subarray->shape);
+ if (self->subarray == NULL) {
+ return PyTuple_New(0);
+ }
+ if (PyTuple_Check(self->subarray->shape)) {
+ Py_INCREF(self->subarray->shape);
+ return (PyObject *)(self->subarray->shape);
+ }
+ return Py_BuildValue("(O)", self->subarray->shape);
}
static PyObject *
arraydescr_protocol_descr_get(PyArray_Descr *self)
{
- PyObject *dobj, *res;
- PyObject *_numpy_internal;
-
- if (self->names == NULL) {
- /* get default */
- dobj = PyTuple_New(2);
- if (dobj == NULL) return NULL;
- PyTuple_SET_ITEM(dobj, 0, PyString_FromString(""));
- PyTuple_SET_ITEM(dobj, 1, \
- arraydescr_protocol_typestr_get(self));
- res = PyList_New(1);
- if (res == NULL) {Py_DECREF(dobj); return NULL;}
- PyList_SET_ITEM(res, 0, dobj);
- return res;
- }
-
- _numpy_internal = PyImport_ImportModule("numpy.core._internal");
- if (_numpy_internal == NULL) return NULL;
- res = PyObject_CallMethod(_numpy_internal, "_array_descr",
- "O", self);
- Py_DECREF(_numpy_internal);
+ PyObject *dobj, *res;
+ PyObject *_numpy_internal;
+
+ if (self->names == NULL) {
+ /* get default */
+ dobj = PyTuple_New(2);
+ if (dobj == NULL) return NULL;
+ PyTuple_SET_ITEM(dobj, 0, PyString_FromString(""));
+ PyTuple_SET_ITEM(dobj, 1, \
+ arraydescr_protocol_typestr_get(self));
+ res = PyList_New(1);
+ if (res == NULL) {Py_DECREF(dobj); return NULL;}
+ PyList_SET_ITEM(res, 0, dobj);
return res;
+ }
+
+ _numpy_internal = PyImport_ImportModule("numpy.core._internal");
+ if (_numpy_internal == NULL) return NULL;
+ res = PyObject_CallMethod(_numpy_internal, "_array_descr",
+ "O", self);
+ Py_DECREF(_numpy_internal);
+ return res;
}
/* returns 1 for a builtin type
@@ -10880,31 +10879,31 @@ arraydescr_protocol_descr_get(PyArray_Descr *self)
static PyObject *
arraydescr_isbuiltin_get(PyArray_Descr *self)
{
- long val;
- val = 0;
- if (self->fields == Py_None) val = 1;
- if (PyTypeNum_ISUSERDEF(self->type_num)) val = 2;
- return PyInt_FromLong(val);
+ long val;
+ val = 0;
+ if (self->fields == Py_None) val = 1;
+ if (PyTypeNum_ISUSERDEF(self->type_num)) val = 2;
+ return PyInt_FromLong(val);
}
static int
_arraydescr_isnative(PyArray_Descr *self)
{
- if (self->names == NULL) {
- return PyArray_ISNBO(self->byteorder);
- }
- else {
- PyObject *key, *value, *title=NULL;
- PyArray_Descr *new;
- int offset;
- Py_ssize_t pos=0;
- while(PyDict_Next(self->fields, &pos, &key, &value)) {
- if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset,
- &title)) return -1;
- if (!_arraydescr_isnative(new)) return 0;
- }
+ if (self->names == NULL) {
+ return PyArray_ISNBO(self->byteorder);
+ }
+ else {
+ PyObject *key, *value, *title=NULL;
+ PyArray_Descr *new;
+ int offset;
+ Py_ssize_t pos=0;
+ while(PyDict_Next(self->fields, &pos, &key, &value)) {
+ if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset,
+ &title)) return -1;
+ if (!_arraydescr_isnative(new)) return 0;
}
- return 1;
+ }
+ return 1;
}
/* return Py_True if this data-type descriptor
@@ -10916,99 +10915,99 @@ _arraydescr_isnative(PyArray_Descr *self)
static PyObject *
arraydescr_isnative_get(PyArray_Descr *self)
{
- PyObject *ret;
- int retval;
- retval = _arraydescr_isnative(self);
- if (retval == -1) return NULL;
- ret = (retval ? Py_True : Py_False);
- Py_INCREF(ret);
- return ret;
+ PyObject *ret;
+ int retval;
+ retval = _arraydescr_isnative(self);
+ if (retval == -1) return NULL;
+ ret = (retval ? Py_True : Py_False);
+ Py_INCREF(ret);
+ return ret;
}
static PyObject *
arraydescr_fields_get(PyArray_Descr *self)
{
- if (self->names == NULL) {
- Py_INCREF(Py_None);
- return Py_None;
- }
- return PyDictProxy_New(self->fields);
+ if (self->names == NULL) {
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
+ return PyDictProxy_New(self->fields);
}
static PyObject *
arraydescr_hasobject_get(PyArray_Descr *self)
{
- PyObject *res;
- if (PyDataType_FLAGCHK(self, NPY_ITEM_HASOBJECT))
- res = Py_True;
- else
- res = Py_False;
- Py_INCREF(res);
- return res;
+ PyObject *res;
+ if (PyDataType_FLAGCHK(self, NPY_ITEM_HASOBJECT))
+ res = Py_True;
+ else
+ res = Py_False;
+ Py_INCREF(res);
+ return res;
}
static PyGetSetDef arraydescr_getsets[] = {
- {"subdtype",
- (getter)arraydescr_subdescr_get,
- NULL, NULL},
- {"descr",
- (getter)arraydescr_protocol_descr_get,
- NULL, NULL},
- {"str",
- (getter)arraydescr_protocol_typestr_get,
- NULL, NULL},
- {"name",
- (getter)arraydescr_typename_get,
- NULL, NULL},
- {"base",
- (getter)arraydescr_base_get,
- NULL, NULL},
- {"shape",
- (getter)arraydescr_shape_get,
- NULL, NULL},
- {"isbuiltin",
- (getter)arraydescr_isbuiltin_get,
- NULL, NULL},
- {"isnative",
- (getter)arraydescr_isnative_get,
- NULL, NULL},
- {"fields",
- (getter)arraydescr_fields_get,
- NULL, NULL},
- {"hasobject",
- (getter)arraydescr_hasobject_get,
- NULL, NULL},
- {NULL, NULL, NULL, NULL},
+ {"subdtype",
+ (getter)arraydescr_subdescr_get,
+ NULL, NULL},
+ {"descr",
+ (getter)arraydescr_protocol_descr_get,
+ NULL, NULL},
+ {"str",
+ (getter)arraydescr_protocol_typestr_get,
+ NULL, NULL},
+ {"name",
+ (getter)arraydescr_typename_get,
+ NULL, NULL},
+ {"base",
+ (getter)arraydescr_base_get,
+ NULL, NULL},
+ {"shape",
+ (getter)arraydescr_shape_get,
+ NULL, NULL},
+ {"isbuiltin",
+ (getter)arraydescr_isbuiltin_get,
+ NULL, NULL},
+ {"isnative",
+ (getter)arraydescr_isnative_get,
+ NULL, NULL},
+ {"fields",
+ (getter)arraydescr_fields_get,
+ NULL, NULL},
+ {"hasobject",
+ (getter)arraydescr_hasobject_get,
+ NULL, NULL},
+ {NULL, NULL, NULL, NULL},
};
static PyObject *
arraydescr_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds)
{
- PyObject *odescr;
- PyArray_Descr *descr, *conv;
- Bool align=FALSE;
- Bool copy=FALSE;
- static char *kwlist[] = {"dtype", "align", "copy", NULL};
+ PyObject *odescr;
+ PyArray_Descr *descr, *conv;
+ Bool align=FALSE;
+ Bool copy=FALSE;
+ static char *kwlist[] = {"dtype", "align", "copy", NULL};
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O&O&",
- kwlist, &odescr,
- PyArray_BoolConverter, &align,
- PyArray_BoolConverter, &copy))
- return NULL;
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O&O&",
+ kwlist, &odescr,
+ PyArray_BoolConverter, &align,
+ PyArray_BoolConverter, &copy))
+ return NULL;
- if (align) {
- if (!PyArray_DescrAlignConverter(odescr, &conv))
- return NULL;
- }
- else if (!PyArray_DescrConverter(odescr, &conv))
- return NULL;
- /* Get a new copy of it unless it's already a copy */
- if (copy && conv->fields == Py_None) {
- descr = PyArray_DescrNew(conv);
- Py_DECREF(conv);
- conv = descr;
- }
- return (PyObject *)conv;
+ if (align) {
+ if (!PyArray_DescrAlignConverter(odescr, &conv))
+ return NULL;
+ }
+ else if (!PyArray_DescrConverter(odescr, &conv))
+ return NULL;
+ /* Get a new copy of it unless it's already a copy */
+ if (copy && conv->fields == Py_None) {
+ descr = PyArray_DescrNew(conv);
+ Py_DECREF(conv);
+ conv = descr;
+ }
+ return (PyObject *)conv;
}
@@ -11016,104 +11015,104 @@ arraydescr_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds)
static PyObject *
arraydescr_reduce(PyArray_Descr *self, PyObject *args)
{
- /* version number of this pickle type. Increment if we need to
- change the format. Be sure to handle the old versions in
- arraydescr_setstate. */
- const int version = 3;
- PyObject *ret, *mod, *obj;
- PyObject *state;
- char endian;
- int elsize, alignment;
-
- ret = PyTuple_New(3);
- if (ret == NULL) return NULL;
- mod = PyImport_ImportModule("numpy.core.multiarray");
- if (mod == NULL) {Py_DECREF(ret); return NULL;}
- obj = PyObject_GetAttrString(mod, "dtype");
- Py_DECREF(mod);
- if (obj == NULL) {Py_DECREF(ret); return NULL;}
- PyTuple_SET_ITEM(ret, 0, obj);
- if (PyTypeNum_ISUSERDEF(self->type_num) || \
- ((self->type_num == PyArray_VOID && \
- self->typeobj != &PyVoidArrType_Type))) {
- obj = (PyObject *)self->typeobj;
- Py_INCREF(obj);
- }
- else {
- elsize = self->elsize;
- if (self->type_num == PyArray_UNICODE) {
- elsize >>= 2;
- }
- obj = PyString_FromFormat("%c%d",self->kind, elsize);
- }
- PyTuple_SET_ITEM(ret, 1, Py_BuildValue("(Nii)", obj, 0, 1));
-
- /* Now return the state which is at least
- byteorder, subarray, and fields */
- endian = self->byteorder;
- if (endian == '=') {
- endian = '<';
- if (!PyArray_IsNativeByteOrder(endian)) endian = '>';
- }
- state = PyTuple_New(8);
- PyTuple_SET_ITEM(state, 0, PyInt_FromLong(version));
- PyTuple_SET_ITEM(state, 1, PyString_FromFormat("%c", endian));
- PyTuple_SET_ITEM(state, 2, arraydescr_subdescr_get(self));
- if (self->names) {
- Py_INCREF(self->names);
- Py_INCREF(self->fields);
- PyTuple_SET_ITEM(state, 3, self->names);
- PyTuple_SET_ITEM(state, 4, self->fields);
- }
- else {
- PyTuple_SET_ITEM(state, 3, Py_None);
- PyTuple_SET_ITEM(state, 4, Py_None);
- Py_INCREF(Py_None);
- Py_INCREF(Py_None);
+ /* version number of this pickle type. Increment if we need to
+ change the format. Be sure to handle the old versions in
+ arraydescr_setstate. */
+ const int version = 3;
+ PyObject *ret, *mod, *obj;
+ PyObject *state;
+ char endian;
+ int elsize, alignment;
+
+ ret = PyTuple_New(3);
+ if (ret == NULL) return NULL;
+ mod = PyImport_ImportModule("numpy.core.multiarray");
+ if (mod == NULL) {Py_DECREF(ret); return NULL;}
+ obj = PyObject_GetAttrString(mod, "dtype");
+ Py_DECREF(mod);
+ if (obj == NULL) {Py_DECREF(ret); return NULL;}
+ PyTuple_SET_ITEM(ret, 0, obj);
+ if (PyTypeNum_ISUSERDEF(self->type_num) || \
+ ((self->type_num == PyArray_VOID && \
+ self->typeobj != &PyVoidArrType_Type))) {
+ obj = (PyObject *)self->typeobj;
+ Py_INCREF(obj);
+ }
+ else {
+ elsize = self->elsize;
+ if (self->type_num == PyArray_UNICODE) {
+ elsize >>= 2;
}
+ obj = PyString_FromFormat("%c%d",self->kind, elsize);
+ }
+ PyTuple_SET_ITEM(ret, 1, Py_BuildValue("(Nii)", obj, 0, 1));
+
+ /* Now return the state which is at least
+ byteorder, subarray, and fields */
+ endian = self->byteorder;
+ if (endian == '=') {
+ endian = '<';
+ if (!PyArray_IsNativeByteOrder(endian)) endian = '>';
+ }
+ state = PyTuple_New(8);
+ PyTuple_SET_ITEM(state, 0, PyInt_FromLong(version));
+ PyTuple_SET_ITEM(state, 1, PyString_FromFormat("%c", endian));
+ PyTuple_SET_ITEM(state, 2, arraydescr_subdescr_get(self));
+ if (self->names) {
+ Py_INCREF(self->names);
+ Py_INCREF(self->fields);
+ PyTuple_SET_ITEM(state, 3, self->names);
+ PyTuple_SET_ITEM(state, 4, self->fields);
+ }
+ else {
+ PyTuple_SET_ITEM(state, 3, Py_None);
+ PyTuple_SET_ITEM(state, 4, Py_None);
+ Py_INCREF(Py_None);
+ Py_INCREF(Py_None);
+ }
- /* for extended types it also includes elsize and alignment */
- if (PyTypeNum_ISEXTENDED(self->type_num)) {
- elsize = self->elsize;
- alignment = self->alignment;
- }
- else {elsize = -1; alignment = -1;}
+ /* for extended types it also includes elsize and alignment */
+ if (PyTypeNum_ISEXTENDED(self->type_num)) {
+ elsize = self->elsize;
+ alignment = self->alignment;
+ }
+ else {elsize = -1; alignment = -1;}
- PyTuple_SET_ITEM(state, 5, PyInt_FromLong(elsize));
- PyTuple_SET_ITEM(state, 6, PyInt_FromLong(alignment));
- PyTuple_SET_ITEM(state, 7, PyInt_FromLong(self->hasobject));
+ PyTuple_SET_ITEM(state, 5, PyInt_FromLong(elsize));
+ PyTuple_SET_ITEM(state, 6, PyInt_FromLong(alignment));
+ PyTuple_SET_ITEM(state, 7, PyInt_FromLong(self->hasobject));
- PyTuple_SET_ITEM(ret, 2, state);
- return ret;
+ PyTuple_SET_ITEM(ret, 2, state);
+ return ret;
}
/* returns 1 if this data-type has an object portion
used when setting the state because hasobject is not stored.
- */
+*/
static int
_descr_find_object(PyArray_Descr *self)
{
- if (self->hasobject || self->type_num == PyArray_OBJECT ||
- self->kind == 'O')
+ if (self->hasobject || self->type_num == PyArray_OBJECT ||
+ self->kind == 'O')
+ return NPY_OBJECT_DTYPE_FLAGS;
+ if (PyDescr_HASFIELDS(self)) {
+ PyObject *key, *value, *title=NULL;
+ PyArray_Descr *new;
+ int offset;
+ Py_ssize_t pos=0;
+ while (PyDict_Next(self->fields, &pos, &key, &value)) {
+ if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset,
+ &title)) {
+ PyErr_Clear();
+ return 0;
+ }
+ if (_descr_find_object(new)) {
+ new->hasobject = NPY_OBJECT_DTYPE_FLAGS;
return NPY_OBJECT_DTYPE_FLAGS;
- if (PyDescr_HASFIELDS(self)) {
- PyObject *key, *value, *title=NULL;
- PyArray_Descr *new;
- int offset;
- Py_ssize_t pos=0;
- while (PyDict_Next(self->fields, &pos, &key, &value)) {
- if (!PyArg_ParseTuple(value, "Oi|O", &new, &offset,
- &title)) {
- PyErr_Clear();
- return 0;
- }
- if (_descr_find_object(new)) {
- new->hasobject = NPY_OBJECT_DTYPE_FLAGS;
- return NPY_OBJECT_DTYPE_FLAGS;
- }
- }
+ }
}
- return 0;
+ }
+ return 0;
}
/* state is at least byteorder, subarray, and fields but could include elsize
@@ -11123,373 +11122,373 @@ _descr_find_object(PyArray_Descr *self)
static PyObject *
arraydescr_setstate(PyArray_Descr *self, PyObject *args)
{
- int elsize = -1, alignment = -1;
- int version = 3;
- char endian;
- PyObject *subarray, *fields, *names=NULL;
- int incref_names = 1;
- int dtypeflags=0;
+ int elsize = -1, alignment = -1;
+ int version = 3;
+ char endian;
+ PyObject *subarray, *fields, *names=NULL;
+ int incref_names = 1;
+ int dtypeflags=0;
- if (self->fields == Py_None) {Py_INCREF(Py_None); return Py_None;}
+ if (self->fields == Py_None) {Py_INCREF(Py_None); return Py_None;}
- if (PyTuple_GET_SIZE(args) != 1 ||
- !(PyTuple_Check(PyTuple_GET_ITEM(args, 0)))) {
- PyErr_BadInternalCall();
- return NULL;
+ if (PyTuple_GET_SIZE(args) != 1 ||
+ !(PyTuple_Check(PyTuple_GET_ITEM(args, 0)))) {
+ PyErr_BadInternalCall();
+ return NULL;
+ }
+ switch (PyTuple_GET_SIZE(PyTuple_GET_ITEM(args,0))) {
+ case 8:
+ if (!PyArg_ParseTuple(args, "(icOOOiii)", &version, &endian,
+ &subarray, &names, &fields, &elsize,
+ &alignment, &dtypeflags)) {
+ return NULL;
}
- switch (PyTuple_GET_SIZE(PyTuple_GET_ITEM(args,0))) {
- case 8:
- if (!PyArg_ParseTuple(args, "(icOOOiii)", &version, &endian,
- &subarray, &names, &fields, &elsize,
- &alignment, &dtypeflags)) {
- return NULL;
- }
- break;
- case 7:
- if (!PyArg_ParseTuple(args, "(icOOOii)", &version, &endian,
- &subarray, &names, &fields, &elsize,
- &alignment)) {
- return NULL;
- }
- break;
- case 6:
- if (!PyArg_ParseTuple(args, "(icOOii)", &version,
- &endian, &subarray, &fields,
- &elsize, &alignment)) {
- PyErr_Clear();
- }
- break;
- case 5:
- version = 0;
- if (!PyArg_ParseTuple(args, "(cOOii)",
- &endian, &subarray, &fields, &elsize,
- &alignment)) {
- return NULL;
- }
- break;
- default:
- version = -1; /* raise an error */
+ break;
+ case 7:
+ if (!PyArg_ParseTuple(args, "(icOOOii)", &version, &endian,
+ &subarray, &names, &fields, &elsize,
+ &alignment)) {
+ return NULL;
}
-
- /* If we ever need another pickle format, increment the version
- number. But we should still be able to handle the old versions.
- */
- if (version < 0 || version > 3) {
- PyErr_Format(PyExc_ValueError,
- "can't handle version %d of numpy.dtype pickle",
- version);
+ break;
+ case 6:
+ if (!PyArg_ParseTuple(args, "(icOOii)", &version,
+ &endian, &subarray, &fields,
+ &elsize, &alignment)) {
+ PyErr_Clear();
+ }
+ break;
+ case 5:
+ version = 0;
+ if (!PyArg_ParseTuple(args, "(cOOii)",
+ &endian, &subarray, &fields, &elsize,
+ &alignment)) {
return NULL;
}
+ break;
+ default:
+ version = -1; /* raise an error */
+ }
- if (version == 1 || version == 0) {
- if (fields != Py_None) {
- PyObject *key, *list;
- key = PyInt_FromLong(-1);
- list = PyDict_GetItem(fields, key);
- if (!list) return NULL;
- Py_INCREF(list);
- names = list;
- PyDict_DelItem(fields, key);
- incref_names = 0;
- }
- else {
- names = Py_None;
- }
+ /* If we ever need another pickle format, increment the version
+ number. But we should still be able to handle the old versions.
+ */
+ if (version < 0 || version > 3) {
+ PyErr_Format(PyExc_ValueError,
+ "can't handle version %d of numpy.dtype pickle",
+ version);
+ return NULL;
+ }
+
+ if (version == 1 || version == 0) {
+ if (fields != Py_None) {
+ PyObject *key, *list;
+ key = PyInt_FromLong(-1);
+ list = PyDict_GetItem(fields, key);
+ if (!list) return NULL;
+ Py_INCREF(list);
+ names = list;
+ PyDict_DelItem(fields, key);
+ incref_names = 0;
+ }
+ else {
+ names = Py_None;
}
+ }
- if ((fields == Py_None && names != Py_None) || \
- (names == Py_None && fields != Py_None)) {
- PyErr_Format(PyExc_ValueError,
- "inconsistent fields and names");
- return NULL;
- }
+ if ((fields == Py_None && names != Py_None) || \
+ (names == Py_None && fields != Py_None)) {
+ PyErr_Format(PyExc_ValueError,
+ "inconsistent fields and names");
+ return NULL;
+ }
- if (endian != '|' &&
- PyArray_IsNativeByteOrder(endian)) endian = '=';
+ if (endian != '|' &&
+ PyArray_IsNativeByteOrder(endian)) endian = '=';
- self->byteorder = endian;
- if (self->subarray) {
- Py_XDECREF(self->subarray->base);
- Py_XDECREF(self->subarray->shape);
- _pya_free(self->subarray);
- }
- self->subarray = NULL;
+ self->byteorder = endian;
+ if (self->subarray) {
+ Py_XDECREF(self->subarray->base);
+ Py_XDECREF(self->subarray->shape);
+ _pya_free(self->subarray);
+ }
+ self->subarray = NULL;
- if (subarray != Py_None) {
- self->subarray = _pya_malloc(sizeof(PyArray_ArrayDescr));
- self->subarray->base = (PyArray_Descr *)PyTuple_GET_ITEM(subarray, 0);
- Py_INCREF(self->subarray->base);
- self->subarray->shape = PyTuple_GET_ITEM(subarray, 1);
- Py_INCREF(self->subarray->shape);
- }
+ if (subarray != Py_None) {
+ self->subarray = _pya_malloc(sizeof(PyArray_ArrayDescr));
+ self->subarray->base = (PyArray_Descr *)PyTuple_GET_ITEM(subarray, 0);
+ Py_INCREF(self->subarray->base);
+ self->subarray->shape = PyTuple_GET_ITEM(subarray, 1);
+ Py_INCREF(self->subarray->shape);
+ }
- if (fields != Py_None) {
- Py_XDECREF(self->fields);
- self->fields = fields;
- Py_INCREF(fields);
- Py_XDECREF(self->names);
- self->names = names;
- if (incref_names)
- Py_INCREF(names);
- }
+ if (fields != Py_None) {
+ Py_XDECREF(self->fields);
+ self->fields = fields;
+ Py_INCREF(fields);
+ Py_XDECREF(self->names);
+ self->names = names;
+ if (incref_names)
+ Py_INCREF(names);
+ }
- if (PyTypeNum_ISEXTENDED(self->type_num)) {
- self->elsize = elsize;
- self->alignment = alignment;
- }
+ if (PyTypeNum_ISEXTENDED(self->type_num)) {
+ self->elsize = elsize;
+ self->alignment = alignment;
+ }
- self->hasobject = dtypeflags;
- if (version < 3) {
- self->hasobject = _descr_find_object(self);
- }
- Py_INCREF(Py_None);
- return Py_None;
+ self->hasobject = dtypeflags;
+ if (version < 3) {
+ self->hasobject = _descr_find_object(self);
+ }
+ Py_INCREF(Py_None);
+ return Py_None;
}
/* returns a copy of the PyArray_Descr structure with the byteorder
altered:
- no arguments: The byteorder is swapped (in all subfields as well)
- single argument: The byteorder is forced to the given state
- (in all subfields as well)
+ no arguments: The byteorder is swapped (in all subfields as well)
+ single argument: The byteorder is forced to the given state
+ (in all subfields as well)
- Valid states: ('big', '>') or ('little' or '<')
- ('native', or '=')
+ Valid states: ('big', '>') or ('little' or '<')
+ ('native', or '=')
- If a descr structure with | is encountered it's own
- byte-order is not changed but any fields are:
+ If a descr structure with | is encountered it's own
+ byte-order is not changed but any fields are:
*/
/*OBJECT_API
Deep bytorder change of a data-type descriptor
*** Leaves reference count of self unchanged --- does not DECREF self ***
-*/
+ */
static PyArray_Descr *
PyArray_DescrNewByteorder(PyArray_Descr *self, char newendian)
{
- PyArray_Descr *new;
- char endian;
-
- new = PyArray_DescrNew(self);
- endian = new->byteorder;
- if (endian != PyArray_IGNORE) {
- if (newendian == PyArray_SWAP) { /* swap byteorder */
- if PyArray_ISNBO(endian) endian = PyArray_OPPBYTE;
- else endian = PyArray_NATBYTE;
- new->byteorder = endian;
- }
- else if (newendian != PyArray_IGNORE) {
- new->byteorder = newendian;
- }
+ PyArray_Descr *new;
+ char endian;
+
+ new = PyArray_DescrNew(self);
+ endian = new->byteorder;
+ if (endian != PyArray_IGNORE) {
+ if (newendian == PyArray_SWAP) { /* swap byteorder */
+ if PyArray_ISNBO(endian) endian = PyArray_OPPBYTE;
+ else endian = PyArray_NATBYTE;
+ new->byteorder = endian;
}
- if (new->names) {
- PyObject *newfields;
- PyObject *key, *value;
- PyObject *newvalue;
- PyObject *old;
- PyArray_Descr *newdescr;
- Py_ssize_t pos = 0;
- int len, i;
- newfields = PyDict_New();
- /* make new dictionary with replaced */
- /* PyArray_Descr Objects */
- while(PyDict_Next(self->fields, &pos, &key, &value)) {
- if (!PyString_Check(key) || \
- !PyTuple_Check(value) || \
- ((len=PyTuple_GET_SIZE(value)) < 2))
- continue;
-
- old = PyTuple_GET_ITEM(value, 0);
- if (!PyArray_DescrCheck(old)) continue;
- newdescr = PyArray_DescrNewByteorder \
- ((PyArray_Descr *)old, newendian);
- if (newdescr == NULL) {
- Py_DECREF(newfields); Py_DECREF(new);
- return NULL;
- }
- newvalue = PyTuple_New(len);
- PyTuple_SET_ITEM(newvalue, 0, \
- (PyObject *)newdescr);
- for(i=1; i<len; i++) {
- old = PyTuple_GET_ITEM(value, i);
- Py_INCREF(old);
- PyTuple_SET_ITEM(newvalue, i, old);
- }
- PyDict_SetItem(newfields, key, newvalue);
- Py_DECREF(newvalue);
- }
- Py_DECREF(new->fields);
- new->fields = newfields;
+ else if (newendian != PyArray_IGNORE) {
+ new->byteorder = newendian;
}
- if (new->subarray) {
- Py_DECREF(new->subarray->base);
- new->subarray->base = PyArray_DescrNewByteorder \
- (self->subarray->base, newendian);
+ }
+ if (new->names) {
+ PyObject *newfields;
+ PyObject *key, *value;
+ PyObject *newvalue;
+ PyObject *old;
+ PyArray_Descr *newdescr;
+ Py_ssize_t pos = 0;
+ int len, i;
+ newfields = PyDict_New();
+ /* make new dictionary with replaced */
+ /* PyArray_Descr Objects */
+ while(PyDict_Next(self->fields, &pos, &key, &value)) {
+ if (!PyString_Check(key) || \
+ !PyTuple_Check(value) || \
+ ((len=PyTuple_GET_SIZE(value)) < 2))
+ continue;
+
+ old = PyTuple_GET_ITEM(value, 0);
+ if (!PyArray_DescrCheck(old)) continue;
+ newdescr = PyArray_DescrNewByteorder \
+ ((PyArray_Descr *)old, newendian);
+ if (newdescr == NULL) {
+ Py_DECREF(newfields); Py_DECREF(new);
+ return NULL;
+ }
+ newvalue = PyTuple_New(len);
+ PyTuple_SET_ITEM(newvalue, 0, \
+ (PyObject *)newdescr);
+ for(i=1; i<len; i++) {
+ old = PyTuple_GET_ITEM(value, i);
+ Py_INCREF(old);
+ PyTuple_SET_ITEM(newvalue, i, old);
+ }
+ PyDict_SetItem(newfields, key, newvalue);
+ Py_DECREF(newvalue);
}
- return new;
+ Py_DECREF(new->fields);
+ new->fields = newfields;
+ }
+ if (new->subarray) {
+ Py_DECREF(new->subarray->base);
+ new->subarray->base = PyArray_DescrNewByteorder \
+ (self->subarray->base, newendian);
+ }
+ return new;
}
static PyObject *
arraydescr_newbyteorder(PyArray_Descr *self, PyObject *args)
{
- char endian=PyArray_SWAP;
+ char endian=PyArray_SWAP;
- if (!PyArg_ParseTuple(args, "|O&", PyArray_ByteorderConverter,
- &endian)) return NULL;
+ if (!PyArg_ParseTuple(args, "|O&", PyArray_ByteorderConverter,
+ &endian)) return NULL;
- return (PyObject *)PyArray_DescrNewByteorder(self, endian);
+ return (PyObject *)PyArray_DescrNewByteorder(self, endian);
}
static PyMethodDef arraydescr_methods[] = {
- /* for pickling */
- {"__reduce__", (PyCFunction)arraydescr_reduce, METH_VARARGS,
- NULL},
- {"__setstate__", (PyCFunction)arraydescr_setstate, METH_VARARGS,
- NULL},
- {"newbyteorder", (PyCFunction)arraydescr_newbyteorder, METH_VARARGS,
- NULL},
- {NULL, NULL} /* sentinel */
+ /* for pickling */
+ {"__reduce__", (PyCFunction)arraydescr_reduce, METH_VARARGS,
+ NULL},
+ {"__setstate__", (PyCFunction)arraydescr_setstate, METH_VARARGS,
+ NULL},
+ {"newbyteorder", (PyCFunction)arraydescr_newbyteorder, METH_VARARGS,
+ NULL},
+ {NULL, NULL} /* sentinel */
};
static PyObject *
arraydescr_str(PyArray_Descr *self)
{
- PyObject *sub;
-
- if (self->names) {
- PyObject *lst;
- lst = arraydescr_protocol_descr_get(self);
- if (!lst) {
- sub = PyString_FromString("<err>");
- PyErr_Clear();
- }
- else sub = PyObject_Str(lst);
- Py_XDECREF(lst);
- if (self->type_num != PyArray_VOID) {
- PyObject *p;
- PyObject *t=PyString_FromString("'");
- p = arraydescr_protocol_typestr_get(self);
- PyString_Concat(&p, t);
- PyString_ConcatAndDel(&t, p);
- p = PyString_FromString("(");
- PyString_ConcatAndDel(&p, t);
- PyString_ConcatAndDel(&p, PyString_FromString(", "));
- PyString_ConcatAndDel(&p, sub);
- PyString_ConcatAndDel(&p, PyString_FromString(")"));
- sub = p;
- }
- }
- else if (self->subarray) {
- PyObject *p;
- PyObject *t = PyString_FromString("(");
- PyObject *sh;
- p = arraydescr_str(self->subarray->base);
- if (!self->subarray->base->names && !self->subarray->base->subarray) {
- PyObject *t=PyString_FromString("'");
- PyString_Concat(&p, t);
- PyString_ConcatAndDel(&t, p);
- p = t;
- }
- PyString_ConcatAndDel(&t, p);
- PyString_ConcatAndDel(&t, PyString_FromString(","));
- if (!PyTuple_Check(self->subarray->shape)) {
- sh = Py_BuildValue("(O)", self->subarray->shape);
- }
- else {
- sh = self->subarray->shape;
- Py_INCREF(sh);
- }
- PyString_ConcatAndDel(&t, PyObject_Str(sh));
- Py_DECREF(sh);
- PyString_ConcatAndDel(&t, PyString_FromString(")"));
- sub = t;
+ PyObject *sub;
+
+ if (self->names) {
+ PyObject *lst;
+ lst = arraydescr_protocol_descr_get(self);
+ if (!lst) {
+ sub = PyString_FromString("<err>");
+ PyErr_Clear();
+ }
+ else sub = PyObject_Str(lst);
+ Py_XDECREF(lst);
+ if (self->type_num != PyArray_VOID) {
+ PyObject *p;
+ PyObject *t=PyString_FromString("'");
+ p = arraydescr_protocol_typestr_get(self);
+ PyString_Concat(&p, t);
+ PyString_ConcatAndDel(&t, p);
+ p = PyString_FromString("(");
+ PyString_ConcatAndDel(&p, t);
+ PyString_ConcatAndDel(&p, PyString_FromString(", "));
+ PyString_ConcatAndDel(&p, sub);
+ PyString_ConcatAndDel(&p, PyString_FromString(")"));
+ sub = p;
}
- else if (PyDataType_ISFLEXIBLE(self) || !PyArray_ISNBO(self->byteorder)) {
- sub = arraydescr_protocol_typestr_get(self);
+ }
+ else if (self->subarray) {
+ PyObject *p;
+ PyObject *t = PyString_FromString("(");
+ PyObject *sh;
+ p = arraydescr_str(self->subarray->base);
+ if (!self->subarray->base->names && !self->subarray->base->subarray) {
+ PyObject *t=PyString_FromString("'");
+ PyString_Concat(&p, t);
+ PyString_ConcatAndDel(&t, p);
+ p = t;
+ }
+ PyString_ConcatAndDel(&t, p);
+ PyString_ConcatAndDel(&t, PyString_FromString(","));
+ if (!PyTuple_Check(self->subarray->shape)) {
+ sh = Py_BuildValue("(O)", self->subarray->shape);
}
else {
- sub = arraydescr_typename_get(self);
+ sh = self->subarray->shape;
+ Py_INCREF(sh);
}
- return sub;
+ PyString_ConcatAndDel(&t, PyObject_Str(sh));
+ Py_DECREF(sh);
+ PyString_ConcatAndDel(&t, PyString_FromString(")"));
+ sub = t;
+ }
+ else if (PyDataType_ISFLEXIBLE(self) || !PyArray_ISNBO(self->byteorder)) {
+ sub = arraydescr_protocol_typestr_get(self);
+ }
+ else {
+ sub = arraydescr_typename_get(self);
+ }
+ return sub;
}
static PyObject *
arraydescr_repr(PyArray_Descr *self)
{
- PyObject *sub, *s;
- s = PyString_FromString("dtype(");
- sub = arraydescr_str(self);
- if (!self->names && !self->subarray) {
- PyObject *t=PyString_FromString("'");
- PyString_Concat(&sub, t);
- PyString_ConcatAndDel(&t, sub);
- sub = t;
- }
- PyString_ConcatAndDel(&s, sub);
- sub = PyString_FromString(")");
- PyString_ConcatAndDel(&s, sub);
- return s;
+ PyObject *sub, *s;
+ s = PyString_FromString("dtype(");
+ sub = arraydescr_str(self);
+ if (!self->names && !self->subarray) {
+ PyObject *t=PyString_FromString("'");
+ PyString_Concat(&sub, t);
+ PyString_ConcatAndDel(&t, sub);
+ sub = t;
+ }
+ PyString_ConcatAndDel(&s, sub);
+ sub = PyString_FromString(")");
+ PyString_ConcatAndDel(&s, sub);
+ return s;
}
static PyObject *
arraydescr_richcompare(PyArray_Descr *self, PyObject *other, int cmp_op)
{
- PyArray_Descr *new=NULL;
- PyObject *result = Py_NotImplemented;
- if (!PyArray_DescrCheck(other)) {
- if (PyArray_DescrConverter(other, &new) == PY_FAIL)
- return NULL;
- }
- else {
- new = (PyArray_Descr *)other;
- Py_INCREF(new);
- }
- switch (cmp_op) {
- case Py_LT:
- if (!PyArray_EquivTypes(self, new) && PyArray_CanCastTo(self, new))
- result = Py_True;
- else
- result = Py_False;
- break;
- case Py_LE:
- if (PyArray_CanCastTo(self, new))
- result = Py_True;
- else
- result = Py_False;
- break;
- case Py_EQ:
- if (PyArray_EquivTypes(self, new))
- result = Py_True;
- else
- result = Py_False;
- break;
- case Py_NE:
- if (PyArray_EquivTypes(self, new))
- result = Py_False;
- else
- result = Py_True;
- break;
- case Py_GT:
- if (!PyArray_EquivTypes(self, new) && PyArray_CanCastTo(new, self))
- result = Py_True;
- else
- result = Py_False;
- break;
- case Py_GE:
- if (PyArray_CanCastTo(new, self))
- result = Py_True;
- else
- result = Py_False;
- break;
- default:
- result = Py_NotImplemented;
- }
+ PyArray_Descr *new=NULL;
+ PyObject *result = Py_NotImplemented;
+ if (!PyArray_DescrCheck(other)) {
+ if (PyArray_DescrConverter(other, &new) == PY_FAIL)
+ return NULL;
+ }
+ else {
+ new = (PyArray_Descr *)other;
+ Py_INCREF(new);
+ }
+ switch (cmp_op) {
+ case Py_LT:
+ if (!PyArray_EquivTypes(self, new) && PyArray_CanCastTo(self, new))
+ result = Py_True;
+ else
+ result = Py_False;
+ break;
+ case Py_LE:
+ if (PyArray_CanCastTo(self, new))
+ result = Py_True;
+ else
+ result = Py_False;
+ break;
+ case Py_EQ:
+ if (PyArray_EquivTypes(self, new))
+ result = Py_True;
+ else
+ result = Py_False;
+ break;
+ case Py_NE:
+ if (PyArray_EquivTypes(self, new))
+ result = Py_False;
+ else
+ result = Py_True;
+ break;
+ case Py_GT:
+ if (!PyArray_EquivTypes(self, new) && PyArray_CanCastTo(new, self))
+ result = Py_True;
+ else
+ result = Py_False;
+ break;
+ case Py_GE:
+ if (PyArray_CanCastTo(new, self))
+ result = Py_True;
+ else
+ result = Py_False;
+ break;
+ default:
+ result = Py_NotImplemented;
+ }
- Py_XDECREF(new);
- Py_INCREF(result);
- return result;
+ Py_XDECREF(new);
+ Py_INCREF(result);
+ return result;
}
/*************************************************************************
@@ -11500,194 +11499,194 @@ static Py_ssize_t
descr_length(PyObject *self0)
{
- PyArray_Descr *self = (PyArray_Descr *)self0;
+ PyArray_Descr *self = (PyArray_Descr *)self0;
- if (self->names)
- return PyTuple_GET_SIZE(self->names);
- else return 0;
+ if (self->names)
+ return PyTuple_GET_SIZE(self->names);
+ else return 0;
}
static PyObject *
descr_repeat(PyObject *self, Py_ssize_t length)
{
- PyObject *tup;
- PyArray_Descr *new;
- if (length < 0)
- return PyErr_Format(PyExc_ValueError,
+ PyObject *tup;
+ PyArray_Descr *new;
+ if (length < 0)
+ return PyErr_Format(PyExc_ValueError,
#if (PY_VERSION_HEX < 0x02050000)
- "Array length must be >= 0, not %d",
+ "Array length must be >= 0, not %d",
#else
- "Array length must be >= 0, not %zd",
+ "Array length must be >= 0, not %zd",
#endif
- length);
- tup = Py_BuildValue("O" NPY_SSIZE_T_PYFMT, self, length);
- if (tup == NULL) return NULL;
- PyArray_DescrConverter(tup, &new);
- Py_DECREF(tup);
- return (PyObject *)new;
+ length);
+ tup = Py_BuildValue("O" NPY_SSIZE_T_PYFMT, self, length);
+ if (tup == NULL) return NULL;
+ PyArray_DescrConverter(tup, &new);
+ Py_DECREF(tup);
+ return (PyObject *)new;
}
static PyObject *
descr_subscript(PyArray_Descr *self, PyObject *op)
{
- if (self->names) {
- if (PyString_Check(op) || PyUnicode_Check(op)) {
- PyObject *obj;
- obj = PyDict_GetItem(self->fields, op);
- if (obj != NULL) {
- PyObject *descr;
- descr = PyTuple_GET_ITEM(obj, 0);
- Py_INCREF(descr);
- return descr;
- }
- else {
- PyErr_Format(PyExc_KeyError,
- "field named \'%s\' not found.",
- PyString_AsString(op));
- }
- }
- else {
- PyObject *name;
- int value;
- value = PyArray_PyIntAsInt(op);
- if (!PyErr_Occurred()) {
- int size;
- size = PyTuple_GET_SIZE(self->names);
- if (value < 0) value += size;
- if (value < 0 || value >= size) {
- PyErr_Format(PyExc_IndexError,
- "0<=index<%d not %d",
- size, value);
- return NULL;
- }
- name = PyTuple_GET_ITEM(self->names, value);
- return descr_subscript(self, name);
- }
- }
- PyErr_SetString(PyExc_ValueError,
- "only integers, strings or unicode values "
- "allowed for getting fields.");
+ if (self->names) {
+ if (PyString_Check(op) || PyUnicode_Check(op)) {
+ PyObject *obj;
+ obj = PyDict_GetItem(self->fields, op);
+ if (obj != NULL) {
+ PyObject *descr;
+ descr = PyTuple_GET_ITEM(obj, 0);
+ Py_INCREF(descr);
+ return descr;
+ }
+ else {
+ PyErr_Format(PyExc_KeyError,
+ "field named \'%s\' not found.",
+ PyString_AsString(op));
+ }
}
else {
- PyObject *astr;
- astr = arraydescr_str(self);
- PyErr_Format(PyExc_KeyError,
- "there are no fields in dtype %s.",
- PyString_AsString(astr));
- Py_DECREF(astr);
+ PyObject *name;
+ int value;
+ value = PyArray_PyIntAsInt(op);
+ if (!PyErr_Occurred()) {
+ int size;
+ size = PyTuple_GET_SIZE(self->names);
+ if (value < 0) value += size;
+ if (value < 0 || value >= size) {
+ PyErr_Format(PyExc_IndexError,
+ "0<=index<%d not %d",
+ size, value);
+ return NULL;
+ }
+ name = PyTuple_GET_ITEM(self->names, value);
+ return descr_subscript(self, name);
+ }
}
- return NULL;
+ PyErr_SetString(PyExc_ValueError,
+ "only integers, strings or unicode values "
+ "allowed for getting fields.");
+ }
+ else {
+ PyObject *astr;
+ astr = arraydescr_str(self);
+ PyErr_Format(PyExc_KeyError,
+ "there are no fields in dtype %s.",
+ PyString_AsString(astr));
+ Py_DECREF(astr);
+ }
+ return NULL;
}
static PySequenceMethods descr_as_sequence = {
- descr_length,
- (binaryfunc)NULL,
- descr_repeat,
+ descr_length,
+ (binaryfunc)NULL,
+ descr_repeat,
};
static PyMappingMethods descr_as_mapping = {
- descr_length, /*mp_length*/
- (binaryfunc)descr_subscript, /*mp_subscript*/
- (objobjargproc)NULL, /*mp_ass_subscript*/
+ descr_length, /*mp_length*/
+ (binaryfunc)descr_subscript, /*mp_subscript*/
+ (objobjargproc)NULL, /*mp_ass_subscript*/
};
/****************** End of Mapping Protocol ******************************/
static PyTypeObject PyArrayDescr_Type = {
- PyObject_HEAD_INIT(NULL)
- 0, /* ob_size */
- "numpy.dtype", /* tp_name */
- sizeof(PyArray_Descr), /* tp_basicsize */
- 0, /* tp_itemsize */
- /* methods */
- (destructor)arraydescr_dealloc, /* tp_dealloc */
- 0, /* tp_print */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- 0, /* tp_compare */
- (reprfunc)arraydescr_repr, /* tp_repr */
- 0, /* tp_as_number */
- &descr_as_sequence, /* tp_as_sequence */
- &descr_as_mapping, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- (reprfunc)arraydescr_str, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
- 0, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- (richcmpfunc)arraydescr_richcompare, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- arraydescr_methods, /* tp_methods */
- arraydescr_members, /* tp_members */
- arraydescr_getsets, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- 0, /* tp_alloc */
- arraydescr_new, /* tp_new */
- 0, /* tp_free */
- 0, /* tp_is_gc */
- 0, /* tp_bases */
- 0, /* tp_mro */
- 0, /* tp_cache */
- 0, /* tp_subclasses */
- 0 /* tp_weaklist */
+ PyObject_HEAD_INIT(NULL)
+ 0, /* ob_size */
+ "numpy.dtype", /* tp_name */
+ sizeof(PyArray_Descr), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ /* methods */
+ (destructor)arraydescr_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_compare */
+ (reprfunc)arraydescr_repr, /* tp_repr */
+ 0, /* tp_as_number */
+ &descr_as_sequence, /* tp_as_sequence */
+ &descr_as_mapping, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ (reprfunc)arraydescr_str, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ 0, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ (richcmpfunc)arraydescr_richcompare, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ arraydescr_methods, /* tp_methods */
+ arraydescr_members, /* tp_members */
+ arraydescr_getsets, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ arraydescr_new, /* tp_new */
+ 0, /* tp_free */
+ 0, /* tp_is_gc */
+ 0, /* tp_bases */
+ 0, /* tp_mro */
+ 0, /* tp_cache */
+ 0, /* tp_subclasses */
+ 0 /* tp_weaklist */
};
/** Array Flags Object **/
/*OBJECT_API
- Get New ArrayFlagsObject
+ Get New ArrayFlagsObject
*/
static PyObject *
PyArray_NewFlagsObject(PyObject *obj)
{
- PyObject *flagobj;
- int flags;
- if (obj == NULL) {
- flags = CONTIGUOUS | OWNDATA | FORTRAN | ALIGNED;
- }
- else {
- flags = PyArray_FLAGS(obj);
- }
- flagobj = PyArrayFlags_Type.tp_alloc(&PyArrayFlags_Type, 0);
- if (flagobj == NULL) return NULL;
- Py_XINCREF(obj);
- ((PyArrayFlagsObject *)flagobj)->arr = obj;
- ((PyArrayFlagsObject *)flagobj)->flags = flags;
+ PyObject *flagobj;
+ int flags;
+ if (obj == NULL) {
+ flags = CONTIGUOUS | OWNDATA | FORTRAN | ALIGNED;
+ }
+ else {
+ flags = PyArray_FLAGS(obj);
+ }
+ flagobj = PyArrayFlags_Type.tp_alloc(&PyArrayFlags_Type, 0);
+ if (flagobj == NULL) return NULL;
+ Py_XINCREF(obj);
+ ((PyArrayFlagsObject *)flagobj)->arr = obj;
+ ((PyArrayFlagsObject *)flagobj)->flags = flags;
- return flagobj;
+ return flagobj;
}
static void
arrayflags_dealloc(PyArrayFlagsObject *self)
{
- Py_XDECREF(self->arr);
- self->ob_type->tp_free((PyObject *)self);
+ Py_XDECREF(self->arr);
+ self->ob_type->tp_free((PyObject *)self);
}
-#define _define_get(UPPER, lower) \
-static PyObject * \
-arrayflags_ ## lower ## _get(PyArrayFlagsObject *self) \
-{ \
- PyObject *item; \
+#define _define_get(UPPER, lower) \
+ static PyObject * \
+ arrayflags_ ## lower ## _get(PyArrayFlagsObject *self) \
+ { \
+ PyObject *item; \
item = ((self->flags & (UPPER)) == (UPPER)) ? Py_True : Py_False; \
- Py_INCREF(item); \
- return item; \
-}
+ Py_INCREF(item); \
+ return item; \
+ }
_define_get(CONTIGUOUS, contiguous)
_define_get(FORTRAN, fortran)
@@ -11702,375 +11701,375 @@ _define_get(ALIGNED|WRITEABLE|CONTIGUOUS, carray)
static PyObject *
arrayflags_forc_get(PyArrayFlagsObject *self)
{
- PyObject *item;
+ PyObject *item;
- if (((self->flags & FORTRAN) == FORTRAN) ||
- ((self->flags & CONTIGUOUS) == CONTIGUOUS))
- item = Py_True;
- else
- item = Py_False;
+ if (((self->flags & FORTRAN) == FORTRAN) ||
+ ((self->flags & CONTIGUOUS) == CONTIGUOUS))
+ item = Py_True;
+ else
+ item = Py_False;
- Py_INCREF(item);
- return item;
+ Py_INCREF(item);
+ return item;
}
static PyObject *
arrayflags_fnc_get(PyArrayFlagsObject *self)
{
- PyObject *item;
+ PyObject *item;
- if (((self->flags & FORTRAN) == FORTRAN) &&
- !((self->flags & CONTIGUOUS) == CONTIGUOUS))
- item = Py_True;
- else
- item = Py_False;
+ if (((self->flags & FORTRAN) == FORTRAN) &&
+ !((self->flags & CONTIGUOUS) == CONTIGUOUS))
+ item = Py_True;
+ else
+ item = Py_False;
- Py_INCREF(item);
- return item;
+ Py_INCREF(item);
+ return item;
}
static PyObject *
arrayflags_farray_get(PyArrayFlagsObject *self)
{
- PyObject *item;
+ PyObject *item;
- if (((self->flags & (ALIGNED|WRITEABLE|FORTRAN)) == \
- (ALIGNED|WRITEABLE|FORTRAN)) &&
- !((self->flags & CONTIGUOUS) == CONTIGUOUS))
- item = Py_True;
- else
- item = Py_False;
+ if (((self->flags & (ALIGNED|WRITEABLE|FORTRAN)) == \
+ (ALIGNED|WRITEABLE|FORTRAN)) &&
+ !((self->flags & CONTIGUOUS) == CONTIGUOUS))
+ item = Py_True;
+ else
+ item = Py_False;
- Py_INCREF(item);
- return item;
+ Py_INCREF(item);
+ return item;
}
static PyObject *
arrayflags_num_get(PyArrayFlagsObject *self)
{
- return PyInt_FromLong(self->flags);
+ return PyInt_FromLong(self->flags);
}
/* relies on setflags order being write, align, uic */
static int
arrayflags_updateifcopy_set(PyArrayFlagsObject *self, PyObject *obj)
{
- PyObject *res;
- if (self->arr == NULL) {
- PyErr_SetString(PyExc_ValueError, "Cannot set flags on array scalars.");
- return -1;
- }
- res = PyObject_CallMethod(self->arr, "setflags", "OOO", Py_None, Py_None,
- (PyObject_IsTrue(obj) ? Py_True : Py_False));
- if (res == NULL) return -1;
- Py_DECREF(res);
- return 0;
+ PyObject *res;
+ if (self->arr == NULL) {
+ PyErr_SetString(PyExc_ValueError, "Cannot set flags on array scalars.");
+ return -1;
+ }
+ res = PyObject_CallMethod(self->arr, "setflags", "OOO", Py_None, Py_None,
+ (PyObject_IsTrue(obj) ? Py_True : Py_False));
+ if (res == NULL) return -1;
+ Py_DECREF(res);
+ return 0;
}
static int
arrayflags_aligned_set(PyArrayFlagsObject *self, PyObject *obj)
{
- PyObject *res;
- if (self->arr == NULL) {
- PyErr_SetString(PyExc_ValueError, "Cannot set flags on array scalars.");
- return -1;
- }
- res = PyObject_CallMethod(self->arr, "setflags", "OOO", Py_None,
- (PyObject_IsTrue(obj) ? Py_True : Py_False),
- Py_None);
- if (res == NULL) return -1;
- Py_DECREF(res);
- return 0;
+ PyObject *res;
+ if (self->arr == NULL) {
+ PyErr_SetString(PyExc_ValueError, "Cannot set flags on array scalars.");
+ return -1;
+ }
+ res = PyObject_CallMethod(self->arr, "setflags", "OOO", Py_None,
+ (PyObject_IsTrue(obj) ? Py_True : Py_False),
+ Py_None);
+ if (res == NULL) return -1;
+ Py_DECREF(res);
+ return 0;
}
static int
arrayflags_writeable_set(PyArrayFlagsObject *self, PyObject *obj)
{
- PyObject *res;
- if (self->arr == NULL) {
- PyErr_SetString(PyExc_ValueError, "Cannot set flags on array scalars.");
- return -1;
- }
- res = PyObject_CallMethod(self->arr, "setflags", "OOO",
- (PyObject_IsTrue(obj) ? Py_True : Py_False),
- Py_None, Py_None);
- if (res == NULL) return -1;
- Py_DECREF(res);
- return 0;
+ PyObject *res;
+ if (self->arr == NULL) {
+ PyErr_SetString(PyExc_ValueError, "Cannot set flags on array scalars.");
+ return -1;
+ }
+ res = PyObject_CallMethod(self->arr, "setflags", "OOO",
+ (PyObject_IsTrue(obj) ? Py_True : Py_False),
+ Py_None, Py_None);
+ if (res == NULL) return -1;
+ Py_DECREF(res);
+ return 0;
}
static PyGetSetDef arrayflags_getsets[] = {
- {"contiguous",
- (getter)arrayflags_contiguous_get,
- NULL,
- ""},
- {"c_contiguous",
- (getter)arrayflags_contiguous_get,
- NULL,
- ""},
- {"f_contiguous",
- (getter)arrayflags_fortran_get,
- NULL,
- ""},
- {"fortran",
- (getter)arrayflags_fortran_get,
- NULL,
- ""},
- {"updateifcopy",
- (getter)arrayflags_updateifcopy_get,
- (setter)arrayflags_updateifcopy_set,
- ""},
- {"owndata",
- (getter)arrayflags_owndata_get,
- NULL,
- ""},
- {"aligned",
- (getter)arrayflags_aligned_get,
- (setter)arrayflags_aligned_set,
- ""},
- {"writeable",
- (getter)arrayflags_writeable_get,
- (setter)arrayflags_writeable_set,
- ""},
- {"fnc",
- (getter)arrayflags_fnc_get,
- NULL,
- ""},
- {"forc",
- (getter)arrayflags_forc_get,
- NULL,
- ""},
- {"behaved",
- (getter)arrayflags_behaved_get,
- NULL,
- ""},
- {"carray",
- (getter)arrayflags_carray_get,
- NULL,
- ""},
- {"farray",
- (getter)arrayflags_farray_get,
- NULL,
- ""},
- {"num",
- (getter)arrayflags_num_get,
- NULL,
- ""},
- {NULL, NULL, NULL, NULL},
+ {"contiguous",
+ (getter)arrayflags_contiguous_get,
+ NULL,
+ ""},
+ {"c_contiguous",
+ (getter)arrayflags_contiguous_get,
+ NULL,
+ ""},
+ {"f_contiguous",
+ (getter)arrayflags_fortran_get,
+ NULL,
+ ""},
+ {"fortran",
+ (getter)arrayflags_fortran_get,
+ NULL,
+ ""},
+ {"updateifcopy",
+ (getter)arrayflags_updateifcopy_get,
+ (setter)arrayflags_updateifcopy_set,
+ ""},
+ {"owndata",
+ (getter)arrayflags_owndata_get,
+ NULL,
+ ""},
+ {"aligned",
+ (getter)arrayflags_aligned_get,
+ (setter)arrayflags_aligned_set,
+ ""},
+ {"writeable",
+ (getter)arrayflags_writeable_get,
+ (setter)arrayflags_writeable_set,
+ ""},
+ {"fnc",
+ (getter)arrayflags_fnc_get,
+ NULL,
+ ""},
+ {"forc",
+ (getter)arrayflags_forc_get,
+ NULL,
+ ""},
+ {"behaved",
+ (getter)arrayflags_behaved_get,
+ NULL,
+ ""},
+ {"carray",
+ (getter)arrayflags_carray_get,
+ NULL,
+ ""},
+ {"farray",
+ (getter)arrayflags_farray_get,
+ NULL,
+ ""},
+ {"num",
+ (getter)arrayflags_num_get,
+ NULL,
+ ""},
+ {NULL, NULL, NULL, NULL},
};
static PyObject *
arrayflags_getitem(PyArrayFlagsObject *self, PyObject *ind)
{
- char *key;
- int n;
- if (!PyString_Check(ind)) goto fail;
- key = PyString_AS_STRING(ind);
- n = PyString_GET_SIZE(ind);
- switch(n) {
- case 1:
- switch(key[0]) {
- case 'C':
- return arrayflags_contiguous_get(self);
- case 'F':
- return arrayflags_fortran_get(self);
- case 'W':
- return arrayflags_writeable_get(self);
- case 'B':
- return arrayflags_behaved_get(self);
- case 'O':
- return arrayflags_owndata_get(self);
- case 'A':
- return arrayflags_aligned_get(self);
- case 'U':
- return arrayflags_updateifcopy_get(self);
- default:
- goto fail;
- }
- break;
- case 2:
- if (strncmp(key, "CA", n)==0)
- return arrayflags_carray_get(self);
- if (strncmp(key, "FA", n)==0)
- return arrayflags_farray_get(self);
- break;
- case 3:
- if (strncmp(key, "FNC", n)==0)
- return arrayflags_fnc_get(self);
- break;
- case 4:
- if (strncmp(key, "FORC", n)==0)
- return arrayflags_forc_get(self);
- break;
- case 6:
- if (strncmp(key, "CARRAY", n)==0)
- return arrayflags_carray_get(self);
- if (strncmp(key, "FARRAY", n)==0)
- return arrayflags_farray_get(self);
- break;
- case 7:
- if (strncmp(key,"FORTRAN",n)==0)
- return arrayflags_fortran_get(self);
- if (strncmp(key,"BEHAVED",n)==0)
- return arrayflags_behaved_get(self);
- if (strncmp(key,"OWNDATA",n)==0)
- return arrayflags_owndata_get(self);
- if (strncmp(key,"ALIGNED",n)==0)
- return arrayflags_aligned_get(self);
- break;
- case 9:
- if (strncmp(key,"WRITEABLE",n)==0)
- return arrayflags_writeable_get(self);
- break;
- case 10:
- if (strncmp(key,"CONTIGUOUS",n)==0)
- return arrayflags_contiguous_get(self);
- break;
- case 12:
- if (strncmp(key, "UPDATEIFCOPY", n)==0)
- return arrayflags_updateifcopy_get(self);
- if (strncmp(key, "C_CONTIGUOUS", n)==0)
- return arrayflags_contiguous_get(self);
- if (strncmp(key, "F_CONTIGUOUS", n)==0)
- return arrayflags_fortran_get(self);
- break;
- }
+ char *key;
+ int n;
+ if (!PyString_Check(ind)) goto fail;
+ key = PyString_AS_STRING(ind);
+ n = PyString_GET_SIZE(ind);
+ switch(n) {
+ case 1:
+ switch(key[0]) {
+ case 'C':
+ return arrayflags_contiguous_get(self);
+ case 'F':
+ return arrayflags_fortran_get(self);
+ case 'W':
+ return arrayflags_writeable_get(self);
+ case 'B':
+ return arrayflags_behaved_get(self);
+ case 'O':
+ return arrayflags_owndata_get(self);
+ case 'A':
+ return arrayflags_aligned_get(self);
+ case 'U':
+ return arrayflags_updateifcopy_get(self);
+ default:
+ goto fail;
+ }
+ break;
+ case 2:
+ if (strncmp(key, "CA", n)==0)
+ return arrayflags_carray_get(self);
+ if (strncmp(key, "FA", n)==0)
+ return arrayflags_farray_get(self);
+ break;
+ case 3:
+ if (strncmp(key, "FNC", n)==0)
+ return arrayflags_fnc_get(self);
+ break;
+ case 4:
+ if (strncmp(key, "FORC", n)==0)
+ return arrayflags_forc_get(self);
+ break;
+ case 6:
+ if (strncmp(key, "CARRAY", n)==0)
+ return arrayflags_carray_get(self);
+ if (strncmp(key, "FARRAY", n)==0)
+ return arrayflags_farray_get(self);
+ break;
+ case 7:
+ if (strncmp(key,"FORTRAN",n)==0)
+ return arrayflags_fortran_get(self);
+ if (strncmp(key,"BEHAVED",n)==0)
+ return arrayflags_behaved_get(self);
+ if (strncmp(key,"OWNDATA",n)==0)
+ return arrayflags_owndata_get(self);
+ if (strncmp(key,"ALIGNED",n)==0)
+ return arrayflags_aligned_get(self);
+ break;
+ case 9:
+ if (strncmp(key,"WRITEABLE",n)==0)
+ return arrayflags_writeable_get(self);
+ break;
+ case 10:
+ if (strncmp(key,"CONTIGUOUS",n)==0)
+ return arrayflags_contiguous_get(self);
+ break;
+ case 12:
+ if (strncmp(key, "UPDATEIFCOPY", n)==0)
+ return arrayflags_updateifcopy_get(self);
+ if (strncmp(key, "C_CONTIGUOUS", n)==0)
+ return arrayflags_contiguous_get(self);
+ if (strncmp(key, "F_CONTIGUOUS", n)==0)
+ return arrayflags_fortran_get(self);
+ break;
+ }
fail:
- PyErr_SetString(PyExc_KeyError, "Unknown flag");
- return NULL;
+ PyErr_SetString(PyExc_KeyError, "Unknown flag");
+ return NULL;
}
static int
arrayflags_setitem(PyArrayFlagsObject *self, PyObject *ind, PyObject *item)
{
- char *key;
- int n;
- if (!PyString_Check(ind)) goto fail;
- key = PyString_AS_STRING(ind);
- n = PyString_GET_SIZE(ind);
- if (((n==9) && (strncmp(key, "WRITEABLE", n)==0)) ||
- ((n==1) && (strncmp(key, "W", n)==0)))
- return arrayflags_writeable_set(self, item);
- else if (((n==7) && (strncmp(key, "ALIGNED", n)==0)) ||
- ((n==1) && (strncmp(key, "A", n)==0)))
- return arrayflags_aligned_set(self, item);
- else if (((n==12) && (strncmp(key, "UPDATEIFCOPY", n)==0)) ||
- ((n==1) && (strncmp(key, "U", n)==0)))
- return arrayflags_updateifcopy_set(self, item);
-
-fail:
- PyErr_SetString(PyExc_KeyError, "Unknown flag");
- return -1;
+ char *key;
+ int n;
+ if (!PyString_Check(ind)) goto fail;
+ key = PyString_AS_STRING(ind);
+ n = PyString_GET_SIZE(ind);
+ if (((n==9) && (strncmp(key, "WRITEABLE", n)==0)) ||
+ ((n==1) && (strncmp(key, "W", n)==0)))
+ return arrayflags_writeable_set(self, item);
+ else if (((n==7) && (strncmp(key, "ALIGNED", n)==0)) ||
+ ((n==1) && (strncmp(key, "A", n)==0)))
+ return arrayflags_aligned_set(self, item);
+ else if (((n==12) && (strncmp(key, "UPDATEIFCOPY", n)==0)) ||
+ ((n==1) && (strncmp(key, "U", n)==0)))
+ return arrayflags_updateifcopy_set(self, item);
+
+ fail:
+ PyErr_SetString(PyExc_KeyError, "Unknown flag");
+ return -1;
}
static char *
_torf_(int flags, int val)
{
- if ((flags & val) == val) return "True";
- else return "False";
+ if ((flags & val) == val) return "True";
+ else return "False";
}
static PyObject *
arrayflags_print(PyArrayFlagsObject *self)
{
- int fl = self->flags;
+ int fl = self->flags;
- return PyString_FromFormat(" %s : %s\n %s : %s\n %s : %s\n"\
- " %s : %s\n %s : %s\n %s : %s",
- "C_CONTIGUOUS", _torf_(fl, CONTIGUOUS),
- "F_CONTIGUOUS", _torf_(fl, FORTRAN),
- "OWNDATA", _torf_(fl, OWNDATA),
- "WRITEABLE", _torf_(fl, WRITEABLE),
- "ALIGNED", _torf_(fl, ALIGNED),
- "UPDATEIFCOPY", _torf_(fl, UPDATEIFCOPY));
+ return PyString_FromFormat(" %s : %s\n %s : %s\n %s : %s\n"\
+ " %s : %s\n %s : %s\n %s : %s",
+ "C_CONTIGUOUS", _torf_(fl, CONTIGUOUS),
+ "F_CONTIGUOUS", _torf_(fl, FORTRAN),
+ "OWNDATA", _torf_(fl, OWNDATA),
+ "WRITEABLE", _torf_(fl, WRITEABLE),
+ "ALIGNED", _torf_(fl, ALIGNED),
+ "UPDATEIFCOPY", _torf_(fl, UPDATEIFCOPY));
}
static int
arrayflags_compare(PyArrayFlagsObject *self, PyArrayFlagsObject *other)
{
- if (self->flags == other->flags)
- return 0;
- else if (self->flags < other->flags)
- return -1;
- else
- return 1;
+ if (self->flags == other->flags)
+ return 0;
+ else if (self->flags < other->flags)
+ return -1;
+ else
+ return 1;
}
static PyMappingMethods arrayflags_as_mapping = {
#if PY_VERSION_HEX >= 0x02050000
- (lenfunc)NULL, /*mp_length*/
+ (lenfunc)NULL, /*mp_length*/
#else
- (inquiry)NULL, /*mp_length*/
+ (inquiry)NULL, /*mp_length*/
#endif
- (binaryfunc)arrayflags_getitem, /*mp_subscript*/
- (objobjargproc)arrayflags_setitem, /*mp_ass_subscript*/
+ (binaryfunc)arrayflags_getitem, /*mp_subscript*/
+ (objobjargproc)arrayflags_setitem, /*mp_ass_subscript*/
};
static PyObject *
arrayflags_new(PyTypeObject *self, PyObject *args, PyObject *kwds)
{
- PyObject *arg=NULL;
- if (!PyArg_UnpackTuple(args, "flagsobj", 0, 1, &arg))
- return NULL;
+ PyObject *arg=NULL;
+ if (!PyArg_UnpackTuple(args, "flagsobj", 0, 1, &arg))
+ return NULL;
- if ((arg != NULL) && PyArray_Check(arg)) {
- return PyArray_NewFlagsObject(arg);
- }
- else {
- return PyArray_NewFlagsObject(NULL);
- }
+ if ((arg != NULL) && PyArray_Check(arg)) {
+ return PyArray_NewFlagsObject(arg);
+ }
+ else {
+ return PyArray_NewFlagsObject(NULL);
+ }
}
static PyTypeObject PyArrayFlags_Type = {
- PyObject_HEAD_INIT(NULL)
- 0,
- "numpy.flagsobj",
- sizeof(PyArrayFlagsObject),
- 0, /* tp_itemsize */
- /* methods */
- (destructor)arrayflags_dealloc, /* tp_dealloc */
- 0, /* tp_print */
- 0, /* tp_getattr */
- 0, /* tp_setattr */
- (cmpfunc)arrayflags_compare, /* tp_compare */
- (reprfunc)arrayflags_print, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- &arrayflags_as_mapping, /* tp_as_mapping */
- 0, /* tp_hash */
- 0, /* tp_call */
- (reprfunc)arrayflags_print, /* tp_str */
- 0, /* tp_getattro */
- 0, /* tp_setattro */
- 0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT, /* tp_flags */
- 0, /* tp_doc */
- 0, /* tp_traverse */
- 0, /* tp_clear */
- 0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- 0, /* tp_iter */
- 0, /* tp_iternext */
- 0, /* tp_methods */
- 0, /* tp_members */
- arrayflags_getsets, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- 0, /* tp_alloc */
- arrayflags_new, /* tp_new */
- 0, /* tp_free */
- 0, /* tp_is_gc */
- 0, /* tp_bases */
- 0, /* tp_mro */
- 0, /* tp_cache */
- 0, /* tp_subclasses */
- 0 /* tp_weaklist */
+ PyObject_HEAD_INIT(NULL)
+ 0,
+ "numpy.flagsobj",
+ sizeof(PyArrayFlagsObject),
+ 0, /* tp_itemsize */
+ /* methods */
+ (destructor)arrayflags_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ (cmpfunc)arrayflags_compare, /* tp_compare */
+ (reprfunc)arrayflags_print, /* tp_repr */
+ 0, /* tp_as_number */
+ 0, /* tp_as_sequence */
+ &arrayflags_as_mapping, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ (reprfunc)arrayflags_print, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ 0, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ 0, /* tp_methods */
+ 0, /* tp_members */
+ arrayflags_getsets, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ arrayflags_new, /* tp_new */
+ 0, /* tp_free */
+ 0, /* tp_is_gc */
+ 0, /* tp_bases */
+ 0, /* tp_mro */
+ 0, /* tp_cache */
+ 0, /* tp_subclasses */
+ 0 /* tp_weaklist */
};