summaryrefslogtreecommitdiff
path: root/numpy
diff options
context:
space:
mode:
authorMark Wiebe <mwwiebe@gmail.com>2010-12-21 16:19:42 -0800
committerMark Wiebe <mwwiebe@gmail.com>2011-01-09 01:55:01 -0800
commit0ff9d91f8747a0a75f04d9e6596e7f8f46d379d9 (patch)
tree914ddae5fabe82b07c297857ca5a6650bbbf45ad /numpy
parentd7203d0cd899081c0b421ae44e31342070c7a2e9 (diff)
downloadnumpy-0ff9d91f8747a0a75f04d9e6596e7f8f46d379d9.tar.gz
BUG: iter: Fix a crash with the NO_BROADCAST flag
Diffstat (limited to 'numpy')
-rw-r--r--numpy/core/src/multiarray/new_iterator.c.src3
-rw-r--r--numpy/core/src/multiarray/new_iterator_pywrap.c46
2 files changed, 46 insertions, 3 deletions
diff --git a/numpy/core/src/multiarray/new_iterator.c.src b/numpy/core/src/multiarray/new_iterator.c.src
index a6785ac03..985e7d084 100644
--- a/numpy/core/src/multiarray/new_iterator.c.src
+++ b/numpy/core/src/multiarray/new_iterator.c.src
@@ -2445,7 +2445,8 @@ npyiter_fill_axisdata(NpyIter *iter, PyArrayObject **op,
else {
i = ndim-idim-1;
}
- if (PyArray_DIM(op[iiter], i) != NAD_SHAPE(axisdata)) {
+ if (op[iiter] != NULL &&
+ PyArray_DIM(op[iiter], i) != NAD_SHAPE(axisdata)) {
PyErr_SetString(PyExc_ValueError,
"Iterator input has the NO_BROADCAST flag set, "
"but has different dimensions than the final "
diff --git a/numpy/core/src/multiarray/new_iterator_pywrap.c b/numpy/core/src/multiarray/new_iterator_pywrap.c
index 01bb51bb7..757ddc709 100644
--- a/numpy/core/src/multiarray/new_iterator_pywrap.c
+++ b/numpy/core/src/multiarray/new_iterator_pywrap.c
@@ -1185,6 +1185,48 @@ npyiter_seq_item(NewNpyArrayIterObject *self, Py_ssize_t i)
return ret;
}
+NPY_NO_EXPORT PyObject *
+npyiter_seq_slice(NewNpyArrayIterObject *self,
+ Py_ssize_t ilow, Py_ssize_t ihigh)
+{
+ PyObject *ret;
+ npy_intp niter;
+ Py_ssize_t i;
+
+ if (self->iter == NULL || self->finished) {
+ PyErr_SetString(PyExc_ValueError,
+ "Iterator is past the end");
+ return NULL;
+ }
+ niter = NpyIter_GetNIter(self->iter);
+ if (ilow < 0) {
+ ilow = 0;
+ }
+ else if (ilow >= niter) {
+ ilow = niter-1;
+ }
+ if (ihigh < ilow) {
+ ihigh = ilow;
+ }
+ else if (ihigh >= niter) {
+ ihigh = niter-1;
+ }
+
+ ret = PyTuple_New(ihigh-ilow);
+ if (ret == NULL) {
+ return NULL;
+ }
+ for (i = ilow; i < ihigh ; ++i) {
+ PyObject *item = npyiter_seq_item(self, i);
+ if (item == NULL) {
+ Py_DECREF(ret);
+ return NULL;
+ }
+ PyTuple_SET_ITEM(ret, i-ilow, item);
+ }
+ return ret;
+}
+
NPY_NO_EXPORT int
npyiter_seq_ass_item(NewNpyArrayIterObject *self, Py_ssize_t i, PyObject *v)
{
@@ -1310,7 +1352,7 @@ NPY_NO_EXPORT PySequenceMethods npyiter_as_sequence = {
(binaryfunc)NULL, /*sq_concat*/
(ssizeargfunc)NULL, /*sq_repeat*/
(ssizeargfunc)npyiter_seq_item, /*sq_item*/
- (ssizessizeargfunc)NULL, /*sq_slice*/
+ (ssizessizeargfunc)npyiter_seq_slice, /*sq_slice*/
(ssizeobjargproc)npyiter_seq_ass_item, /*sq_ass_item*/
(ssizessizeobjargproc)NULL, /*sq_ass_slice*/
(objobjproc)NULL, /*sq_contains */
@@ -1321,7 +1363,7 @@ NPY_NO_EXPORT PySequenceMethods npyiter_as_sequence = {
(binaryfunc)NULL, /*sq_concat is handled by nb_add*/
(intargfunc)NULL, /*sq_repeat is handled nb_multiply*/
(intargfunc)npyiter_seq_item, /*sq_item*/
- (intintargfunc)NULL, /*sq_slice*/
+ (intintargfunc)npyiter_seq_slice, /*sq_slice*/
(intobjargproc)npyiter_seq_ass_item, /*sq_ass_item*/
(intintobjargproc)NULL, /*sq_ass_slice*/
(objobjproc)NULL, /*sq_contains */