Skip to content

Commit

Permalink
Merge pull request #19500 from charris/backport-19396
Browse files Browse the repository at this point in the history
BUG: fix a numpy.npiter leak in npyiter_multi_index_set
  • Loading branch information
charris committed Jul 17, 2021
2 parents a6d1fd1 + 96dcd08 commit 74f82c9
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 1 deletion.
2 changes: 1 addition & 1 deletion numpy/core/src/multiarray/nditer_pywrap.c
Expand Up @@ -1595,8 +1595,8 @@ npyiter_multi_index_set(NewNpyArrayIterObject *self, PyObject *value)
for (idim = 0; idim < ndim; ++idim) {
PyObject *v = PySequence_GetItem(value, idim);
multi_index[idim] = PyLong_AsLong(v);
Py_DECREF(v);
if (error_converting(multi_index[idim])) {
Py_XDECREF(v);
return -1;
}
}
Expand Down
23 changes: 23 additions & 0 deletions numpy/core/tests/test_nditer.py
Expand Up @@ -185,6 +185,29 @@ def test_iter_c_or_f_order():
assert_equal([x for x in i],
aview.swapaxes(0, 1).ravel(order='A'))

def test_nditer_multi_index_set():
# Test the multi_index set
a = np.arange(6).reshape(2, 3)
it = np.nditer(a, flags=['multi_index'])

# Removes the iteration on two first elements of a[0]
it.multi_index = (0, 2,)

assert_equal([i for i in it], [2, 3, 4, 5])

@pytest.mark.skipif(not HAS_REFCOUNT, reason="Python lacks refcounts")
def test_nditer_multi_index_set_refcount():
# Test if the reference count on index variable is decreased

index = 0
i = np.nditer(np.array([111, 222, 333, 444]), flags=['multi_index'])

start_count = sys.getrefcount(index)
i.multi_index = (index,)
end_count = sys.getrefcount(index)

assert_equal(start_count, end_count)

def test_iter_best_order_multi_index_1d():
# The multi-indices should be correct with any reordering

Expand Down

0 comments on commit 74f82c9

Please sign in to comment.