diff options
author | Christian Tismer <tismer@stackless.com> | 2018-06-09 18:32:25 (GMT) |
---|---|---|
committer | Ned Deily <nad@python.org> | 2018-06-09 18:32:25 (GMT) |
commit | ea62ce7f4fefc66bc0adba16bcd7666d5bbd5b44 (patch) | |
tree | 5c7d457be8b067d4ca35d033308b0bc5da9817af /Objects | |
parent | 3f45f5da8eb052f1b54d37086c67b7094f35b67b (diff) | |
download | cpython-ea62ce7f4fefc66bc0adba16bcd7666d5bbd5b44.zip cpython-ea62ce7f4fefc66bc0adba16bcd7666d5bbd5b44.tar.gz cpython-ea62ce7f4fefc66bc0adba16bcd7666d5bbd5b44.tar.bz2 |
bpo-33738: Fix macros which contradict PEP 384 (GH-7477)
During development of the limited API support for PySide,
we saw an error in a macro that accessed a type field.
This patch fixes the 7 errors in the Python headers.
Macros which were not written as capitals were implemented
as function.
To do the necessary analysis again, a script was included that
parses all headers and looks for "->tp_" in serctions which can
be reached with active limited API.
It is easily possible to call this script as a test.
Error listing:
../../Include/objimpl.h:243
#define PyObject_IS_GC(o) (PyType_IS_GC(Py_TYPE(o)) && \
(Py_TYPE(o)->tp_is_gc == NULL || Py_TYPE(o)->tp_is_gc(o)))
Action: commented only
../../Include/objimpl.h:362
#define PyType_SUPPORTS_WEAKREFS(t) ((t)->tp_weaklistoffset > 0)
Action: commented only
../../Include/objimpl.h:364
#define PyObject_GET_WEAKREFS_LISTPTR(o) \
((PyObject **) (((char *) (o)) + Py_TYPE(o)->tp_weaklistoffset))
Action: commented only
../../Include/pyerrors.h:143
#define PyExceptionClass_Name(x) \
((char *)(((PyTypeObject*)(x))->tp_name))
Action: implemented function
../../Include/abstract.h:593
#define PyIter_Check(obj) \
((obj)->ob_type->tp_iternext != NULL && \
(obj)->ob_type->tp_iternext != &_PyObject_NextNotImplemented)
Action: implemented function
../../Include/abstract.h:713
#define PyIndex_Check(obj) \
((obj)->ob_type->tp_as_number != NULL && \
(obj)->ob_type->tp_as_number->nb_index != NULL)
Action: implemented function
../../Include/abstract.h:924
#define PySequence_ITEM(o, i)\
( Py_TYPE(o)->tp_as_sequence->sq_item(o, i) )
Action: commented only
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/abstract.c | 15 | ||||
-rw-r--r-- | Objects/exceptions.c | 6 |
2 files changed, 21 insertions, 0 deletions
diff --git a/Objects/abstract.c b/Objects/abstract.c index 93eda62..e2700e3 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -1244,6 +1244,14 @@ PyNumber_Absolute(PyObject *o) return type_error("bad operand type for abs(): '%.200s'", o); } +#undef PyIndex_Check +int +PyIndex_Check(PyObject *obj) +{ + return obj->ob_type->tp_as_number != NULL && + obj->ob_type->tp_as_number->nb_index != NULL; +} + /* Return a Python int from the object item. Raise TypeError if the result is not an int or if the object cannot be interpreted as an index. @@ -2535,6 +2543,13 @@ PyObject_GetIter(PyObject *o) } } +#undef PyIter_Check +int PyIter_Check(PyObject *obj) +{ + return obj->ob_type->tp_iternext != NULL && + obj->ob_type->tp_iternext != &_PyObject_NextNotImplemented; +} + /* Return next item. * If an error occurs, return NULL. PyErr_Occurred() will be true. * If the iteration terminates normally, return NULL and clear the diff --git a/Objects/exceptions.c b/Objects/exceptions.c index bfc818f..bcb1fd5 100644 --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -342,6 +342,12 @@ PyException_SetContext(PyObject *self, PyObject *context) Py_XSETREF(((PyBaseExceptionObject *)self)->context, context); } +#undef PyExceptionClass_Name +char * +PyExceptionClass_Name(PyObject *ob) +{ + return ((PyTypeObject*)ob)->tp_name; +} static struct PyMemberDef BaseException_members[] = { {"__suppress_context__", T_BOOL, |