summaryrefslogtreecommitdiff
path: root/numpy/core/src/arrayobject.c
diff options
context:
space:
mode:
authorTravis Oliphant <oliphant@enthought.com>2008-03-21 23:54:58 +0000
committerTravis Oliphant <oliphant@enthought.com>2008-03-21 23:54:58 +0000
commite26b067d39b66461018632c32fcd6e31df57ae9a (patch)
tree3e4b47ad34de2b0d8f6d72dfe997cb5ae006e971 /numpy/core/src/arrayobject.c
parent4a562edd4f1753238e3e8bc32a7a0028ff16ceb7 (diff)
downloadnumpy-e26b067d39b66461018632c32fcd6e31df57ae9a.tar.gz
Fix ticket #711 by more carefully guarding object array reference counting.
Diffstat (limited to 'numpy/core/src/arrayobject.c')
-rw-r--r--numpy/core/src/arrayobject.c129
1 files changed, 69 insertions, 60 deletions
diff --git a/numpy/core/src/arrayobject.c b/numpy/core/src/arrayobject.c
index d1d49d797..567aa7750 100644
--- a/numpy/core/src/arrayobject.c
+++ b/numpy/core/src/arrayobject.c
@@ -784,6 +784,7 @@ _copy_from0d(PyArrayObject *dest, PyArrayObject *src, int usecopy, int swap)
dstride = nbytes;
/* Refcount note: src and dest may have different sizes */
+ PyArray_INCREF(src);
PyArray_XDECREF(dest);
NPY_BEGIN_THREADS
@@ -794,7 +795,8 @@ _copy_from0d(PyArrayObject *dest, PyArrayObject *src, int usecopy, int swap)
NPY_END_THREADS
- PyArray_INCREF(dest);
+ PyArray_INCREF(dest);
+ PyArray_XDECREF(src);
}
else {
PyArrayIterObject *dit;
@@ -803,8 +805,8 @@ _copy_from0d(PyArrayObject *dest, PyArrayObject *src, int usecopy, int swap)
PyArray_IterAllButAxis((PyObject *)dest, &axis);
if (dit == NULL) goto finish;
/* Refcount note: src and dest may have different sizes */
+ PyArray_INCREF(src);
PyArray_XDECREF(dest);
-
NPY_BEGIN_THREADS
while(dit->index < dit->size) {
myfunc(dit->dataptr, PyArray_STRIDE(dest, axis),
@@ -817,9 +819,9 @@ _copy_from0d(PyArrayObject *dest, PyArrayObject *src, int usecopy, int swap)
PyArray_ITER_NEXT(dit);
}
NPY_END_THREADS
-
- PyArray_INCREF(dest);
- Py_DECREF(dit);
+ PyArray_INCREF(dest);
+ PyArray_XDECREF(src);
+ Py_DECREF(dit);
}
retval = 0;
finish:
@@ -843,12 +845,13 @@ int _flat_copyinto(PyObject *dst, PyObject *src, NPY_ORDER order) {
if (PyArray_NDIM(src) == 0) {
- PyArray_XDECREF((PyArrayObject *)dst);
- NPY_BEGIN_THREADS
- memcpy(PyArray_BYTES(dst), PyArray_BYTES(src),
- PyArray_ITEMSIZE(src));
+ /* Refcount note: src and dst have the same size */
+ PyArray_INCREF((PyArrayObject *)src);
+ PyArray_XDECREF((PyArrayObject *)dst);
+ NPY_BEGIN_THREADS
+ memcpy(PyArray_BYTES(dst), PyArray_BYTES(src),
+ PyArray_ITEMSIZE(src));
NPY_END_THREADS
- PyArray_INCREF((PyArrayObject *)dst);
return 0;
}
@@ -873,19 +876,19 @@ int _flat_copyinto(PyObject *dst, PyObject *src, NPY_ORDER order) {
elsize = PyArray_ITEMSIZE(dst);
nbytes = elsize * PyArray_DIM(src, axis);
+ /* Refcount note: src and dst have the same size */
+ PyArray_INCREF((PyArrayObject *)src);
PyArray_XDECREF((PyArrayObject *)dst);
NPY_BEGIN_THREADS
- while(it->index < it->size) {
- myfunc(dptr, elsize, it->dataptr,
- PyArray_STRIDE(src,axis),
- PyArray_DIM(src,axis), elsize);
- dptr += nbytes;
- PyArray_ITER_NEXT(it);
- }
+ while(it->index < it->size) {
+ myfunc(dptr, elsize, it->dataptr,
+ PyArray_STRIDE(src,axis),
+ PyArray_DIM(src,axis), elsize);
+ dptr += nbytes;
+ PyArray_ITER_NEXT(it);
+ }
NPY_END_THREADS
- PyArray_INCREF((PyArrayObject *)dst);
-
Py_DECREF(it);
return 0;
}
@@ -915,27 +918,27 @@ _copy_from_same_shape(PyArrayObject *dest, PyArrayObject *src,
}
elsize = PyArray_ITEMSIZE(dest);
+ /* Refcount note: src and dst have the same size */
+ PyArray_INCREF(src);
PyArray_XDECREF(dest);
NPY_BEGIN_THREADS
- while(dit->index < dit->size) {
- /* strided copy of elsize bytes */
- myfunc(dit->dataptr, dest->strides[maxaxis],
- sit->dataptr, src->strides[maxaxis],
- maxdim, elsize);
- if (swap) {
- _strided_byte_swap(dit->dataptr,
- dest->strides[maxaxis],
- dest->dimensions[maxaxis],
- elsize);
- }
- PyArray_ITER_NEXT(dit);
- PyArray_ITER_NEXT(sit);
- }
+ while(dit->index < dit->size) {
+ /* strided copy of elsize bytes */
+ myfunc(dit->dataptr, dest->strides[maxaxis],
+ sit->dataptr, src->strides[maxaxis],
+ maxdim, elsize);
+ if (swap) {
+ _strided_byte_swap(dit->dataptr,
+ dest->strides[maxaxis],
+ dest->dimensions[maxaxis],
+ elsize);
+ }
+ PyArray_ITER_NEXT(dit);
+ PyArray_ITER_NEXT(sit);
+ }
NPY_END_THREADS
- PyArray_INCREF(dest);
-
Py_DECREF(sit);
Py_DECREF(dit);
return 0;
@@ -951,7 +954,7 @@ _broadcast_copy(PyArrayObject *dest, PyArrayObject *src,
int maxaxis; intp maxdim;
NPY_BEGIN_THREADS_DEF
- elsize = PyArray_ITEMSIZE(dest);
+ elsize = PyArray_ITEMSIZE(dest);
multi = (PyArrayMultiIterObject *)PyArray_MultiIterNew(2, dest, src);
if (multi == NULL) return -1;
@@ -965,10 +968,11 @@ _broadcast_copy(PyArrayObject *dest, PyArrayObject *src,
maxaxis = PyArray_RemoveSmallest(multi);
if (maxaxis < 0) { /* copy 1 0-d array to another */
+ /* Refcount note: src and dst have the same size */
+ PyArray_INCREF(src);
PyArray_XDECREF(dest);
memcpy(dest->data, src->data, elsize);
if (swap) byte_swap_vector(dest->data, 1, elsize);
- PyArray_INCREF(dest);
return 0;
}
maxdim = multi->dimensions[maxaxis];
@@ -976,25 +980,28 @@ _broadcast_copy(PyArrayObject *dest, PyArrayObject *src,
/* Increment the source and decrement the destination
reference counts
*/
+ /* Refcount note: src and dest may have different sizes */
+ PyArray_INCREF(src);
PyArray_XDECREF(dest);
NPY_BEGIN_THREADS
- while(multi->index < multi->size) {
- myfunc(multi->iters[0]->dataptr,
- multi->iters[0]->strides[maxaxis],
- multi->iters[1]->dataptr,
- multi->iters[1]->strides[maxaxis],
- maxdim, elsize);
- if (swap) {
- _strided_byte_swap(multi->iters[0]->dataptr,
- multi->iters[0]->strides[maxaxis],
- maxdim, elsize);
- }
- PyArray_MultiIter_NEXT(multi);
+ while(multi->index < multi->size) {
+ myfunc(multi->iters[0]->dataptr,
+ multi->iters[0]->strides[maxaxis],
+ multi->iters[1]->dataptr,
+ multi->iters[1]->strides[maxaxis],
+ maxdim, elsize);
+ if (swap) {
+ _strided_byte_swap(multi->iters[0]->dataptr,
+ multi->iters[0]->strides[maxaxis],
+ maxdim, elsize);
}
+ PyArray_MultiIter_NEXT(multi);
+ }
NPY_END_THREADS
PyArray_INCREF(dest);
+ PyArray_XDECREF(src);
Py_DECREF(multi);
return 0;
@@ -1036,15 +1043,16 @@ _array_copy_into(PyArrayObject *dest, PyArrayObject *src, int usecopy)
(PyArray_ISFARRAY_RO(src) && PyArray_ISFARRAY(dest)));
if (simple) {
+ /* Refcount note: src and dest have the same size */
+ PyArray_INCREF(src);
PyArray_XDECREF(dest);
NPY_BEGIN_THREADS
- if (usecopy)
- memcpy(dest->data, src->data, PyArray_NBYTES(dest));
- else
- memmove(dest->data, src->data, PyArray_NBYTES(dest));
- NPY_END_THREADS
- PyArray_INCREF(dest);
- return 0;
+ if (usecopy)
+ memcpy(dest->data, src->data, PyArray_NBYTES(dest));
+ else
+ memmove(dest->data, src->data, PyArray_NBYTES(dest));
+ NPY_END_THREADS
+ return 0;
}
swap = PyArray_ISNOTSWAPPED(dest) != PyArray_ISNOTSWAPPED(src);
@@ -1109,12 +1117,12 @@ PyArray_CopyAnyInto(PyArrayObject *dest, PyArrayObject *src)
if (simple) {
/* Refcount note: src and dest have the same size */
+ PyArray_INCREF(src);
PyArray_XDECREF(dest);
NPY_BEGIN_THREADS
- memcpy(dest->data, src->data, PyArray_NBYTES(dest));
+ memcpy(dest->data, src->data, PyArray_NBYTES(dest));
NPY_END_THREADS
- PyArray_INCREF(dest);
- return 0;
+ return 0;
}
if (PyArray_SAMESHAPE(dest, src)) {
@@ -1135,6 +1143,8 @@ PyArray_CopyAnyInto(PyArrayObject *dest, PyArrayObject *src)
isrc = (PyArrayIterObject *)PyArray_IterNew((PyObject *)src);
if (isrc == NULL) {Py_DECREF(idest); return -1;}
elsize = dest->descr->elsize;
+ /* Refcount note: src and dest have the same size */
+ PyArray_INCREF(src);
PyArray_XDECREF(dest);
NPY_BEGIN_THREADS
while(idest->index < idest->size) {
@@ -1143,7 +1153,6 @@ PyArray_CopyAnyInto(PyArrayObject *dest, PyArrayObject *src)
PyArray_ITER_NEXT(isrc);
}
NPY_END_THREADS
- PyArray_INCREF(dest);
Py_DECREF(idest);
Py_DECREF(isrc);
return 0;