diff options
author | Mark Wiebe <mwwiebe@gmail.com> | 2010-12-21 16:19:42 -0800 |
---|---|---|
committer | Mark Wiebe <mwwiebe@gmail.com> | 2011-01-09 01:55:01 -0800 |
commit | 0ff9d91f8747a0a75f04d9e6596e7f8f46d379d9 (patch) | |
tree | 914ddae5fabe82b07c297857ca5a6650bbbf45ad /numpy | |
parent | d7203d0cd899081c0b421ae44e31342070c7a2e9 (diff) | |
download | numpy-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.src | 3 | ||||
-rw-r--r-- | numpy/core/src/multiarray/new_iterator_pywrap.c | 46 |
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 */ |