The declaration of the PyBuffer_FromContiguous uses order as the name of its last parameter, which is fine for C and Fortran styles, but in its definition, it uses fort as the name of the parameter!.
I think we should rename fort to order and reflect that on the function documentation. Also, we should replace fort in the function comment.
|
PyAPI_FUNC(int) PyBuffer_FromContiguous(const Py_buffer *view, const void *buf, |
|
Py_ssize_t len, char order); |
|
|
|
/* Copy len bytes of data from the contiguous chunk of memory |
|
pointed to by buf into the buffer exported by obj. Return |
|
0 on success and return -1 and raise a PyBuffer_Error on |
|
error (i.e. the object does not have a buffer interface or |
|
it is not working). |
|
|
|
If fort is 'F', then if the object is multi-dimensional, |
|
then the data will be copied into the array in |
|
Fortran-style (first dimension varies the fastest). If |
|
fort is 'C', then the data will be copied into the array |
|
in C-style (last dimension varies the fastest). If fort |
|
is 'A', then it does not matter and the copy will be made |
|
in whatever way is more efficient. */ |
|
PyBuffer_FromContiguous(const Py_buffer *view, const void *buf, Py_ssize_t len, char fort) |
|
{ |
|
int k; |
|
void (*addone)(int, Py_ssize_t *, const Py_ssize_t *); |
|
Py_ssize_t *indices, elements; |
|
char *ptr; |
|
const char *src; |
|
|
|
if (len > view->len) { |
|
len = view->len; |
|
} |
|
|
|
if (PyBuffer_IsContiguous(view, fort)) { |
|
/* simplest copy is all that is needed */ |
|
memcpy(view->buf, buf, len); |
|
return 0; |
|
} |
|
|
|
/* Otherwise a more elaborate scheme is needed */ |
|
|
|
/* view->ndim <= 64 */ |
|
indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*(view->ndim)); |
|
if (indices == NULL) { |
|
PyErr_NoMemory(); |
|
return -1; |
|
} |
|
for (k=0; k<view->ndim;k++) { |
|
indices[k] = 0; |
|
} |
|
|
|
if (fort == 'F') { |
|
addone = _Py_add_one_to_index_F; |
|
} |
|
else { |
|
addone = _Py_add_one_to_index_C; |
|
} |
|
src = buf; |
|
/* XXX : This is not going to be the fastest code in the world |
|
several optimizations are possible. |
|
*/ |
|
elements = len / view->itemsize; |
|
while (elements--) { |
|
ptr = PyBuffer_GetPointer(view, indices); |
|
memcpy(ptr, src, view->itemsize); |
|
src += view->itemsize; |
|
addone(view->ndim, indices, view->shape); |
|
} |
|
|
|
PyMem_Free(indices); |
|
return 0; |
|
} |
Linked PRs
The declaration of the
PyBuffer_FromContiguoususesorderas the name of its last parameter, which is fine for C and Fortran styles, but in its definition, it usesfortas the name of the parameter!.I think we should rename
forttoorderand reflect that on the function documentation. Also, we should replacefortin the function comment.cpython/Include/pybuffer.h
Lines 61 to 76 in 797c2c3
cpython/Objects/abstract.c
Lines 617 to 667 in 797c2c3
Linked PRs