summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/c-api/iter.rst4
-rw-r--r--Include/abstract.h2
-rw-r--r--Include/cpython/abstract.h6
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2021-02-15-15-06-43.bpo-40170.ZYeSii.rst3
-rw-r--r--Objects/abstract.c10
5 files changed, 11 insertions, 14 deletions
diff --git a/Doc/c-api/iter.rst b/Doc/c-api/iter.rst
index 74fb557..5706777 100644
--- a/Doc/c-api/iter.rst
+++ b/Doc/c-api/iter.rst
@@ -9,8 +9,8 @@ There are two functions specifically for working with iterators.
.. c:function:: int PyIter_Check(PyObject *o)
- Return true if the object *o* supports the iterator protocol. This
- function always succeeds.
+ Return non-zero if the object *o* supports the iterator protocol, and ``0``
+ otherwise. This function always succeeds.
.. c:function:: PyObject* PyIter_Next(PyObject *o)
diff --git a/Include/abstract.h b/Include/abstract.h
index 0bd1ca9..a47c944 100644
--- a/Include/abstract.h
+++ b/Include/abstract.h
@@ -324,7 +324,7 @@ PyAPI_FUNC(PyObject *) PyObject_Format(PyObject *obj,
returns itself. */
PyAPI_FUNC(PyObject *) PyObject_GetIter(PyObject *);
-/* Returns 1 if the object 'obj' provides iterator protocols, and 0 otherwise.
+/* Returns non-zero if the object 'obj' provides iterator protocols, and 0 otherwise.
This function always succeeds. */
PyAPI_FUNC(int) PyIter_Check(PyObject *);
diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h
index 7a4219c..db5055d 100644
--- a/Include/cpython/abstract.h
+++ b/Include/cpython/abstract.h
@@ -325,12 +325,6 @@ PyAPI_FUNC(int) PyBuffer_FillInfo(Py_buffer *view, PyObject *o, void *buf,
/* Releases a Py_buffer obtained from getbuffer ParseTuple's "s*". */
PyAPI_FUNC(void) PyBuffer_Release(Py_buffer *view);
-/* ==== Iterators ================================================ */
-
-#define PyIter_Check(obj) \
- (Py_TYPE(obj)->tp_iternext != NULL && \
- Py_TYPE(obj)->tp_iternext != &_PyObject_NextNotImplemented)
-
/* === Sequence protocol ================================================ */
/* Assume tp_as_sequence and sq_item exist and that 'i' does not
diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-02-15-15-06-43.bpo-40170.ZYeSii.rst b/Misc/NEWS.d/next/Core and Builtins/2021-02-15-15-06-43.bpo-40170.ZYeSii.rst
new file mode 100644
index 0000000..df6f3dc
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2021-02-15-15-06-43.bpo-40170.ZYeSii.rst
@@ -0,0 +1,3 @@
+:c:func:`PyIter_Check` is now always declared as a function, in order to hide implementation
+details. The macro accessed :c:member:`PyTypeObject.tp_iternext` directly.
+Patch by Erlend E. Aasland.
diff --git a/Objects/abstract.c b/Objects/abstract.c
index 74a73ee..c93309b 100644
--- a/Objects/abstract.c
+++ b/Objects/abstract.c
@@ -2732,12 +2732,12 @@ PyObject_GetIter(PyObject *o)
}
}
-#undef PyIter_Check
-
-int PyIter_Check(PyObject *obj)
+int
+PyIter_Check(PyObject *obj)
{
- return Py_TYPE(obj)->tp_iternext != NULL &&
- Py_TYPE(obj)->tp_iternext != &_PyObject_NextNotImplemented;
+ PyTypeObject *tp = Py_TYPE(obj);
+ return (tp->tp_iternext != NULL &&
+ tp->tp_iternext != &_PyObject_NextNotImplemented);
}
/* Return next item.