summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2020-04-07 23:13:53 (GMT)
committerGitHub <noreply@github.com>2020-04-07 23:13:53 (GMT)
commitef5c615f5ae72c4f6979159c94da46afefbfab9a (patch)
tree85213408d6eaa43d1bd6c013f5e1cb0d921534be
parent9205520d8c43488696d66cbdd9aefbb21871c508 (diff)
downloadcpython-ef5c615f5ae72c4f6979159c94da46afefbfab9a.zip
cpython-ef5c615f5ae72c4f6979159c94da46afefbfab9a.tar.gz
cpython-ef5c615f5ae72c4f6979159c94da46afefbfab9a.tar.bz2
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.
-rw-r--r--Include/cpython/abstract.h4
-rw-r--r--Misc/NEWS.d/next/C API/2020-04-05-00-02-13.bpo-40170.IFsGZ-.rst3
-rw-r--r--Objects/abstract.c10
3 files changed, 14 insertions, 3 deletions
diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h
index 9d23c8c..3f834ff 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 0000000..fb378fa
--- /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 e975edd..49a38d8 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.
*/