diff options
author | Mark Wiebe <mwiebe@enthought.com> | 2011-06-27 15:34:48 -0500 |
---|---|---|
committer | Charles Harris <charlesr.harris@gmail.com> | 2011-07-06 16:24:12 -0600 |
commit | 30d59c189904d12c920fb7613c0fdb40f1faf36f (patch) | |
tree | 480ba334728e8e01c3901f8cf87050ba1d2b300b | |
parent | 59cdc32278ff54f3868cf0a4ee3a74943467ea7e (diff) | |
download | numpy-30d59c189904d12c920fb7613c0fdb40f1faf36f.tar.gz |
ENH: core: Create a new NpyAuxData mechanism for working with inner loop auxiliary data
There already was such a mechanism in the low level copying and casting
mechanism created for the iterator, so this mechanism has been refactored
into a form suitable for general purpose use.
-rw-r--r-- | numpy/core/include/numpy/ndarraytypes.h | 34 | ||||
-rw-r--r-- | numpy/core/src/multiarray/convert.c | 4 | ||||
-rw-r--r-- | numpy/core/src/multiarray/ctors.c | 10 | ||||
-rw-r--r-- | numpy/core/src/multiarray/dtype_transfer.c | 504 | ||||
-rw-r--r-- | numpy/core/src/multiarray/lowlevel_strided_loops.c.src | 44 | ||||
-rw-r--r-- | numpy/core/src/multiarray/nditer.c.src | 30 | ||||
-rw-r--r-- | numpy/core/src/private/lowlevel_strided_loops.h | 34 |
7 files changed, 317 insertions, 343 deletions
diff --git a/numpy/core/include/numpy/ndarraytypes.h b/numpy/core/include/numpy/ndarraytypes.h index 0d8f35397..bf8af1661 100644 --- a/numpy/core/include/numpy/ndarraytypes.h +++ b/numpy/core/include/numpy/ndarraytypes.h @@ -1400,6 +1400,40 @@ PyArrayNeighborhoodIter_Next2D(PyArrayNeighborhoodIterObject* iter); #define PyDataType_ISNOTSWAPPED(d) PyArray_ISNBO(((PyArray_Descr *)(d))->byteorder) #define PyDataType_ISBYTESWAPPED(d) (!PyDataType_ISNOTSWAPPED(d)) +/************************************************************ + * NumPy Auxiliary Data for inner loops, sort functions, etc. + ************************************************************/ + +/* + * When creating an auxiliary data struct, this should always appear + * as the first member, like this: + * + * typedef struct { + * NpyAuxData base; + * double constant; + * } constant_multiplier_aux_data; + */ +typedef struct NpyAuxData_tag NpyAuxData; + +/* Function pointers for freeing or cloning auxiliary data */ +typedef void (NpyAuxData_FreeFunc) (NpyAuxData *); +typedef NpyAuxData *(NpyAuxData_CloneFunc) (NpyAuxData *); + +struct NpyAuxData_tag { + NpyAuxData_FreeFunc *free; + NpyAuxData_CloneFunc *clone; + /* To allow for a bit of expansion without breaking the ABI */ + void *reserved[2]; +}; + +/* Macros to use for freeing and cloning auxiliary data */ +#define NPY_AUXDATA_FREE(auxdata) \ + if ((auxdata) == NULL) \ + ; \ + else \ + ((auxdata)->free(auxdata)) +#define NPY_AUXDATA_CLONE(auxdata) \ + ((auxdata)->clone(auxdata)) /* * This is the form of the struct that's returned pointed by the diff --git a/numpy/core/src/multiarray/convert.c b/numpy/core/src/multiarray/convert.c index e53166036..57ad8c22f 100644 --- a/numpy/core/src/multiarray/convert.c +++ b/numpy/core/src/multiarray/convert.c @@ -376,7 +376,7 @@ NPY_NO_EXPORT int PyArray_FillWithZero(PyArrayObject *a) { PyArray_StridedTransferFn *stransfer = NULL; - void *transferdata = NULL; + NpyAuxData *transferdata = NULL; PyArray_Descr *dtype = PyArray_DESCR(a); NpyIter *iter; @@ -456,7 +456,7 @@ PyArray_FillWithZero(PyArrayObject *a) NPY_END_THREADS; } - PyArray_FreeStridedTransferData(transferdata); + NPY_AUXDATA_FREE(transferdata); NpyIter_Deallocate(iter); return 0; diff --git a/numpy/core/src/multiarray/ctors.c b/numpy/core/src/multiarray/ctors.c index 6f1005dda..deaa152d7 100644 --- a/numpy/core/src/multiarray/ctors.c +++ b/numpy/core/src/multiarray/ctors.c @@ -2449,7 +2449,7 @@ PyArray_CopyAnyIntoOrdered(PyArrayObject *dst, PyArrayObject *src, NPY_ORDER order) { PyArray_StridedTransferFn *stransfer = NULL; - void *transferdata = NULL; + NpyAuxData *transferdata = NULL; NpyIter *dst_iter, *src_iter; NpyIter_IterNextFunc *dst_iternext, *src_iternext; @@ -2617,7 +2617,7 @@ PyArray_CopyAnyIntoOrdered(PyArrayObject *dst, PyArrayObject *src, NPY_END_THREADS; } - PyArray_FreeStridedTransferData(transferdata); + NPY_AUXDATA_FREE(transferdata); NpyIter_Deallocate(dst_iter); NpyIter_Deallocate(src_iter); @@ -2651,7 +2651,7 @@ NPY_NO_EXPORT int PyArray_CopyInto(PyArrayObject *dst, PyArrayObject *src) { PyArray_StridedTransferFn *stransfer = NULL; - void *transferdata = NULL; + NpyAuxData *transferdata = NULL; NPY_BEGIN_THREADS_DEF; if (!PyArray_ISWRITEABLE(dst)) { @@ -2706,7 +2706,7 @@ PyArray_CopyInto(PyArrayObject *dst, PyArrayObject *src) NPY_END_THREADS; } - PyArray_FreeStridedTransferData(transferdata); + NPY_AUXDATA_FREE(transferdata); return PyErr_Occurred() ? -1 : 0; } @@ -2791,7 +2791,7 @@ PyArray_CopyInto(PyArrayObject *dst, PyArrayObject *src) } } - PyArray_FreeStridedTransferData(transferdata); + NPY_AUXDATA_FREE(transferdata); NpyIter_Deallocate(iter); return PyErr_Occurred() ? -1 : 0; diff --git a/numpy/core/src/multiarray/dtype_transfer.c b/numpy/core/src/multiarray/dtype_transfer.c index b7febe8c2..123505d75 100644 --- a/numpy/core/src/multiarray/dtype_transfer.c +++ b/numpy/core/src/multiarray/dtype_transfer.c @@ -57,7 +57,7 @@ get_decsrcref_transfer_function(int aligned, npy_intp src_stride, PyArray_Descr *src_dtype, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata, + NpyAuxData **out_transferdata, int *out_needs_api); /* @@ -70,7 +70,7 @@ get_setdstzero_transfer_function(int aligned, npy_intp dst_stride, PyArray_Descr *dst_dtype, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata, + NpyAuxData **out_transferdata, int *out_needs_api); /* @@ -81,7 +81,7 @@ get_setdstzero_transfer_function(int aligned, NPY_NO_EXPORT int get_bool_setdstone_transfer_function(npy_intp dst_stride, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata, + NpyAuxData **out_transferdata, int *NPY_UNUSED(out_needs_api)); /*************************** COPY REFERENCES *******************************/ @@ -91,7 +91,7 @@ static void _strided_to_strided_move_references(char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp src_itemsize, - void *data) + NpyAuxData *data) { PyObject *src_ref = NULL, *dst_ref = NULL; while (N > 0) { @@ -119,7 +119,7 @@ static void _strided_to_strided_copy_references(char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp src_itemsize, - void *data) + NpyAuxData *data) { PyObject *src_ref = NULL, *dst_ref = NULL; while (N > 0) { @@ -143,18 +143,14 @@ _strided_to_strided_copy_references(char *dst, npy_intp dst_stride, /************************** ZERO-PADDED COPY ******************************/ -typedef void (*free_strided_transfer_data)(void *); -typedef void *(*copy_strided_transfer_data)(void *); - /* Does a zero-padded copy */ typedef struct { - free_strided_transfer_data freefunc; - copy_strided_transfer_data copyfunc; + NpyAuxData base; npy_intp dst_itemsize; } _strided_zero_pad_data; /* zero-padded data copy function */ -void *_strided_zero_pad_data_copy(void *data) +NpyAuxData *_strided_zero_pad_data_clone(NpyAuxData *data) { _strided_zero_pad_data *newdata = (_strided_zero_pad_data *)PyArray_malloc( @@ -165,7 +161,7 @@ void *_strided_zero_pad_data_copy(void *data) memcpy(newdata, data, sizeof(_strided_zero_pad_data)); - return newdata; + return (NpyAuxData *)newdata; } /* @@ -176,7 +172,7 @@ static void _strided_to_strided_zero_pad_copy(char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp src_itemsize, - void *data) + NpyAuxData *data) { _strided_zero_pad_data *d = (_strided_zero_pad_data *)data; npy_intp dst_itemsize = d->dst_itemsize; @@ -199,7 +195,7 @@ static void _strided_to_strided_truncate_copy(char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp src_itemsize, - void *data) + NpyAuxData *data) { _strided_zero_pad_data *d = (_strided_zero_pad_data *)data; npy_intp dst_itemsize = d->dst_itemsize; @@ -217,7 +213,7 @@ PyArray_GetStridedZeroPadCopyFn(int aligned, npy_intp src_stride, npy_intp dst_stride, npy_intp src_itemsize, npy_intp dst_itemsize, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata) + NpyAuxData **out_transferdata) { if (src_itemsize == dst_itemsize) { *out_stransfer = PyArray_GetStridedCopyFn(aligned, src_stride, @@ -233,8 +229,8 @@ PyArray_GetStridedZeroPadCopyFn(int aligned, return NPY_FAIL; } d->dst_itemsize = dst_itemsize; - d->freefunc = &PyArray_free; - d->copyfunc = &_strided_zero_pad_data_copy; + d->base.free = (NpyAuxData_FreeFunc *)&PyArray_free; + d->base.clone = &_strided_zero_pad_data_clone; if (src_itemsize < dst_itemsize) { *out_stransfer = &_strided_to_strided_zero_pad_copy; @@ -243,7 +239,7 @@ PyArray_GetStridedZeroPadCopyFn(int aligned, *out_stransfer = &_strided_to_strided_truncate_copy; } - *out_transferdata = d; + *out_transferdata = (NpyAuxData *)d; return NPY_SUCCEED; } } @@ -252,27 +248,26 @@ PyArray_GetStridedZeroPadCopyFn(int aligned, /* Wraps a transfer function + data in alignment code */ typedef struct { - free_strided_transfer_data freefunc; - copy_strided_transfer_data copyfunc; + NpyAuxData base; PyArray_StridedTransferFn *wrapped, *tobuffer, *frombuffer; - void *wrappeddata, *todata, *fromdata; + NpyAuxData *wrappeddata, *todata, *fromdata; npy_intp src_itemsize, dst_itemsize; char *bufferin, *bufferout; } _align_wrap_data; /* transfer data free function */ -void _align_wrap_data_free(void *data) +void _align_wrap_data_free(NpyAuxData *data) { _align_wrap_data *d = (_align_wrap_data *)data; - PyArray_FreeStridedTransferData(d->wrappeddata); - PyArray_FreeStridedTransferData(d->todata); - PyArray_FreeStridedTransferData(d->fromdata); + NPY_AUXDATA_FREE(d->wrappeddata); + NPY_AUXDATA_FREE(d->todata); + NPY_AUXDATA_FREE(d->fromdata); PyArray_free(data); } /* transfer data copy function */ -void *_align_wrap_data_copy(void *data) +NpyAuxData *_align_wrap_data_clone(NpyAuxData *data) { _align_wrap_data *d = (_align_wrap_data *)data; _align_wrap_data *newdata; @@ -295,39 +290,38 @@ void *_align_wrap_data_copy(void *data) newdata->bufferout = newdata->bufferin + NPY_LOWLEVEL_BUFFER_BLOCKSIZE*newdata->src_itemsize; if (newdata->wrappeddata != NULL) { - newdata->wrappeddata = - PyArray_CopyStridedTransferData(d->wrappeddata); + newdata->wrappeddata = NPY_AUXDATA_CLONE(d->wrappeddata); if (newdata->wrappeddata == NULL) { PyArray_free(newdata); return NULL; } } if (newdata->todata != NULL) { - newdata->todata = PyArray_CopyStridedTransferData(d->todata); + newdata->todata = NPY_AUXDATA_CLONE(d->todata); if (newdata->todata == NULL) { - PyArray_FreeStridedTransferData(newdata->wrappeddata); + NPY_AUXDATA_FREE(newdata->wrappeddata); PyArray_free(newdata); return NULL; } } if (newdata->fromdata != NULL) { - newdata->fromdata = PyArray_CopyStridedTransferData(d->fromdata); + newdata->fromdata = NPY_AUXDATA_CLONE(d->fromdata); if (newdata->fromdata == NULL) { - PyArray_FreeStridedTransferData(newdata->wrappeddata); - PyArray_FreeStridedTransferData(newdata->todata); + NPY_AUXDATA_FREE(newdata->wrappeddata); + NPY_AUXDATA_FREE(newdata->todata); PyArray_free(newdata); return NULL; } } - return (void *)newdata; + return (NpyAuxData *)newdata; } static void _strided_to_strided_contig_align_wrap(char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp src_itemsize, - void *data) + NpyAuxData *data) { _align_wrap_data *d = (_align_wrap_data *)data; PyArray_StridedTransferFn *wrapped = d->wrapped, @@ -335,7 +329,7 @@ _strided_to_strided_contig_align_wrap(char *dst, npy_intp dst_stride, *frombuffer = d->frombuffer; npy_intp inner_src_itemsize = d->src_itemsize, dst_itemsize = d->dst_itemsize; - void *wrappeddata = d->wrappeddata, + NpyAuxData *wrappeddata = d->wrappeddata, *todata = d->todata, *fromdata = d->fromdata; char *bufferin = d->bufferin, *bufferout = d->bufferout; @@ -371,7 +365,7 @@ static void _strided_to_strided_contig_align_wrap_init_dest(char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp src_itemsize, - void *data) + NpyAuxData *data) { _align_wrap_data *d = (_align_wrap_data *)data; PyArray_StridedTransferFn *wrapped = d->wrapped, @@ -379,7 +373,7 @@ _strided_to_strided_contig_align_wrap_init_dest(char *dst, npy_intp dst_stride, *frombuffer = d->frombuffer; npy_intp inner_src_itemsize = d->src_itemsize, dst_itemsize = d->dst_itemsize; - void *wrappeddata = d->wrappeddata, + NpyAuxData *wrappeddata = d->wrappeddata, *todata = d->todata, *fromdata = d->fromdata; char *bufferin = d->bufferin, *bufferout = d->bufferout; @@ -431,12 +425,12 @@ _strided_to_strided_contig_align_wrap_init_dest(char *dst, npy_intp dst_stride, NPY_NO_EXPORT int wrap_aligned_contig_transfer_function( npy_intp src_itemsize, npy_intp dst_itemsize, - PyArray_StridedTransferFn *tobuffer, void *todata, - PyArray_StridedTransferFn *frombuffer, void *fromdata, - PyArray_StridedTransferFn *wrapped, void *wrappeddata, + PyArray_StridedTransferFn *tobuffer, NpyAuxData *todata, + PyArray_StridedTransferFn *frombuffer, NpyAuxData *fromdata, + PyArray_StridedTransferFn *wrapped, NpyAuxData *wrappeddata, int init_dest, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata) + NpyAuxData **out_transferdata) { _align_wrap_data *data; npy_intp basedatasize, datasize; @@ -454,8 +448,8 @@ wrap_aligned_contig_transfer_function( PyErr_NoMemory(); return NPY_FAIL; } - data->freefunc = &_align_wrap_data_free; - data->copyfunc = &_align_wrap_data_copy; + data->base.free = &_align_wrap_data_free; + data->base.clone = &_align_wrap_data_clone; data->tobuffer = tobuffer; data->todata = todata; data->frombuffer = frombuffer; @@ -475,7 +469,7 @@ wrap_aligned_contig_transfer_function( else { *out_stransfer = &_strided_to_strided_contig_align_wrap; } - *out_transferdata = data; + *out_transferdata = (NpyAuxData *)data; return NPY_SUCCEED; } @@ -483,15 +477,14 @@ wrap_aligned_contig_transfer_function( /*************************** WRAP DTYPE COPY/SWAP *************************/ /* Wraps the dtype copy swap function */ typedef struct { - free_strided_transfer_data freefunc; - copy_strided_transfer_data copyfunc; + NpyAuxData base; PyArray_CopySwapNFunc *copyswapn; int swap; PyArrayObject *arr; } _wrap_copy_swap_data; /* wrap copy swap data free function */ -void _wrap_copy_swap_data_free(void *data) +void _wrap_copy_swap_data_free(NpyAuxData *data) { _wrap_copy_swap_data *d = (_wrap_copy_swap_data *)data; Py_DECREF(d->arr); @@ -499,7 +492,7 @@ void _wrap_copy_swap_data_free(void *data) } /* wrap copy swap data copy function */ -void *_wrap_copy_swap_data_copy(void *data) +NpyAuxData *_wrap_copy_swap_data_clone(NpyAuxData *data) { _wrap_copy_swap_data *newdata = (_wrap_copy_swap_data *)PyArray_malloc(sizeof(_wrap_copy_swap_data)); @@ -510,14 +503,14 @@ void *_wrap_copy_swap_data_copy(void *data) memcpy(newdata, data, sizeof(_wrap_copy_swap_data)); Py_INCREF(newdata->arr); - return (void *)newdata; + return (NpyAuxData *)newdata; } static void _strided_to_strided_wrap_copy_swap(char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp NPY_UNUSED(src_itemsize), - void *data) + NpyAuxData *data) { _wrap_copy_swap_data *d = (_wrap_copy_swap_data *)data; @@ -531,7 +524,7 @@ wrap_copy_swap_function(int aligned, PyArray_Descr *dtype, int should_swap, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata) + NpyAuxData **out_transferdata) { _wrap_copy_swap_data *data; npy_intp shape = 1; @@ -545,8 +538,8 @@ wrap_copy_swap_function(int aligned, return NPY_FAIL; } - data->freefunc = &_wrap_copy_swap_data_free; - data->copyfunc = &_wrap_copy_swap_data_copy; + data->base.free = &_wrap_copy_swap_data_free; + data->base.clone = &_wrap_copy_swap_data_clone; data->copyswapn = dtype->f->copyswapn; data->swap = should_swap; @@ -563,7 +556,7 @@ wrap_copy_swap_function(int aligned, } *out_stransfer = &_strided_to_strided_wrap_copy_swap; - *out_transferdata = data; + *out_transferdata = (NpyAuxData *)data; return NPY_SUCCEED; } @@ -572,14 +565,13 @@ wrap_copy_swap_function(int aligned, /* Does a simple aligned cast */ typedef struct { - free_strided_transfer_data freefunc; - copy_strided_transfer_data copyfunc; + NpyAuxData base; PyArray_VectorUnaryFunc *castfunc; PyArrayObject *aip, *aop; } _strided_cast_data; /* strided cast data free function */ -void _strided_cast_data_free(void *data) +void _strided_cast_data_free(NpyAuxData *data) { _strided_cast_data *d = (_strided_cast_data *)data; Py_DECREF(d->aip); @@ -588,7 +580,7 @@ void _strided_cast_data_free(void *data) } /* strided cast data copy function */ -void *_strided_cast_data_copy(void *data) +NpyAuxData *_strided_cast_data_clone(NpyAuxData *data) { _strided_cast_data *newdata = (_strided_cast_data *)PyArray_malloc(sizeof(_strided_cast_data)); @@ -600,14 +592,14 @@ void *_strided_cast_data_copy(void *data) Py_INCREF(newdata->aip); Py_INCREF(newdata->aop); - return (void *)newdata; + return (NpyAuxData *)newdata; } static void _aligned_strided_to_strided_cast(char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp src_itemsize, - void *data) + NpyAuxData *data) { _strided_cast_data *d = (_strided_cast_data *)data; PyArray_VectorUnaryFunc *castfunc = d->castfunc; @@ -626,7 +618,7 @@ static void _aligned_strided_to_strided_cast_decref_src(char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp src_itemsize, - void *data) + NpyAuxData *data) { _strided_cast_data *d = (_strided_cast_data *)data; PyArray_VectorUnaryFunc *castfunc = d->castfunc; @@ -651,7 +643,7 @@ static void _aligned_contig_to_contig_cast(char *dst, npy_intp NPY_UNUSED(dst_stride), char *src, npy_intp NPY_UNUSED(src_stride), npy_intp N, npy_intp NPY_UNUSED(itemsize), - void *data) + NpyAuxData *data) { _strided_cast_data *d = (_strided_cast_data *)data; @@ -663,7 +655,7 @@ get_nbo_cast_numeric_transfer_function(int aligned, npy_intp src_stride, npy_intp dst_stride, int src_type_num, int dst_type_num, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata) + NpyAuxData **out_transferdata) { /* Emit a warning if complex imaginary is being cast away */ if (PyTypeNum_ISCOMPLEX(src_type_num) && @@ -709,8 +701,7 @@ get_nbo_cast_numeric_transfer_function(int aligned, * datetime->ascii, or ascii->datetime cast */ typedef struct { - free_strided_transfer_data freefunc; - copy_strided_transfer_data copyfunc; + NpyAuxData base; /* The conversion fraction */ npy_int64 num, denom; /* For the datetime -> string conversion, the dst string length */ @@ -730,7 +721,7 @@ typedef struct { } _strided_datetime_cast_data; /* strided datetime cast data free function */ -void _strided_datetime_cast_data_free(void *data) +void _strided_datetime_cast_data_free(NpyAuxData *data) { _strided_datetime_cast_data *d = (_strided_datetime_cast_data *)data; if (d->tmp_buffer != NULL) { @@ -740,7 +731,7 @@ void _strided_datetime_cast_data_free(void *data) } /* strided datetime cast data copy function */ -void *_strided_datetime_cast_data_copy(void *data) +NpyAuxData *_strided_datetime_cast_data_clone(NpyAuxData *data) { _strided_datetime_cast_data *newdata = (_strided_datetime_cast_data *)PyArray_malloc( @@ -758,14 +749,14 @@ void *_strided_datetime_cast_data_copy(void *data) } } - return (void *)newdata; + return (NpyAuxData *)newdata; } static void _strided_to_strided_datetime_general_cast(char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp src_itemsize, - void *data) + NpyAuxData *data) { _strided_datetime_cast_data *d = (_strided_datetime_cast_data *)data; npy_int64 dt; @@ -797,7 +788,7 @@ static void _strided_to_strided_datetime_cast(char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp src_itemsize, - void *data) + NpyAuxData *data) { _strided_datetime_cast_data *d = (_strided_datetime_cast_data *)data; npy_int64 num = d->num, denom = d->denom; @@ -829,7 +820,7 @@ _aligned_strided_to_strided_datetime_cast(char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp src_itemsize, - void *data) + NpyAuxData *data) { _strided_datetime_cast_data *d = (_strided_datetime_cast_data *)data; npy_int64 num = d->num, denom = d->denom; @@ -860,7 +851,7 @@ static void _strided_to_strided_datetime_to_string(char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp NPY_UNUSED(src_itemsize), - void *data) + NpyAuxData *data) { _strided_datetime_cast_data *d = (_strided_datetime_cast_data *)data; npy_intp dst_itemsize = d->dst_itemsize; @@ -897,7 +888,7 @@ static void _strided_to_strided_string_to_datetime(char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp src_itemsize, - void *data) + NpyAuxData *data) { _strided_datetime_cast_data *d = (_strided_datetime_cast_data *)data; npy_int64 dt; @@ -952,7 +943,7 @@ get_nbo_cast_datetime_transfer_function(int aligned, npy_intp src_stride, npy_intp dst_stride, PyArray_Descr *src_dtype, PyArray_Descr *dst_dtype, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata) + NpyAuxData **out_transferdata) { PyArray_DatetimeMetaData *src_meta, *dst_meta; npy_int64 num = 0, denom = 0; @@ -982,8 +973,8 @@ get_nbo_cast_datetime_transfer_function(int aligned, *out_transferdata = NULL; return NPY_FAIL; } - data->freefunc = &_strided_datetime_cast_data_free; - data->copyfunc = &_strided_datetime_cast_data_copy; + data->base.free = &_strided_datetime_cast_data_free; + data->base.clone = &_strided_datetime_cast_data_clone; data->num = num; data->denom = denom; data->tmp_buffer = NULL; @@ -1008,7 +999,7 @@ get_nbo_cast_datetime_transfer_function(int aligned, else { *out_stransfer = &_strided_to_strided_datetime_cast; } - *out_transferdata = data; + *out_transferdata = (NpyAuxData *)data; #if NPY_DT_DBG_TRACING printf("Dtype transfer from "); @@ -1028,7 +1019,7 @@ get_nbo_datetime_to_string_transfer_function(int aligned, npy_intp src_stride, npy_intp dst_stride, PyArray_Descr *src_dtype, PyArray_Descr *dst_dtype, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata) + NpyAuxData **out_transferdata) { PyArray_DatetimeMetaData *src_meta; _strided_datetime_cast_data *data; @@ -1047,15 +1038,15 @@ get_nbo_datetime_to_string_transfer_function(int aligned, *out_transferdata = NULL; return NPY_FAIL; } - data->freefunc = &_strided_datetime_cast_data_free; - data->copyfunc = &_strided_datetime_cast_data_copy; + data->base.free = &_strided_datetime_cast_data_free; + data->base.clone = &_strided_datetime_cast_data_clone; data->dst_itemsize = dst_dtype->elsize; data->tmp_buffer = NULL; memcpy(&data->src_meta, src_meta, sizeof(data->src_meta)); *out_stransfer = &_strided_to_strided_datetime_to_string; - *out_transferdata = data; + *out_transferdata = (NpyAuxData *)data; #if NPY_DT_DBG_TRACING printf("Dtype transfer from "); @@ -1073,10 +1064,10 @@ get_datetime_to_unicode_transfer_function(int aligned, npy_intp src_stride, npy_intp dst_stride, PyArray_Descr *src_dtype, PyArray_Descr *dst_dtype, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata, + NpyAuxData **out_transferdata, int *out_needs_api) { - void *castdata = NULL, *todata = NULL, *fromdata = NULL; + NpyAuxData *castdata = NULL, *todata = NULL, *fromdata = NULL; PyArray_StridedTransferFn *caststransfer, *tobuffer, *frombuffer; PyArray_Descr *str_dtype; @@ -1102,7 +1093,7 @@ get_datetime_to_unicode_transfer_function(int aligned, src_dtype, str_dtype, &caststransfer, &castdata) != NPY_SUCCEED) { Py_DECREF(str_dtype); - PyArray_FreeStridedTransferData(todata); + NPY_AUXDATA_FREE(todata); return NPY_FAIL; } @@ -1114,8 +1105,8 @@ get_datetime_to_unicode_transfer_function(int aligned, &frombuffer, &fromdata, out_needs_api) != NPY_SUCCEED) { Py_DECREF(str_dtype); - PyArray_FreeStridedTransferData(todata); - PyArray_FreeStridedTransferData(castdata); + NPY_AUXDATA_FREE(todata); + NPY_AUXDATA_FREE(castdata); return NPY_FAIL; } @@ -1127,9 +1118,9 @@ get_datetime_to_unicode_transfer_function(int aligned, caststransfer, castdata, PyDataType_FLAGCHK(str_dtype, NPY_NEEDS_INIT), out_stransfer, out_transferdata) != NPY_SUCCEED) { - PyArray_FreeStridedTransferData(castdata); - PyArray_FreeStridedTransferData(todata); - PyArray_FreeStridedTransferData(fromdata); + NPY_AUXDATA_FREE(castdata); + NPY_AUXDATA_FREE(todata); + NPY_AUXDATA_FREE(fromdata); return NPY_FAIL; } @@ -1143,7 +1134,7 @@ get_nbo_string_to_datetime_transfer_function(int aligned, npy_intp src_stride, npy_intp dst_stride, PyArray_Descr *src_dtype, PyArray_Descr *dst_dtype, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata) + NpyAuxData **out_transferdata) { PyArray_DatetimeMetaData *dst_meta; _strided_datetime_cast_data *data; @@ -1162,8 +1153,8 @@ get_nbo_string_to_datetime_transfer_function(int aligned, *out_transferdata = NULL; return NPY_FAIL; } - data->freefunc = &_strided_datetime_cast_data_free; - data->copyfunc = &_strided_datetime_cast_data_copy; + data->base.free = &_strided_datetime_cast_data_free; + data->base.clone = &_strided_datetime_cast_data_clone; data->src_itemsize = src_dtype->elsize; data->tmp_buffer = PyArray_malloc(data->src_itemsize + 1); if (data->tmp_buffer == NULL) { @@ -1177,7 +1168,7 @@ get_nbo_string_to_datetime_transfer_function(int aligned, memcpy(&data->dst_meta, dst_meta, sizeof(data->dst_meta)); *out_stransfer = &_strided_to_strided_string_to_datetime; - *out_transferdata = data; + *out_transferdata = (NpyAuxData *)data; #if NPY_DT_DBG_TRACING printf("Dtype transfer from "); @@ -1195,10 +1186,10 @@ get_unicode_to_datetime_transfer_function(int aligned, npy_intp src_stride, npy_intp dst_stride, PyArray_Descr *src_dtype, PyArray_Descr *dst_dtype, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata, + NpyAuxData **out_transferdata, int *out_needs_api) { - void *castdata = NULL, *todata = NULL, *fromdata = NULL; + NpyAuxData *castdata = NULL, *todata = NULL, *fromdata = NULL; PyArray_StridedTransferFn *caststransfer, *tobuffer, *frombuffer; PyArray_Descr *str_dtype; @@ -1226,7 +1217,7 @@ get_unicode_to_datetime_transfer_function(int aligned, str_dtype, dst_dtype, &caststransfer, &castdata) != NPY_SUCCEED) { Py_DECREF(str_dtype); - PyArray_FreeStridedTransferData(todata); + NPY_AUXDATA_FREE(todata); return NPY_FAIL; } @@ -1236,8 +1227,8 @@ get_unicode_to_datetime_transfer_function(int aligned, dst_dtype, &frombuffer, &fromdata) != NPY_SUCCEED) { Py_DECREF(str_dtype); - PyArray_FreeStridedTransferData(todata); - PyArray_FreeStridedTransferData(castdata); + NPY_AUXDATA_FREE(todata); + NPY_AUXDATA_FREE(castdata); return NPY_FAIL; } @@ -1250,9 +1241,9 @@ get_unicode_to_datetime_transfer_function(int aligned, PyDataType_FLAGCHK(dst_dtype, NPY_NEEDS_INIT), out_stransfer, out_transferdata) != NPY_SUCCEED) { Py_DECREF(str_dtype); - PyArray_FreeStridedTransferData(castdata); - PyArray_FreeStridedTransferData(todata); - PyArray_FreeStridedTransferData(fromdata); + NPY_AUXDATA_FREE(castdata); + NPY_AUXDATA_FREE(todata); + NPY_AUXDATA_FREE(fromdata); return NPY_FAIL; } @@ -1267,7 +1258,7 @@ get_nbo_cast_transfer_function(int aligned, PyArray_Descr *src_dtype, PyArray_Descr *dst_dtype, int move_references, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata, + NpyAuxData **out_transferdata, int *out_needs_api, int *out_needs_wrap) { @@ -1393,8 +1384,8 @@ get_nbo_cast_transfer_function(int aligned, *out_transferdata = NULL; return NPY_FAIL; } - data->freefunc = &_strided_cast_data_free; - data->copyfunc = &_strided_cast_data_copy; + data->base.free = &_strided_cast_data_free; + data->base.clone = &_strided_cast_data_clone; data->castfunc = castfunc; /* * TODO: This is a hack so the cast functions have an array. @@ -1463,7 +1454,7 @@ get_nbo_cast_transfer_function(int aligned, *out_stransfer = _aligned_strided_to_strided_cast; } } - *out_transferdata = data; + *out_transferdata = (NpyAuxData *)data; return NPY_SUCCEED; } @@ -1474,11 +1465,11 @@ get_cast_transfer_function(int aligned, PyArray_Descr *src_dtype, PyArray_Descr *dst_dtype, int move_references, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata, + NpyAuxData **out_transferdata, int *out_needs_api) { PyArray_StridedTransferFn *caststransfer; - void *castdata, *todata = NULL, *fromdata = NULL; + NpyAuxData *castdata, *todata = NULL, *fromdata = NULL; int needs_wrap = 0; npy_intp src_itemsize = src_dtype->elsize, dst_itemsize = dst_dtype->elsize; @@ -1530,9 +1521,9 @@ get_cast_transfer_function(int aligned, &frombuffer, &fromdata); if (frombuffer == NULL || tobuffer == NULL) { - PyArray_FreeStridedTransferData(castdata); - PyArray_FreeStridedTransferData(todata); - PyArray_FreeStridedTransferData(fromdata); + NPY_AUXDATA_FREE(castdata); + NPY_AUXDATA_FREE(todata); + NPY_AUXDATA_FREE(fromdata); return NPY_FAIL; } @@ -1546,9 +1537,9 @@ get_cast_transfer_function(int aligned, caststransfer, castdata, PyDataType_FLAGCHK(dst_dtype, NPY_NEEDS_INIT), out_stransfer, out_transferdata) != NPY_SUCCEED) { - PyArray_FreeStridedTransferData(castdata); - PyArray_FreeStridedTransferData(todata); - PyArray_FreeStridedTransferData(fromdata); + NPY_AUXDATA_FREE(castdata); + NPY_AUXDATA_FREE(todata); + NPY_AUXDATA_FREE(fromdata); return NPY_FAIL; } @@ -1560,27 +1551,26 @@ get_cast_transfer_function(int aligned, /* Copies 1 element to N contiguous elements */ typedef struct { - free_strided_transfer_data freefunc; - copy_strided_transfer_data copyfunc; + NpyAuxData base; PyArray_StridedTransferFn *stransfer; - void *data; + NpyAuxData *data; npy_intp N, dst_itemsize; /* If this is non-NULL the source type has references needing a decref */ PyArray_StridedTransferFn *stransfer_finish_src; - void *data_finish_src; + NpyAuxData *data_finish_src; } _one_to_n_data; /* transfer data free function */ -void _one_to_n_data_free(void *data) +void _one_to_n_data_free(NpyAuxData *data) { _one_to_n_data *d = (_one_to_n_data *)data; - PyArray_FreeStridedTransferData(d->data); - PyArray_FreeStridedTransferData(d->data_finish_src); + NPY_AUXDATA_FREE(d->data); + NPY_AUXDATA_FREE(d->data_finish_src); PyArray_free(data); } /* transfer data copy function */ -void *_one_to_n_data_copy(void *data) +NpyAuxData *_one_to_n_data_clone(NpyAuxData *data) { _one_to_n_data *d = (_one_to_n_data *)data; _one_to_n_data *newdata; @@ -1592,34 +1582,33 @@ void *_one_to_n_data_copy(void *data) } memcpy(newdata, data, sizeof(_one_to_n_data)); if (d->data != NULL) { - newdata->data = PyArray_CopyStridedTransferData(d->data); + newdata->data = NPY_AUXDATA_CLONE(d->data); if (newdata->data == NULL) { PyArray_free(newdata); return NULL; } } if (d->data_finish_src != NULL) { - newdata->data_finish_src = - PyArray_CopyStridedTransferData(d->data_finish_src); + newdata->data_finish_src = NPY_AUXDATA_CLONE(d->data_finish_src); if (newdata->data_finish_src == NULL) { - PyArray_FreeStridedTransferData(newdata->data); + NPY_AUXDATA_FREE(newdata->data); PyArray_free(newdata); return NULL; } } - return (void *)newdata; + return (NpyAuxData *)newdata; } static void _strided_to_strided_one_to_n(char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp src_itemsize, - void *data) + NpyAuxData *data) { _one_to_n_data *d = (_one_to_n_data *)data; PyArray_StridedTransferFn *subtransfer = d->stransfer; - void *subdata = d->data; + NpyAuxData *subdata = d->data; npy_intp subN = d->N, dst_itemsize = d->dst_itemsize; while (N > 0) { @@ -1638,12 +1627,12 @@ static void _strided_to_strided_one_to_n_with_finish(char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp src_itemsize, - void *data) + NpyAuxData *data) { _one_to_n_data *d = (_one_to_n_data *)data; PyArray_StridedTransferFn *subtransfer = d->stransfer, *stransfer_finish_src = d->stransfer_finish_src; - void *subdata = d->data, *data_finish_src = data_finish_src; + NpyAuxData *subdata = d->data, *data_finish_src = data_finish_src; npy_intp subN = d->N, dst_itemsize = d->dst_itemsize; while (N > 0) { @@ -1673,13 +1662,13 @@ _strided_to_strided_one_to_n_with_finish(char *dst, npy_intp dst_stride, static int wrap_transfer_function_one_to_n( PyArray_StridedTransferFn *stransfer_inner, - void *data_inner, + NpyAuxData *data_inner, PyArray_StridedTransferFn *stransfer_finish_src, - void *data_finish_src, + NpyAuxData *data_finish_src, npy_intp dst_itemsize, npy_intp N, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata) + NpyAuxData **out_transferdata) { _one_to_n_data *data; @@ -1690,8 +1679,8 @@ wrap_transfer_function_one_to_n( return NPY_FAIL; } - data->freefunc = &_one_to_n_data_free; - data->copyfunc = &_one_to_n_data_copy; + data->base.free = &_one_to_n_data_free; + data->base.clone = &_one_to_n_data_clone; data->stransfer = stransfer_inner; data->data = data_inner; data->stransfer_finish_src = stransfer_finish_src; @@ -1705,7 +1694,7 @@ wrap_transfer_function_one_to_n( else { *out_stransfer = &_strided_to_strided_one_to_n_with_finish; } - *out_transferdata = data; + *out_transferdata = (NpyAuxData *)data; return NPY_SUCCEED; } @@ -1717,11 +1706,11 @@ get_one_to_n_transfer_function(int aligned, int move_references, npy_intp N, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata, + NpyAuxData **out_transferdata, int *out_needs_api) { PyArray_StridedTransferFn *stransfer, *stransfer_finish_src = NULL; - void *data, *data_finish_src = NULL; + NpyAuxData *data, *data_finish_src = NULL; /* * move_references is set to 0, handled in the wrapping transfer fn, @@ -1746,7 +1735,7 @@ get_one_to_n_transfer_function(int aligned, &stransfer_finish_src, &data_finish_src, out_needs_api) != NPY_SUCCEED) { - PyArray_FreeStridedTransferData(data); + NPY_AUXDATA_FREE(data); return NPY_FAIL; } } @@ -1756,8 +1745,8 @@ get_one_to_n_transfer_function(int aligned, dst_dtype->elsize, N, out_stransfer, out_transferdata) != NPY_SUCCEED) { - PyArray_FreeStridedTransferData(data); - PyArray_FreeStridedTransferData(data_finish_src); + NPY_AUXDATA_FREE(data); + NPY_AUXDATA_FREE(data_finish_src); return NPY_FAIL; } @@ -1768,23 +1757,22 @@ get_one_to_n_transfer_function(int aligned, /* Copies N contiguous elements to N contiguous elements */ typedef struct { - free_strided_transfer_data freefunc; - copy_strided_transfer_data copyfunc; + NpyAuxData base; PyArray_StridedTransferFn *stransfer; - void *data; + NpyAuxData *data; npy_intp N, src_itemsize, dst_itemsize; } _n_to_n_data; /* transfer data free function */ -void _n_to_n_data_free(void *data) +void _n_to_n_data_free(NpyAuxData *data) { _n_to_n_data *d = (_n_to_n_data *)data; - PyArray_FreeStridedTransferData(d->data); + NPY_AUXDATA_FREE(d->data); PyArray_free(data); } /* transfer data copy function */ -void *_n_to_n_data_copy(void *data) +NpyAuxData *_n_to_n_data_clone(NpyAuxData *data) { _n_to_n_data *d = (_n_to_n_data *)data; _n_to_n_data *newdata; @@ -1796,25 +1784,25 @@ void *_n_to_n_data_copy(void *data) } memcpy(newdata, data, sizeof(_n_to_n_data)); if (newdata->data != NULL) { - newdata->data = PyArray_CopyStridedTransferData(d->data); + newdata->data = NPY_AUXDATA_CLONE(d->data); if (newdata->data == NULL) { PyArray_free(newdata); return NULL; } } - return (void *)newdata; + return (NpyAuxData *)newdata; } static void _strided_to_strided_n_to_n(char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp src_itemsize, - void *data) + NpyAuxData *data) { _n_to_n_data *d = (_n_to_n_data *)data; PyArray_StridedTransferFn *subtransfer = d->stransfer; - void *subdata = d->data; + NpyAuxData *subdata = d->data; npy_intp subN = d->N, src_subitemsize = d->src_itemsize, dst_subitemsize = d->dst_itemsize; @@ -1834,11 +1822,11 @@ static void _contig_to_contig_n_to_n(char *dst, npy_intp NPY_UNUSED(dst_stride), char *src, npy_intp NPY_UNUSED(src_stride), npy_intp N, npy_intp NPY_UNUSED(src_itemsize), - void *data) + NpyAuxData *data) { _n_to_n_data *d = (_n_to_n_data *)data; PyArray_StridedTransferFn *subtransfer = d->stransfer; - void *subdata = d->data; + NpyAuxData *subdata = d->data; npy_intp subN = d->N, src_subitemsize = d->src_itemsize, dst_subitemsize = d->dst_itemsize; @@ -1855,12 +1843,12 @@ _contig_to_contig_n_to_n(char *dst, npy_intp NPY_UNUSED(dst_stride), static int wrap_transfer_function_n_to_n( PyArray_StridedTransferFn *stransfer_inner, - void *data_inner, + NpyAuxData *data_inner, npy_intp src_stride, npy_intp dst_stride, npy_intp src_itemsize, npy_intp dst_itemsize, npy_intp N, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata) + NpyAuxData **out_transferdata) { _n_to_n_data *data; @@ -1870,8 +1858,8 @@ wrap_transfer_function_n_to_n( return NPY_FAIL; } - data->freefunc = &_n_to_n_data_free; - data->copyfunc = &_n_to_n_data_copy; + data->base.free = &_n_to_n_data_free; + data->base.clone = &_n_to_n_data_clone; data->stransfer = stransfer_inner; data->data = data_inner; data->N = N; @@ -1889,7 +1877,7 @@ wrap_transfer_function_n_to_n( else { *out_stransfer = &_strided_to_strided_n_to_n; } - *out_transferdata = data; + *out_transferdata = (NpyAuxData *)data; return NPY_SUCCEED; } @@ -1901,11 +1889,11 @@ get_n_to_n_transfer_function(int aligned, int move_references, npy_intp N, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata, + NpyAuxData **out_transferdata, int *out_needs_api) { PyArray_StridedTransferFn *stransfer; - void *data; + NpyAuxData *data; /* * src_stride and dst_stride are set to contiguous, because @@ -1926,7 +1914,7 @@ get_n_to_n_transfer_function(int aligned, N, out_stransfer, out_transferdata) != NPY_SUCCEED) { - PyArray_FreeStridedTransferData(data); + NPY_AUXDATA_FREE(data); return NPY_FAIL; } @@ -1941,32 +1929,31 @@ typedef struct { /* Copies element with subarray broadcasting */ typedef struct { - free_strided_transfer_data freefunc; - copy_strided_transfer_data copyfunc; + NpyAuxData base; PyArray_StridedTransferFn *stransfer; - void *data; + NpyAuxData *data; npy_intp src_N, dst_N, src_itemsize, dst_itemsize; PyArray_StridedTransferFn *stransfer_decsrcref; - void *data_decsrcref; + NpyAuxData *data_decsrcref; PyArray_StridedTransferFn *stransfer_decdstref; - void *data_decdstref; + NpyAuxData *data_decdstref; /* This gets a run-length encoded representation of the transfer */ npy_intp run_count; _subarray_broadcast_offsetrun offsetruns; } _subarray_broadcast_data; /* transfer data free function */ -void _subarray_broadcast_data_free(void *data) +void _subarray_broadcast_data_free(NpyAuxData *data) { _subarray_broadcast_data *d = (_subarray_broadcast_data *)data; - PyArray_FreeStridedTransferData(d->data); - PyArray_FreeStridedTransferData(d->data_decsrcref); - PyArray_FreeStridedTransferData(d->data_decdstref); + NPY_AUXDATA_FREE(d->data); + NPY_AUXDATA_FREE(d->data_decsrcref); + NPY_AUXDATA_FREE(d->data_decdstref); PyArray_free(data); } /* transfer data copy function */ -void *_subarray_broadcast_data_copy( void *data) +NpyAuxData *_subarray_broadcast_data_clone( NpyAuxData *data) { _subarray_broadcast_data *d = (_subarray_broadcast_data *)data; _subarray_broadcast_data *newdata; @@ -1982,44 +1969,42 @@ void *_subarray_broadcast_data_copy( void *data) } memcpy(newdata, data, structsize); if (d->data != NULL) { - newdata->data = PyArray_CopyStridedTransferData(d->data); + newdata->data = NPY_AUXDATA_CLONE(d->data); if (newdata->data == NULL) { PyArray_free(newdata); return NULL; } } if (d->data_decsrcref != NULL) { - newdata->data_decsrcref = - PyArray_CopyStridedTransferData(d->data_decsrcref); + newdata->data_decsrcref = NPY_AUXDATA_CLONE(d->data_decsrcref); if (newdata->data_decsrcref == NULL) { - PyArray_FreeStridedTransferData(newdata->data); + NPY_AUXDATA_FREE(newdata->data); PyArray_free(newdata); return NULL; } } if (d->data_decdstref != NULL) { - newdata->data_decdstref = - PyArray_CopyStridedTransferData(d->data_decdstref); + newdata->data_decdstref = NPY_AUXDATA_CLONE(d->data_decdstref); if (newdata->data_decdstref == NULL) { - PyArray_FreeStridedTransferData(newdata->data); - PyArray_FreeStridedTransferData(newdata->data_decsrcref); + NPY_AUXDATA_FREE(newdata->data); + NPY_AUXDATA_FREE(newdata->data_decsrcref); PyArray_free(newdata); return NULL; } } - return newdata; + return (NpyAuxData *)newdata; } static void _strided_to_strided_subarray_broadcast(char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp NPY_UNUSED(src_itemsize), - void *data) + NpyAuxData *data) { _subarray_broadcast_data *d = (_subarray_broadcast_data *)data; PyArray_StridedTransferFn *subtransfer = d->stransfer; - void *subdata = d->data; + NpyAuxData *subdata = d->data; npy_intp run, run_count = d->run_count, src_subitemsize = d->src_itemsize, dst_subitemsize = d->dst_itemsize; @@ -2056,15 +2041,15 @@ static void _strided_to_strided_subarray_broadcast_withrefs(char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp NPY_UNUSED(src_itemsize), - void *data) + NpyAuxData *data) { _subarray_broadcast_data *d = (_subarray_broadcast_data *)data; PyArray_StridedTransferFn *subtransfer = d->stransfer; - void *subdata = d->data; + NpyAuxData *subdata = d->data; PyArray_StridedTransferFn *stransfer_decsrcref = d->stransfer_decsrcref; - void *data_decsrcref = d->data_decsrcref; + NpyAuxData *data_decsrcref = d->data_decsrcref; PyArray_StridedTransferFn *stransfer_decdstref = d->stransfer_decdstref; - void *data_decdstref = d->data_decdstref; + NpyAuxData *data_decdstref = d->data_decdstref; npy_intp run, run_count = d->run_count, src_subitemsize = d->src_itemsize, dst_subitemsize = d->dst_itemsize, @@ -2117,7 +2102,7 @@ get_subarray_broadcast_transfer_function(int aligned, PyArray_Dims src_shape, PyArray_Dims dst_shape, int move_references, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata, + NpyAuxData **out_transferdata, int *out_needs_api) { _subarray_broadcast_data *data; @@ -2149,8 +2134,8 @@ get_subarray_broadcast_transfer_function(int aligned, PyArray_free(data); return NPY_FAIL; } - data->freefunc = &_subarray_broadcast_data_free; - data->copyfunc = &_subarray_broadcast_data_copy; + data->base.free = &_subarray_broadcast_data_free; + data->base.clone = &_subarray_broadcast_data_clone; data->src_N = src_size; data->dst_N = dst_size; data->src_itemsize = src_dtype->elsize; @@ -2165,7 +2150,7 @@ get_subarray_broadcast_transfer_function(int aligned, &data->stransfer_decsrcref, &data->data_decsrcref, out_needs_api) != NPY_SUCCEED) { - PyArray_FreeStridedTransferData(data->data); + NPY_AUXDATA_FREE(data->data); PyArray_free(data); return NPY_FAIL; } @@ -2184,8 +2169,8 @@ get_subarray_broadcast_transfer_function(int aligned, &data->stransfer_decdstref, &data->data_decdstref, out_needs_api) != NPY_SUCCEED) { - PyArray_FreeStridedTransferData(data->data); - PyArray_FreeStridedTransferData(data->data_decsrcref); + NPY_AUXDATA_FREE(data->data); + NPY_AUXDATA_FREE(data->data_decsrcref); PyArray_free(data); return NPY_FAIL; } @@ -2289,7 +2274,7 @@ get_subarray_broadcast_transfer_function(int aligned, else { *out_stransfer = &_strided_to_strided_subarray_broadcast_withrefs; } - *out_transferdata = data; + *out_transferdata = (NpyAuxData *)data; return NPY_SUCCEED; } @@ -2304,7 +2289,7 @@ get_subarray_transfer_function(int aligned, PyArray_Descr *src_dtype, PyArray_Descr *dst_dtype, int move_references, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata, + NpyAuxData **out_transferdata, int *out_needs_api) { PyArray_Dims src_shape = {NULL, -1}, dst_shape = {NULL, -1}; @@ -2401,19 +2386,18 @@ get_subarray_transfer_function(int aligned, typedef struct { npy_intp src_offset, dst_offset, src_itemsize; PyArray_StridedTransferFn *stransfer; - void *data; + NpyAuxData *data; } _single_field_transfer; typedef struct { - free_strided_transfer_data freefunc; - copy_strided_transfer_data copyfunc; + NpyAuxData base; npy_intp field_count; _single_field_transfer fields; } _field_transfer_data; /* transfer data free function */ -void _field_transfer_data_free(void *data) +void _field_transfer_data_free(NpyAuxData *data) { _field_transfer_data *d = (_field_transfer_data *)data; npy_intp i, field_count; @@ -2423,13 +2407,13 @@ void _field_transfer_data_free(void *data) fields = &d->fields; for (i = 0; i < field_count; ++i) { - PyArray_FreeStridedTransferData(fields[i].data); + NPY_AUXDATA_FREE(fields[i].data); } PyArray_free(d); } /* transfer data copy function */ -void *_field_transfer_data_copy(void *data) +NpyAuxData *_field_transfer_data_clone(NpyAuxData *data) { _field_transfer_data *d = (_field_transfer_data *)data; _field_transfer_data *newdata; @@ -2450,11 +2434,10 @@ void *_field_transfer_data_copy(void *data) newfields = &newdata->fields; for (i = 0; i < field_count; ++i) { if (fields[i].data != NULL) { - newfields[i].data = - PyArray_CopyStridedTransferData(fields[i].data); + newfields[i].data = NPY_AUXDATA_CLONE(fields[i].data); if (newfields[i].data == NULL) { for (i = i-1; i >= 0; --i) { - PyArray_FreeStridedTransferData(newfields[i].data); + NPY_AUXDATA_FREE(newfields[i].data); } PyArray_free(newdata); return NULL; @@ -2463,14 +2446,14 @@ void *_field_transfer_data_copy(void *data) } - return (void *)newdata; + return (NpyAuxData *)newdata; } static void _strided_to_strided_field_transfer(char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp NPY_UNUSED(src_itemsize), - void *data) + NpyAuxData *data) { _field_transfer_data *d = (_field_transfer_data *)data; npy_intp i, field_count = d->field_count; @@ -2514,7 +2497,7 @@ get_fields_transfer_function(int aligned, PyArray_Descr *src_dtype, PyArray_Descr *dst_dtype, int move_references, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata, + NpyAuxData **out_transferdata, int *out_needs_api) { PyObject *names, *key, *tup, *title; @@ -2538,8 +2521,8 @@ get_fields_transfer_function(int aligned, PyErr_NoMemory(); return NPY_FAIL; } - data->freefunc = &_field_transfer_data_free; - data->copyfunc = &_field_transfer_data_copy; + data->base.free = &_field_transfer_data_free; + data->base.clone = &_field_transfer_data_clone; fields = &data->fields; for (i = 0; i < names_size; ++i) { @@ -2558,7 +2541,7 @@ get_fields_transfer_function(int aligned, &fields[i].data, out_needs_api) != NPY_SUCCEED) { for (i = i-1; i >= 0; --i) { - PyArray_FreeStridedTransferData(fields[i].data); + NPY_AUXDATA_FREE(fields[i].data); } PyArray_free(data); return NPY_FAIL; @@ -2580,7 +2563,7 @@ get_fields_transfer_function(int aligned, &fields[field_count].data, out_needs_api) != NPY_SUCCEED) { for (i = 0; i < field_count; ++i) { - PyArray_FreeStridedTransferData(fields[i].data); + NPY_AUXDATA_FREE(fields[i].data); } PyArray_free(data); return NPY_FAIL; @@ -2593,7 +2576,7 @@ get_fields_transfer_function(int aligned, data->field_count = field_count; *out_stransfer = &_strided_to_strided_field_transfer; - *out_transferdata = data; + *out_transferdata = (NpyAuxData *)data; return NPY_SUCCEED; } @@ -2620,8 +2603,8 @@ get_fields_transfer_function(int aligned, PyErr_NoMemory(); return NPY_FAIL; } - data->freefunc = &_field_transfer_data_free; - data->copyfunc = &_field_transfer_data_copy; + data->base.free = &_field_transfer_data_free; + data->base.clone = &_field_transfer_data_clone; fields = &data->fields; key = PyTuple_GET_ITEM(names, 0); @@ -2659,7 +2642,7 @@ get_fields_transfer_function(int aligned, &fields[field_count].stransfer, &fields[field_count].data, out_needs_api) != NPY_SUCCEED) { - PyArray_FreeStridedTransferData(fields[0].data); + NPY_AUXDATA_FREE(fields[0].data); PyArray_free(data); return NPY_FAIL; } @@ -2708,7 +2691,7 @@ get_fields_transfer_function(int aligned, &fields[field_count].data, out_needs_api) != NPY_SUCCEED) { for (i = field_count-1; i >= 0; --i) { - PyArray_FreeStridedTransferData(fields[i].data); + NPY_AUXDATA_FREE(fields[i].data); } PyArray_free(data); return NPY_FAIL; @@ -2724,7 +2707,7 @@ get_fields_transfer_function(int aligned, data->field_count = field_count; *out_stransfer = &_strided_to_strided_field_transfer; - *out_transferdata = data; + *out_transferdata = (NpyAuxData *)data; return NPY_SUCCEED; } @@ -2759,8 +2742,8 @@ get_fields_transfer_function(int aligned, Py_XDECREF(used_names_dict); return NPY_FAIL; } - data->freefunc = &_field_transfer_data_free; - data->copyfunc = &_field_transfer_data_copy; + data->base.free = &_field_transfer_data_free; + data->base.clone = &_field_transfer_data_clone; fields = &data->fields; for (i = 0; i < names_size; ++i) { @@ -2769,7 +2752,7 @@ get_fields_transfer_function(int aligned, if (!PyArg_ParseTuple(tup, "Oi|O", &dst_fld_dtype, &dst_offset, &title)) { for (i = i-1; i >= 0; --i) { - PyArray_FreeStridedTransferData(fields[i].data); + NPY_AUXDATA_FREE(fields[i].data); } PyArray_free(data); Py_XDECREF(used_names_dict); @@ -2780,7 +2763,7 @@ get_fields_transfer_function(int aligned, if (!PyArg_ParseTuple(tup, "Oi|O", &src_fld_dtype, &src_offset, &title)) { for (i = i-1; i >= 0; --i) { - PyArray_FreeStridedTransferData(fields[i].data); + NPY_AUXDATA_FREE(fields[i].data); } PyArray_free(data); Py_XDECREF(used_names_dict); @@ -2794,7 +2777,7 @@ get_fields_transfer_function(int aligned, &fields[i].data, out_needs_api) != NPY_SUCCEED) { for (i = i-1; i >= 0; --i) { - PyArray_FreeStridedTransferData(fields[i].data); + NPY_AUXDATA_FREE(fields[i].data); } PyArray_free(data); Py_XDECREF(used_names_dict); @@ -2816,7 +2799,7 @@ get_fields_transfer_function(int aligned, &fields[i].data, out_needs_api) != NPY_SUCCEED) { for (i = i-1; i >= 0; --i) { - PyArray_FreeStridedTransferData(fields[i].data); + NPY_AUXDATA_FREE(fields[i].data); } PyArray_free(data); Py_XDECREF(used_names_dict); @@ -2841,7 +2824,7 @@ get_fields_transfer_function(int aligned, if (!PyArg_ParseTuple(tup, "Oi|O", &src_fld_dtype, &src_offset, &title)) { for (i = field_count-1; i >= 0; --i) { - PyArray_FreeStridedTransferData(fields[i].data); + NPY_AUXDATA_FREE(fields[i].data); } PyArray_free(data); Py_XDECREF(used_names_dict); @@ -2855,7 +2838,7 @@ get_fields_transfer_function(int aligned, &fields[field_count].data, out_needs_api) != NPY_SUCCEED) { for (i = field_count-1; i >= 0; --i) { - PyArray_FreeStridedTransferData(fields[i].data); + NPY_AUXDATA_FREE(fields[i].data); } PyArray_free(data); return NPY_FAIL; @@ -2875,7 +2858,7 @@ get_fields_transfer_function(int aligned, data->field_count = field_count; *out_stransfer = &_strided_to_strided_field_transfer; - *out_transferdata = data; + *out_transferdata = (NpyAuxData *)data; return NPY_SUCCEED; } @@ -2886,7 +2869,7 @@ get_decsrcref_fields_transfer_function(int aligned, npy_intp src_stride, PyArray_Descr *src_dtype, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata, + NpyAuxData **out_transferdata, int *out_needs_api) { PyObject *names, *key, *tup, *title; @@ -2908,8 +2891,8 @@ get_decsrcref_fields_transfer_function(int aligned, PyErr_NoMemory(); return NPY_FAIL; } - data->freefunc = &_field_transfer_data_free; - data->copyfunc = &_field_transfer_data_copy; + data->base.free = &_field_transfer_data_free; + data->base.clone = &_field_transfer_data_clone; fields = &data->fields; field_count = 0; @@ -2932,7 +2915,7 @@ get_decsrcref_fields_transfer_function(int aligned, &fields[field_count].data, out_needs_api) != NPY_SUCCEED) { for (i = field_count-1; i >= 0; --i) { - PyArray_FreeStridedTransferData(fields[i].data); + NPY_AUXDATA_FREE(fields[i].data); } PyArray_free(data); return NPY_FAIL; @@ -2947,7 +2930,7 @@ get_decsrcref_fields_transfer_function(int aligned, data->field_count = field_count; *out_stransfer = &_strided_to_strided_field_transfer; - *out_transferdata = data; + *out_transferdata = (NpyAuxData *)data; return NPY_SUCCEED; } @@ -2957,7 +2940,7 @@ get_setdestzero_fields_transfer_function(int aligned, npy_intp dst_stride, PyArray_Descr *dst_dtype, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata, + NpyAuxData **out_transferdata, int *out_needs_api) { PyObject *names, *key, *tup, *title; @@ -2979,8 +2962,8 @@ get_setdestzero_fields_transfer_function(int aligned, PyErr_NoMemory(); return NPY_FAIL; } - data->freefunc = &_field_transfer_data_free; - data->copyfunc = &_field_transfer_data_copy; + data->base.free = &_field_transfer_data_free; + data->base.clone = &_field_transfer_data_clone; fields = &data->fields; for (i = 0; i < names_size; ++i) { @@ -2998,7 +2981,7 @@ get_setdestzero_fields_transfer_function(int aligned, &fields[i].data, out_needs_api) != NPY_SUCCEED) { for (i = i-1; i >= 0; --i) { - PyArray_FreeStridedTransferData(fields[i].data); + NPY_AUXDATA_FREE(fields[i].data); } PyArray_free(data); return NPY_FAIL; @@ -3011,7 +2994,7 @@ get_setdestzero_fields_transfer_function(int aligned, data->field_count = field_count; *out_stransfer = &_strided_to_strided_field_transfer; - *out_transferdata = data; + *out_transferdata = (NpyAuxData *)data; return NPY_SUCCEED; } @@ -3023,7 +3006,7 @@ _null_to_strided_set_bool_one(char *dst, npy_intp dst_stride, char *NPY_UNUSED(src), npy_intp NPY_UNUSED(src_stride), npy_intp N, npy_intp NPY_UNUSED(src_itemsize), - void *NPY_UNUSED(data)) + NpyAuxData *NPY_UNUSED(data)) { /* bool type is one byte, so can just use the char */ @@ -3040,7 +3023,7 @@ _null_to_contig_set_bool_one(char *dst, npy_intp NPY_UNUSED(dst_stride), char *NPY_UNUSED(src), npy_intp NPY_UNUSED(src_stride), npy_intp N, npy_intp NPY_UNUSED(src_itemsize), - void *NPY_UNUSED(data)) + NpyAuxData *NPY_UNUSED(data)) { /* bool type is one byte, so can just use the char */ @@ -3051,7 +3034,7 @@ _null_to_contig_set_bool_one(char *dst, NPY_NO_EXPORT int get_bool_setdstone_transfer_function(npy_intp dst_stride, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata, + NpyAuxData **out_transferdata, int *NPY_UNUSED(out_needs_api)) { if (dst_stride == 1) { @@ -3069,13 +3052,12 @@ get_bool_setdstone_transfer_function(npy_intp dst_stride, /* Sets dest to zero */ typedef struct { - free_strided_transfer_data freefunc; - copy_strided_transfer_data copyfunc; + NpyAuxData base; npy_intp dst_itemsize; } _dst_memset_zero_data; /* zero-padded data copy function */ -void *_dst_memset_zero_data_copy(void *data) +NpyAuxData *_dst_memset_zero_data_clone(NpyAuxData *data) { _dst_memset_zero_data *newdata = (_dst_memset_zero_data *)PyArray_malloc( @@ -3086,7 +3068,7 @@ void *_dst_memset_zero_data_copy(void *data) memcpy(newdata, data, sizeof(_dst_memset_zero_data)); - return newdata; + return (NpyAuxData *)newdata; } static void @@ -3094,7 +3076,7 @@ _null_to_strided_memset_zero(char *dst, npy_intp dst_stride, char *NPY_UNUSED(src), npy_intp NPY_UNUSED(src_stride), npy_intp N, npy_intp NPY_UNUSED(src_itemsize), - void *data) + NpyAuxData *data) { _dst_memset_zero_data *d = (_dst_memset_zero_data *)data; npy_intp dst_itemsize = d->dst_itemsize; @@ -3111,7 +3093,7 @@ _null_to_contig_memset_zero(char *dst, npy_intp dst_stride, char *NPY_UNUSED(src), npy_intp NPY_UNUSED(src_stride), npy_intp N, npy_intp NPY_UNUSED(src_itemsize), - void *data) + NpyAuxData *data) { _dst_memset_zero_data *d = (_dst_memset_zero_data *)data; npy_intp dst_itemsize = d->dst_itemsize; @@ -3124,7 +3106,7 @@ _null_to_strided_reference_setzero(char *dst, npy_intp dst_stride, char *NPY_UNUSED(src), npy_intp NPY_UNUSED(src_stride), npy_intp N, npy_intp NPY_UNUSED(src_itemsize), - void *NPY_UNUSED(data)) + NpyAuxData *NPY_UNUSED(data)) { PyObject *dst_ref = NULL; @@ -3149,7 +3131,7 @@ get_setdstzero_transfer_function(int aligned, npy_intp dst_stride, PyArray_Descr *dst_dtype, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata, + NpyAuxData **out_transferdata, int *out_needs_api) { _dst_memset_zero_data *data; @@ -3163,8 +3145,8 @@ get_setdstzero_transfer_function(int aligned, return NPY_FAIL; } - data->freefunc = &PyArray_free; - data->copyfunc = &_dst_memset_zero_data_copy; + data->base.free = (NpyAuxData_FreeFunc *)(&PyArray_free); + data->base.clone = &_dst_memset_zero_data_clone; data->dst_itemsize = dst_dtype->elsize; if (dst_stride == data->dst_itemsize) { @@ -3173,7 +3155,7 @@ get_setdstzero_transfer_function(int aligned, else { *out_stransfer = &_null_to_strided_memset_zero; } - *out_transferdata = data; + *out_transferdata = (NpyAuxData *)data; } /* If it's exactly one reference, use the decref function */ else if (dst_dtype->type_num == NPY_OBJECT) { @@ -3189,7 +3171,7 @@ get_setdstzero_transfer_function(int aligned, PyArray_Dims dst_shape = {NULL, -1}; npy_intp dst_size = 1; PyArray_StridedTransferFn *contig_stransfer; - void *contig_data; + NpyAuxData *contig_data; if (out_needs_api) { *out_needs_api = 1; @@ -3218,7 +3200,7 @@ get_setdstzero_transfer_function(int aligned, 0, dst_dtype->subarray->base->elsize, dst_size, out_stransfer, out_transferdata) != NPY_SUCCEED) { - PyArray_FreeStridedTransferData(contig_data); + NPY_AUXDATA_FREE(contig_data); return NPY_FAIL; } } @@ -3244,7 +3226,7 @@ _dec_src_ref_nop(char *NPY_UNUSED(dst), char *NPY_UNUSED(src), npy_intp NPY_UNUSED(src_stride), npy_intp NPY_UNUSED(N), npy_intp NPY_UNUSED(src_itemsize), - void *NPY_UNUSED(data)) + NpyAuxData *NPY_UNUSED(data)) { /* NOP */ } @@ -3255,7 +3237,7 @@ _strided_to_null_dec_src_ref_reference(char *NPY_UNUSED(dst), char *src, npy_intp src_stride, npy_intp N, npy_intp NPY_UNUSED(src_itemsize), - void *NPY_UNUSED(data)) + NpyAuxData *NPY_UNUSED(data)) { PyObject *src_ref = NULL; while (N > 0) { @@ -3276,7 +3258,7 @@ get_decsrcref_transfer_function(int aligned, npy_intp src_stride, PyArray_Descr *src_dtype, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata, + NpyAuxData **out_transferdata, int *out_needs_api) { /* If there are no references, it's a nop */ @@ -3302,7 +3284,7 @@ get_decsrcref_transfer_function(int aligned, PyArray_Dims src_shape = {NULL, -1}; npy_intp src_size = 1; PyArray_StridedTransferFn *stransfer; - void *data; + NpyAuxData *data; if (out_needs_api) { *out_needs_api = 1; @@ -3331,7 +3313,7 @@ get_decsrcref_transfer_function(int aligned, src_dtype->subarray->base->elsize, 0, src_size, out_stransfer, out_transferdata) != NPY_SUCCEED) { - PyArray_FreeStridedTransferData(data); + NPY_AUXDATA_FREE(data); return NPY_FAIL; } @@ -3358,7 +3340,7 @@ PyArray_GetDTypeCopySwapFn(int aligned, npy_intp src_stride, npy_intp dst_stride, PyArray_Descr *dtype, PyArray_StridedTransferFn **outstransfer, - void **outtransferdata) + NpyAuxData **outtransferdata) { npy_intp itemsize = dtype->elsize; @@ -3404,7 +3386,7 @@ PyArray_GetDTypeTransferFunction(int aligned, PyArray_Descr *src_dtype, PyArray_Descr *dst_dtype, int move_references, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata, + NpyAuxData **out_transferdata, int *out_needs_api) { npy_intp src_itemsize, dst_itemsize; @@ -3628,7 +3610,7 @@ PyArray_CastRawArrays(npy_intp count, int move_references) { PyArray_StridedTransferFn *stransfer = NULL; - void *transferdata = NULL; + NpyAuxData *transferdata = NULL; int aligned = 1, needs_api = 0; /* Make sure the copy is reasonable */ @@ -3662,7 +3644,7 @@ PyArray_CastRawArrays(npy_intp count, src_dtype->elsize, transferdata); /* Cleanup */ - PyArray_FreeStridedTransferData(transferdata); + NPY_AUXDATA_FREE(transferdata); /* If needs_api was set to 1, it may have raised a Python exception */ return (needs_api && PyErr_Occurred()) ? NPY_FAIL : NPY_SUCCEED; diff --git a/numpy/core/src/multiarray/lowlevel_strided_loops.c.src b/numpy/core/src/multiarray/lowlevel_strided_loops.c.src index 4c6f3dada..ab1918e0e 100644 --- a/numpy/core/src/multiarray/lowlevel_strided_loops.c.src +++ b/numpy/core/src/multiarray/lowlevel_strided_loops.c.src @@ -126,7 +126,7 @@ static void @prefix@_@oper@_size@elsize@(char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp NPY_UNUSED(src_itemsize), - void *NPY_UNUSED(data)) + NpyAuxData *NPY_UNUSED(data)) { /*printf("fn @prefix@_@oper@_size@elsize@\n");*/ while (N > 0) { @@ -186,7 +186,7 @@ static void npy_intp dst_stride, char *src, npy_intp NPY_UNUSED(src_stride), npy_intp N, npy_intp NPY_UNUSED(src_itemsize), - void *NPY_UNUSED(data)) + NpyAuxData *NPY_UNUSED(data)) { #if @elsize@ != 16 @type@ temp = @swap@@elsize@(*((@type@ *)src)); @@ -231,7 +231,7 @@ static void _strided_to_strided(char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp src_itemsize, - void *NPY_UNUSED(data)) + NpyAuxData *NPY_UNUSED(data)) { while (N > 0) { memcpy(dst, src, src_itemsize); @@ -245,7 +245,7 @@ static void _swap_strided_to_strided(char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp src_itemsize, - void *NPY_UNUSED(data)) + NpyAuxData *NPY_UNUSED(data)) { char *a, *b, c; @@ -270,7 +270,7 @@ static void _swap_pair_strided_to_strided(char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp src_itemsize, - void *NPY_UNUSED(data)) + NpyAuxData *NPY_UNUSED(data)) { char *a, *b, c; npy_intp itemsize_half = src_itemsize / 2; @@ -305,7 +305,7 @@ static void _contig_to_contig(char *dst, npy_intp NPY_UNUSED(dst_stride), char *src, npy_intp NPY_UNUSED(src_stride), npy_intp N, npy_intp src_itemsize, - void *NPY_UNUSED(data)) + NpyAuxData *NPY_UNUSED(data)) { memcpy(dst, src, src_itemsize*N); } @@ -763,7 +763,7 @@ static void char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp NPY_UNUSED(src_itemsize), - void *NPY_UNUSED(data)) + NpyAuxData *NPY_UNUSED(data)) { #if @is_complex1@ _TYPE1 src_value[2]; @@ -919,32 +919,6 @@ PyArray_GetStridedNumericCastFn(int aligned, npy_intp src_stride, } -/************** STRIDED TRANSFER FUNCTION MEMORY MANAGEMENT **************/ - -typedef void (*_npy_stridedtransfer_dealloc)(void *); -NPY_NO_EXPORT void -PyArray_FreeStridedTransferData(void *transferdata) -{ - if (transferdata != NULL) { - _npy_stridedtransfer_dealloc dealloc = - *((_npy_stridedtransfer_dealloc *)transferdata); - dealloc(transferdata); - } -} - -typedef void *(*_npy_stridedtransfer_copy)(void *); -NPY_NO_EXPORT void * -PyArray_CopyStridedTransferData(void *transferdata) -{ - if (transferdata != NULL) { - _npy_stridedtransfer_copy copy = - *((_npy_stridedtransfer_copy *)transferdata + 1); - return copy(transferdata); - } - - return NULL; -} - /****************** PRIMITIVE FLAT TO/FROM NDIM FUNCTIONS ******************/ NPY_NO_EXPORT npy_intp @@ -955,7 +929,7 @@ PyArray_TransferNDimToStrided(npy_intp ndim, npy_intp *shape, npy_intp shape_inc, npy_intp count, npy_intp src_itemsize, PyArray_StridedTransferFn *stransfer, - void *data) + NpyAuxData *data) { npy_intp i, M, N, coord0, shape0, src_stride0, coord1, shape1, src_stride1; @@ -1073,7 +1047,7 @@ PyArray_TransferStridedToNDim(npy_intp ndim, npy_intp *shape, npy_intp shape_inc, npy_intp count, npy_intp src_itemsize, PyArray_StridedTransferFn *stransfer, - void *data) + NpyAuxData *data) { npy_intp i, M, N, coord0, shape0, dst_stride0, coord1, shape1, dst_stride1; diff --git a/numpy/core/src/multiarray/nditer.c.src b/numpy/core/src/multiarray/nditer.c.src index fd106ec73..d8758bdfa 100644 --- a/numpy/core/src/multiarray/nditer.c.src +++ b/numpy/core/src/multiarray/nditer.c.src @@ -232,11 +232,11 @@ struct NpyIter_BD { (&(bufferdata)->bd_flexdata + 3*(nop))) #define NBF_READTRANSFERFN(bufferdata) ((PyArray_StridedTransferFn **) \ (&(bufferdata)->bd_flexdata + 4*(nop))) -#define NBF_READTRANSFERDATA(bufferdata) ((void **) \ +#define NBF_READTRANSFERDATA(bufferdata) ((NpyAuxData **) \ (&(bufferdata)->bd_flexdata + 5*(nop))) #define NBF_WRITETRANSFERFN(bufferdata) ((PyArray_StridedTransferFn **) \ (&(bufferdata)->bd_flexdata + 6*(nop))) -#define NBF_WRITETRANSFERDATA(bufferdata) ((void **) \ +#define NBF_WRITETRANSFERDATA(bufferdata) ((NpyAuxData **) \ (&(bufferdata)->bd_flexdata + 7*(nop))) #define NBF_BUFFERS(bufferdata) ((char **) \ (&(bufferdata)->bd_flexdata + 8*(nop))) @@ -841,7 +841,7 @@ NpyIter_Copy(NpyIter *iter) NpyIter_BufferData *bufferdata; npy_intp buffersize, itemsize; char **buffers; - void **readtransferdata, **writetransferdata; + NpyAuxData **readtransferdata, **writetransferdata; bufferdata = NIT_BUFFERDATA(newiter); buffers = NBF_BUFFERS(bufferdata); @@ -869,7 +869,7 @@ NpyIter_Copy(NpyIter *iter) } else { readtransferdata[iop] = - PyArray_CopyStridedTransferData(readtransferdata[iop]); + NPY_AUXDATA_CLONE(readtransferdata[iop]); if (readtransferdata[iop] == NULL) { out_of_memory = 1; } @@ -882,7 +882,7 @@ NpyIter_Copy(NpyIter *iter) } else { writetransferdata[iop] = - PyArray_CopyStridedTransferData(writetransferdata[iop]); + NPY_AUXDATA_CLONE(writetransferdata[iop]); if (writetransferdata[iop] == NULL) { out_of_memory = 1; } @@ -925,7 +925,7 @@ NpyIter_Deallocate(NpyIter *iter) if (itflags&NPY_ITFLAG_BUFFER) { NpyIter_BufferData *bufferdata = NIT_BUFFERDATA(iter); char **buffers; - void **transferdata; + NpyAuxData **transferdata; /* buffers */ buffers = NBF_BUFFERS(bufferdata); @@ -938,14 +938,14 @@ NpyIter_Deallocate(NpyIter *iter) transferdata = NBF_READTRANSFERDATA(bufferdata); for(iop = 0; iop < nop; ++iop, ++transferdata) { if (*transferdata) { - PyArray_FreeStridedTransferData(*transferdata); + NPY_AUXDATA_FREE(*transferdata); } } /* write bufferdata */ transferdata = NBF_WRITETRANSFERDATA(bufferdata); for(iop = 0; iop < nop; ++iop, ++transferdata) { if (*transferdata) { - PyArray_FreeStridedTransferData(*transferdata); + NPY_AUXDATA_FREE(*transferdata); } } } @@ -5057,11 +5057,11 @@ npyiter_allocate_transfer_functions(NpyIter *iter) npy_intp *strides = NAD_STRIDES(axisdata), op_stride; PyArray_StridedTransferFn **readtransferfn = NBF_READTRANSFERFN(bufferdata), **writetransferfn = NBF_WRITETRANSFERFN(bufferdata); - void **readtransferdata = NBF_READTRANSFERDATA(bufferdata), - **writetransferdata = NBF_WRITETRANSFERDATA(bufferdata); + NpyAuxData **readtransferdata = NBF_READTRANSFERDATA(bufferdata), + **writetransferdata = NBF_WRITETRANSFERDATA(bufferdata); PyArray_StridedTransferFn *stransfer = NULL; - void *transferdata = NULL; + NpyAuxData *transferdata = NULL; int needs_api = 0; for (iop = 0; iop < nop; ++iop) { @@ -5155,11 +5155,11 @@ npyiter_allocate_transfer_functions(NpyIter *iter) fail: for (i = 0; i < iop; ++i) { if (readtransferdata[iop] != NULL) { - PyArray_FreeStridedTransferData(readtransferdata[iop]); + NPY_AUXDATA_FREE(readtransferdata[iop]); readtransferdata[iop] = NULL; } if (writetransferdata[iop] != NULL) { - PyArray_FreeStridedTransferData(writetransferdata[iop]); + NPY_AUXDATA_FREE(writetransferdata[iop]); writetransferdata[iop] = NULL; } } @@ -5336,7 +5336,7 @@ npyiter_copy_from_buffers(NpyIter *iter) npy_intp *reduce_outerstrides = NULL; PyArray_StridedTransferFn *stransfer = NULL; - void *transferdata = NULL; + NpyAuxData *transferdata = NULL; npy_intp axisdata_incr = NIT_AXISDATA_SIZEOF(itflags, ndim, nop) / NPY_SIZEOF_INTP; @@ -5503,7 +5503,7 @@ npyiter_copy_to_buffers(NpyIter *iter, char **prev_dataptrs) char **reduce_outerptrs = NULL; PyArray_StridedTransferFn *stransfer = NULL; - void *transferdata = NULL; + NpyAuxData *transferdata = NULL; /* * Have to get this flag before npyiter_checkreducesize sets diff --git a/numpy/core/src/private/lowlevel_strided_loops.h b/numpy/core/src/private/lowlevel_strided_loops.h index fddeb7c21..a1f183e50 100644 --- a/numpy/core/src/private/lowlevel_strided_loops.h +++ b/numpy/core/src/private/lowlevel_strided_loops.h @@ -16,31 +16,15 @@ * Examples of transfer functions are a straight copy, a byte-swap, * and a casting operation, * - * The 'transferdata' parameter is slightly special, and must always contain - * pointer to deallocation and copying routines at its beginning. The function - * PyArray_FreeStridedTransferData should be used to deallocate such - * pointers, and calls the first function pointer, while the function - * PyArray_CopyStridedTransferData should be used to copy it. + * The 'transferdata' parameter is slightly special, following a + * generic auxiliary data pattern defined in ndarraytypes.h + * Use NPY_AUXDATA_CLONE and NPY_AUXDATA_FREE to deal with this data. * */ typedef void (PyArray_StridedTransferFn)(char *dst, npy_intp dst_stride, char *src, npy_intp src_stride, npy_intp N, npy_intp src_itemsize, - void *transferdata); - -/* - * Deallocates a PyArray_StridedTransferFunction data object. See - * the comment with the function typedef for more details. - */ -NPY_NO_EXPORT void -PyArray_FreeStridedTransferData(void *transferdata); - -/* - * Copies a PyArray_StridedTransferFunction data object. See - * the comment with the function typedef for more details. - */ -NPY_NO_EXPORT void * -PyArray_CopyStridedTransferData(void *transferdata); + NpyAuxData *transferdata); /* * Gives back a function pointer to a specialized function for copying @@ -109,7 +93,7 @@ PyArray_GetStridedZeroPadCopyFn(int aligned, npy_intp src_stride, npy_intp dst_stride, npy_intp src_itemsize, npy_intp dst_itemsize, PyArray_StridedTransferFn **outstransfer, - void **outtransferdata); + NpyAuxData **outtransferdata); /* * For casts between built-in numeric types, @@ -133,7 +117,7 @@ PyArray_GetDTypeCopySwapFn(int aligned, npy_intp src_stride, npy_intp dst_stride, PyArray_Descr *dtype, PyArray_StridedTransferFn **outstransfer, - void **outtransferdata); + NpyAuxData **outtransferdata); /* * If it's possible, gives back a transfer function which casts and/or @@ -186,7 +170,7 @@ PyArray_GetDTypeTransferFunction(int aligned, PyArray_Descr *src_dtype, PyArray_Descr *dst_dtype, int move_references, PyArray_StridedTransferFn **out_stransfer, - void **out_transferdata, + NpyAuxData **out_transferdata, int *out_needs_api); /* @@ -253,7 +237,7 @@ PyArray_TransferNDimToStrided(npy_intp ndim, npy_intp *shape, npy_intp shape_inc, npy_intp count, npy_intp src_itemsize, PyArray_StridedTransferFn *stransfer, - void *transferdata); + NpyAuxData *transferdata); NPY_NO_EXPORT npy_intp PyArray_TransferStridedToNDim(npy_intp ndim, @@ -263,7 +247,7 @@ PyArray_TransferStridedToNDim(npy_intp ndim, npy_intp *shape, npy_intp shape_inc, npy_intp count, npy_intp src_itemsize, PyArray_StridedTransferFn *stransfer, - void *transferdata); + NpyAuxData *transferdata); /* * TRIVIAL ITERATION |