summaryrefslogtreecommitdiff
path: root/numpy
diff options
context:
space:
mode:
authorseberg <sebastian@sipsolutions.net>2017-02-27 18:52:39 +0100
committerGitHub <noreply@github.com>2017-02-27 18:52:39 +0100
commit533cef98154164928759c352a43a461ac9951c03 (patch)
tree675c94752c1baab08eb104c210661262a2b510f9 /numpy
parentad8afe82e7b7643607a348c0e02b45c9131c6a06 (diff)
parentd60ff8ec091396246ab6dabe231efc5012359b15 (diff)
downloadnumpy-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.c57
-rw-r--r--numpy/core/tests/test_regression.py7
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)])