bpo-46140: take more Py_buffer arguments as const * (GH-30217)

This commit is contained in:
David Hewitt 2021-12-22 13:07:46 +00:00 committed by GitHub
parent fc54e722a2
commit 31ff96712e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 23 additions and 22 deletions

View File

@ -470,27 +470,27 @@ Buffer-related functions
.. versionadded:: 3.9 .. versionadded:: 3.9
.. c:function:: int PyBuffer_IsContiguous(Py_buffer *view, char order) .. c:function:: int PyBuffer_IsContiguous(const Py_buffer *view, char order)
Return ``1`` if the memory defined by the *view* is C-style (*order* is Return ``1`` if the memory defined by the *view* is C-style (*order* is
``'C'``) or Fortran-style (*order* is ``'F'``) :term:`contiguous` or either one ``'C'``) or Fortran-style (*order* is ``'F'``) :term:`contiguous` or either one
(*order* is ``'A'``). Return ``0`` otherwise. This function always succeeds. (*order* is ``'A'``). Return ``0`` otherwise. This function always succeeds.
.. c:function:: void* PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices) .. c:function:: void* PyBuffer_GetPointer(const Py_buffer *view, const Py_ssize_t *indices)
Get the memory area pointed to by the *indices* inside the given *view*. Get the memory area pointed to by the *indices* inside the given *view*.
*indices* must point to an array of ``view->ndim`` indices. *indices* must point to an array of ``view->ndim`` indices.
.. c:function:: int PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort) .. c:function:: int PyBuffer_FromContiguous(const Py_buffer *view, const void *buf, Py_ssize_t len, char fort)
Copy contiguous *len* bytes from *buf* to *view*. Copy contiguous *len* bytes from *buf* to *view*.
*fort* can be ``'C'`` or ``'F'`` (for C-style or Fortran-style ordering). *fort* can be ``'C'`` or ``'F'`` (for C-style or Fortran-style ordering).
``0`` is returned on success, ``-1`` on error. ``0`` is returned on success, ``-1`` on error.
.. c:function:: int PyBuffer_ToContiguous(void *buf, Py_buffer *src, Py_ssize_t len, char order) .. c:function:: int PyBuffer_ToContiguous(void *buf, const Py_buffer *src, Py_ssize_t len, char order)
Copy *len* bytes from *src* to its contiguous representation in *buf*. Copy *len* bytes from *src* to its contiguous representation in *buf*.
*order* can be ``'C'`` or ``'F'`` or ``'A'`` (for C-style or Fortran-style *order* can be ``'C'`` or ``'F'`` or ``'A'`` (for C-style or Fortran-style

View File

@ -27,7 +27,7 @@ any other object.
.. versionadded:: 3.3 .. versionadded:: 3.3
.. c:function:: PyObject *PyMemoryView_FromBuffer(Py_buffer *view) .. c:function:: PyObject *PyMemoryView_FromBuffer(const Py_buffer *view)
Create a memoryview object wrapping the given buffer structure *view*. Create a memoryview object wrapping the given buffer structure *view*.
For simple byte buffers, :c:func:`PyMemoryView_FromMemory` is the preferred For simple byte buffers, :c:func:`PyMemoryView_FromMemory` is the preferred
@ -61,4 +61,3 @@ any other object.
on or ``NULL`` if the memoryview has been created by one of the functions on or ``NULL`` if the memoryview has been created by one of the functions
:c:func:`PyMemoryView_FromMemory` or :c:func:`PyMemoryView_FromBuffer`. :c:func:`PyMemoryView_FromMemory` or :c:func:`PyMemoryView_FromBuffer`.
*mview* **must** be a memoryview instance. *mview* **must** be a memoryview instance.

View File

@ -183,17 +183,17 @@ PyAPI_FUNC(int) PyObject_GetBuffer(PyObject *obj, Py_buffer *view,
/* Get the memory area pointed to by the indices for the buffer given. /* Get the memory area pointed to by the indices for the buffer given.
Note that view->ndim is the assumed size of indices. */ Note that view->ndim is the assumed size of indices. */
PyAPI_FUNC(void *) PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices); PyAPI_FUNC(void *) PyBuffer_GetPointer(const Py_buffer *view, const Py_ssize_t *indices);
/* Return the implied itemsize of the data-format area from a /* Return the implied itemsize of the data-format area from a
struct-style description. */ struct-style description. */
PyAPI_FUNC(Py_ssize_t) PyBuffer_SizeFromFormat(const char *format); PyAPI_FUNC(Py_ssize_t) PyBuffer_SizeFromFormat(const char *format);
/* Implementation in memoryobject.c */ /* Implementation in memoryobject.c */
PyAPI_FUNC(int) PyBuffer_ToContiguous(void *buf, Py_buffer *view, PyAPI_FUNC(int) PyBuffer_ToContiguous(void *buf, const Py_buffer *view,
Py_ssize_t len, char order); Py_ssize_t len, char order);
PyAPI_FUNC(int) PyBuffer_FromContiguous(Py_buffer *view, void *buf, PyAPI_FUNC(int) PyBuffer_FromContiguous(const Py_buffer *view, const void *buf,
Py_ssize_t len, char order); Py_ssize_t len, char order);
/* Copy len bytes of data from the contiguous chunk of memory /* Copy len bytes of data from the contiguous chunk of memory

View File

@ -26,7 +26,7 @@ PyAPI_FUNC(PyObject *) PyMemoryView_FromMemory(char *mem, Py_ssize_t size,
int flags); int flags);
#endif #endif
#ifndef Py_LIMITED_API #ifndef Py_LIMITED_API
PyAPI_FUNC(PyObject *) PyMemoryView_FromBuffer(Py_buffer *info); PyAPI_FUNC(PyObject *) PyMemoryView_FromBuffer(const Py_buffer *info);
#endif #endif
PyAPI_FUNC(PyObject *) PyMemoryView_GetContiguous(PyObject *base, PyAPI_FUNC(PyObject *) PyMemoryView_GetContiguous(PyObject *base,
int buffertype, int buffertype,

View File

@ -0,0 +1 @@
:c:func:`PyBuffer_GetPointer`, :c:func:`PyBuffer_FromContiguous`, :c:func:`PyBuffer_ToContiguous` and :c:func:`PyMemoryView_FromBuffer` now take buffer info by ``const Py_buffer *`` instead of ``Py_buffer *``, as they do not need mutability. :c:func:`PyBuffer_FromContiguous` also now takes the source buffer as ``const void *``, and similarly :c:func:`PyBuffer_GetPointer` takes the strides as ``const Py_ssize_t *``.

View File

@ -474,7 +474,7 @@ PyBuffer_IsContiguous(const Py_buffer *view, char order)
void* void*
PyBuffer_GetPointer(Py_buffer *view, Py_ssize_t *indices) PyBuffer_GetPointer(const Py_buffer *view, const Py_ssize_t *indices)
{ {
char* pointer; char* pointer;
int i; int i;
@ -564,12 +564,13 @@ done:
} }
int int
PyBuffer_FromContiguous(Py_buffer *view, void *buf, Py_ssize_t len, char fort) PyBuffer_FromContiguous(const Py_buffer *view, const void *buf, Py_ssize_t len, char fort)
{ {
int k; int k;
void (*addone)(int, Py_ssize_t *, const Py_ssize_t *); void (*addone)(int, Py_ssize_t *, const Py_ssize_t *);
Py_ssize_t *indices, elements; Py_ssize_t *indices, elements;
char *src, *ptr; char *ptr;
const char *src;
if (len > view->len) { if (len > view->len) {
len = view->len; len = view->len;

View File

@ -389,7 +389,7 @@ copy_rec(const Py_ssize_t *shape, Py_ssize_t ndim, Py_ssize_t itemsize,
/* Faster copying of one-dimensional arrays. */ /* Faster copying of one-dimensional arrays. */
static int static int
copy_single(Py_buffer *dest, Py_buffer *src) copy_single(const Py_buffer *dest, const Py_buffer *src)
{ {
char *mem = NULL; char *mem = NULL;
@ -421,7 +421,7 @@ copy_single(Py_buffer *dest, Py_buffer *src)
structure. Copying is atomic, the function never fails with a partial structure. Copying is atomic, the function never fails with a partial
copy. */ copy. */
static int static int
copy_buffer(Py_buffer *dest, Py_buffer *src) copy_buffer(const Py_buffer *dest, const Py_buffer *src)
{ {
char *mem = NULL; char *mem = NULL;
@ -479,7 +479,7 @@ init_fortran_strides_from_shape(Py_buffer *view)
or 'A' (Any). Assumptions: src has PyBUF_FULL information, src->ndim >= 1, or 'A' (Any). Assumptions: src has PyBUF_FULL information, src->ndim >= 1,
len(mem) == src->len. */ len(mem) == src->len. */
static int static int
buffer_to_contiguous(char *mem, Py_buffer *src, char order) buffer_to_contiguous(char *mem, const Py_buffer *src, char order)
{ {
Py_buffer dest; Py_buffer dest;
Py_ssize_t *strides; Py_ssize_t *strides;
@ -755,7 +755,7 @@ PyMemoryView_FromMemory(char *mem, Py_ssize_t size, int flags)
without full information. Because of this fact init_shape_strides() without full information. Because of this fact init_shape_strides()
must be able to reconstruct missing values. */ must be able to reconstruct missing values. */
PyObject * PyObject *
PyMemoryView_FromBuffer(Py_buffer *info) PyMemoryView_FromBuffer(const Py_buffer *info)
{ {
_PyManagedBufferObject *mbuf; _PyManagedBufferObject *mbuf;
PyObject *mv; PyObject *mv;
@ -840,7 +840,7 @@ mbuf_copy_format(_PyManagedBufferObject *mbuf, const char *fmt)
passes the altered format pointer to PyBuffer_Release(). passes the altered format pointer to PyBuffer_Release().
*/ */
static PyObject * static PyObject *
memory_from_contiguous_copy(Py_buffer *src, char order) memory_from_contiguous_copy(const Py_buffer *src, char order)
{ {
_PyManagedBufferObject *mbuf; _PyManagedBufferObject *mbuf;
PyMemoryViewObject *mv; PyMemoryViewObject *mv;
@ -982,7 +982,7 @@ typedef struct {
} Py_buffer_full; } Py_buffer_full;
int int
PyBuffer_ToContiguous(void *buf, Py_buffer *src, Py_ssize_t len, char order) PyBuffer_ToContiguous(void *buf, const Py_buffer *src, Py_ssize_t len, char order)
{ {
Py_buffer_full *fb = NULL; Py_buffer_full *fb = NULL;
int ret; int ret;
@ -2271,7 +2271,7 @@ memory_repr(PyMemoryViewObject *self)
/**************************************************************************/ /**************************************************************************/
static char * static char *
lookup_dimension(Py_buffer *view, char *ptr, int dim, Py_ssize_t index) lookup_dimension(const Py_buffer *view, char *ptr, int dim, Py_ssize_t index)
{ {
Py_ssize_t nitems; /* items in the given dimension */ Py_ssize_t nitems; /* items in the given dimension */
@ -2297,7 +2297,7 @@ lookup_dimension(Py_buffer *view, char *ptr, int dim, Py_ssize_t index)
/* Get the pointer to the item at index. */ /* Get the pointer to the item at index. */
static char * static char *
ptr_from_index(Py_buffer *view, Py_ssize_t index) ptr_from_index(const Py_buffer *view, Py_ssize_t index)
{ {
char *ptr = (char *)view->buf; char *ptr = (char *)view->buf;
return lookup_dimension(view, ptr, 0, index); return lookup_dimension(view, ptr, 0, index);
@ -2305,7 +2305,7 @@ ptr_from_index(Py_buffer *view, Py_ssize_t index)
/* Get the pointer to the item at tuple. */ /* Get the pointer to the item at tuple. */
static char * static char *
ptr_from_tuple(Py_buffer *view, PyObject *tup) ptr_from_tuple(const Py_buffer *view, PyObject *tup)
{ {
char *ptr = (char *)view->buf; char *ptr = (char *)view->buf;
Py_ssize_t dim, nindices = PyTuple_GET_SIZE(tup); Py_ssize_t dim, nindices = PyTuple_GET_SIZE(tup);