mirror of
https://github.com/python/cpython.git
synced 2025-08-31 14:07:50 +00:00
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
This commit is contained in:
parent
3f45f5da8e
commit
ea62ce7f4f
8 changed files with 198 additions and 0 deletions
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue