From ef5c615f5ae72c4f6979159c94da46afefbfab9a Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 8 Apr 2020 01:13:53 +0200 Subject: [PATCH] bpo-40170: Convert PyObject_CheckBuffer() macro to a function (GH-19376) Convert PyObject_CheckBuffer() macro to a function to hide implementation details: the macro accessed directly the PyTypeObject.tp_as_buffer member. --- Include/cpython/abstract.h | 4 +--- .../C API/2020-04-05-00-02-13.bpo-40170.IFsGZ-.rst | 3 +++ Objects/abstract.c | 10 ++++++++++ 3 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2020-04-05-00-02-13.bpo-40170.IFsGZ-.rst diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h index 9d23c8c11be..3f834ff727e 100644 --- a/Include/cpython/abstract.h +++ b/Include/cpython/abstract.h @@ -264,9 +264,7 @@ PyAPI_FUNC(Py_ssize_t) PyObject_LengthHint(PyObject *o, Py_ssize_t); /* === New Buffer API ============================================ */ /* Return 1 if the getbuffer function is available, otherwise return 0. */ -#define PyObject_CheckBuffer(obj) \ - ((Py_TYPE(obj)->tp_as_buffer != NULL) && \ - (Py_TYPE(obj)->tp_as_buffer->bf_getbuffer != NULL)) +PyAPI_FUNC(int) PyObject_CheckBuffer(PyObject *obj); /* This is a C-API version of the getbuffer function call. It checks to make sure object has the required function pointer and issues the diff --git a/Misc/NEWS.d/next/C API/2020-04-05-00-02-13.bpo-40170.IFsGZ-.rst b/Misc/NEWS.d/next/C API/2020-04-05-00-02-13.bpo-40170.IFsGZ-.rst new file mode 100644 index 00000000000..fb378faa90c --- /dev/null +++ b/Misc/NEWS.d/next/C API/2020-04-05-00-02-13.bpo-40170.IFsGZ-.rst @@ -0,0 +1,3 @@ +Convert :c:func:`PyObject_CheckBuffer` macro to a function to hide +implementation details: the macro accessed directly the +:c:member:`PyTypeObject.tp_as_buffer` member. diff --git a/Objects/abstract.c b/Objects/abstract.c index e975edd7c5b..49a38d8f6e2 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -277,6 +277,16 @@ PyObject_DelItemString(PyObject *o, const char *key) return ret; } + +/* Return 1 if the getbuffer function is available, otherwise return 0. */ +int +PyObject_CheckBuffer(PyObject *obj) +{ + PyBufferProcs *tp_as_buffer = Py_TYPE(obj)->tp_as_buffer; + return (tp_as_buffer != NULL && tp_as_buffer->bf_getbuffer != NULL); +} + + /* We release the buffer right after use of this function which could cause issues later on. Don't use these functions in new code. */