diff options
author | seberg <sebastian@sipsolutions.net> | 2017-02-27 18:52:39 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-02-27 18:52:39 +0100 |
commit | 533cef98154164928759c352a43a461ac9951c03 (patch) | |
tree | 675c94752c1baab08eb104c210661262a2b510f9 /numpy | |
parent | ad8afe82e7b7643607a348c0e02b45c9131c6a06 (diff) | |
parent | d60ff8ec091396246ab6dabe231efc5012359b15 (diff) | |
download | numpy-533cef98154164928759c352a43a461ac9951c03.tar.gz |
Merge pull request #8704 from charris/fix-zerosize-deep-copy
BUG: Fix deepcopy regression for empty arrays.
Diffstat (limited to 'numpy')
-rw-r--r-- | numpy/core/src/multiarray/methods.c | 57 | ||||
-rw-r--r-- | numpy/core/tests/test_regression.py | 7 |
2 files changed, 36 insertions, 28 deletions
diff --git a/numpy/core/src/multiarray/methods.c b/numpy/core/src/multiarray/methods.c index f2e1d87ad..80d4aebeb 100644 --- a/numpy/core/src/multiarray/methods.c +++ b/numpy/core/src/multiarray/methods.c @@ -1441,41 +1441,42 @@ array_deepcopy(PyArrayObject *self, PyObject *args) Py_DECREF(copied_array); return NULL; } - iter = (NpyIter *)NpyIter_New(copied_array, - (NPY_ITER_READWRITE | - NPY_ITER_EXTERNAL_LOOP | - NPY_ITER_REFS_OK), - NPY_KEEPORDER, - NPY_NO_CASTING, - NULL); + iter = NpyIter_New(copied_array, + NPY_ITER_READWRITE | + NPY_ITER_EXTERNAL_LOOP | + NPY_ITER_REFS_OK | + NPY_ITER_ZEROSIZE_OK, + NPY_KEEPORDER, NPY_NO_CASTING, + NULL); if (iter == NULL) { Py_DECREF(deepcopy); Py_DECREF(copied_array); return NULL; } - iternext = NpyIter_GetIterNext(iter, NULL); - if (iternext == NULL) { - NpyIter_Deallocate(iter); - Py_DECREF(deepcopy); - Py_DECREF(copied_array); - return NULL; - } - - dataptr = NpyIter_GetDataPtrArray(iter); - strideptr = NpyIter_GetInnerStrideArray(iter); - innersizeptr = NpyIter_GetInnerLoopSizePtr(iter); - - do { - data = *dataptr; - stride = *strideptr; - count = *innersizeptr; - while (count--) { - _deepcopy_call(data, data, PyArray_DESCR(copied_array), - deepcopy, visit); - data += stride; + if (NpyIter_GetIterSize(iter) != 0) { + iternext = NpyIter_GetIterNext(iter, NULL); + if (iternext == NULL) { + NpyIter_Deallocate(iter); + Py_DECREF(deepcopy); + Py_DECREF(copied_array); + return NULL; } - } while (iternext(iter)); + dataptr = NpyIter_GetDataPtrArray(iter); + strideptr = NpyIter_GetInnerStrideArray(iter); + innersizeptr = NpyIter_GetInnerLoopSizePtr(iter); + + do { + data = *dataptr; + stride = *strideptr; + count = *innersizeptr; + while (count--) { + _deepcopy_call(data, data, PyArray_DESCR(copied_array), + deepcopy, visit); + data += stride; + } + } while (iternext(iter)); + } NpyIter_Deallocate(iter); Py_DECREF(deepcopy); } diff --git a/numpy/core/tests/test_regression.py b/numpy/core/tests/test_regression.py index cc9d875c6..de84f98b3 100644 --- a/numpy/core/tests/test_regression.py +++ b/numpy/core/tests/test_regression.py @@ -2087,6 +2087,13 @@ class TestRegression(TestCase): # Check the references hold for the copied objects. self.assertTrue(arr_cp[0, 1] is arr_cp[1, 1]) + def test_deepcopy_empty_object_array(self): + # Ticket #8536. + # Deepcopy should succeed + a = np.array([], dtype=object) + b = copy.deepcopy(a) + assert_(a.shape == b.shape) + def test_bool_subscript_crash(self): # gh-4494 c = np.rec.array([(1, 2, 3), (4, 5, 6)]) |