gh-111506: Add _Py_OPAQUE_PYOBJECT to hide PyObject layout & related API (GH-136505)

Allow Py_LIMITED_API for (Py_GIL_DISABLED && _Py_OPAQUE_PYOBJECT)


API that's removed when _Py_OPAQUE_PYOBJECT is defined:

    - PyObject_HEAD
    - _PyObject_EXTRA_INIT
    - PyObject_HEAD_INIT
    - PyObject_VAR_HEAD
    - struct _object (i.e. PyObject) (opaque)
    - struct PyVarObject (opaque)
    - Py_SIZE
    - Py_SET_TYPE
    - Py_SET_SIZE
    - PyModuleDef_Base (opaque)
    - PyModuleDef_HEAD_INIT
    - PyModuleDef (opaque)
    - _Py_IsImmortal
    - _Py_IsStaticImmortal

Note that the `_Py_IsImmortal` removal (and a few other issues)
 means _Py_OPAQUE_PYOBJECT only works with limited
API 3.14+ now.


Co-authored-by: Victor Stinner <vstinner@python.org>
This commit is contained in:
Petr Viktorin 2025-07-12 09:55:12 +02:00 committed by GitHub
parent db47f4d844
commit c7d24b81c3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 123 additions and 25 deletions

View file

@ -36,6 +36,7 @@ PyAPI_FUNC(PyObject *) PyModuleDef_Init(PyModuleDef*);
PyAPI_DATA(PyTypeObject) PyModuleDef_Type;
#endif
#ifndef _Py_OPAQUE_PYOBJECT
typedef struct PyModuleDef_Base {
PyObject_HEAD
/* The function used to re-initialize the module.
@ -63,6 +64,7 @@ typedef struct PyModuleDef_Base {
0, /* m_index */ \
_Py_NULL, /* m_copy */ \
}
#endif // _Py_OPAQUE_PYOBJECT
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000
/* New in 3.5 */
@ -104,6 +106,8 @@ struct PyModuleDef_Slot {
PyAPI_FUNC(int) PyUnstable_Module_SetGIL(PyObject *module, void *gil);
#endif
#ifndef _Py_OPAQUE_PYOBJECT
struct PyModuleDef {
PyModuleDef_Base m_base;
const char* m_name;
@ -115,6 +119,7 @@ struct PyModuleDef {
inquiry m_clear;
freefunc m_free;
};
#endif // _Py_OPAQUE_PYOBJECT
#ifdef __cplusplus
}