[Numpy-svn] r3556 - trunk/numpy/core/src
numpy-svn at scipy.org
numpy-svn at scipy.org
Tue Feb 27 22:22:22 EST 2007
Author: oliphant
Date: 2007-02-27 21:22:18 -0600 (Tue, 27 Feb 2007)
New Revision: 3556
Modified:
trunk/numpy/core/src/arraytypes.inc.src
Log:
Fix copyswap when a field is a sub-array
Modified: trunk/numpy/core/src/arraytypes.inc.src
===================================================================
--- trunk/numpy/core/src/arraytypes.inc.src 2007-02-28 01:15:59 UTC (rev 3555)
+++ trunk/numpy/core/src/arraytypes.inc.src 2007-02-28 03:22:18 UTC (rev 3556)
@@ -1298,9 +1298,7 @@
VOID_copyswapn (char *dst, intp dstride, char *src, intp sstride,
intp n, int swap, PyArrayObject *arr)
{
- int itemsize;
if (arr == NULL) return;
- itemsize = arr->descr->elsize;
if (PyArray_HASFIELDS(arr)) {
PyObject *key, *value, *title=NULL;
PyArray_Descr *new, *descr;
@@ -1320,8 +1318,30 @@
arr->descr = descr;
return;
}
+ if (swap && arr->descr->subarray != NULL) {
+ PyArray_Descr *descr, *new;
+ npy_intp num;
+ npy_intp i;
+ int subitemsize;
+ char *dstptr, *srcptr;
+ descr = arr->descr;
+ new = descr->subarray->base;
+ arr->descr = new;
+ dstptr = dst;
+ srcptr = src;
+ subitemsize = new->elsize;
+ num = descr->elsize / subitemsize;
+ for (i=0; i<n; i++) {
+ new->f->copyswapn(dstptr, subitemsize, srcptr,
+ subitemsize, num, swap, arr);
+ dstptr += dstride;
+ if (srcptr) srcptr += sstride;
+ }
+ arr->descr = descr;
+ return;
+ }
if (src != NULL) {
- memcpy(dst, src, itemsize * n);
+ memcpy(dst, src, arr->descr->elsize * n);
}
return;
}
@@ -1349,6 +1369,20 @@
arr->descr = descr;
return;
}
+ if (swap && arr->descr->subarray != NULL) {
+ PyArray_Descr *descr, *new;
+ npy_intp num;
+ int itemsize;
+ descr = arr->descr;
+ new = descr->subarray->base;
+ arr->descr = new;
+ itemsize = new->elsize;
+ num = descr->elsize / itemsize;
+ new->f->copyswapn(dst, itemsize, src,
+ itemsize, num, swap, arr);
+ arr->descr = descr;
+ return;
+ }
if (src != NULL) {
memcpy(dst, src, arr->descr->elsize);
}
More information about the Numpy-svn
mailing list