mirror of
https://github.com/python/cpython.git
synced 2025-11-01 14:11:41 +00:00
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>
29 lines
813 B
C
29 lines
813 B
C
// Workaround for testing _Py_OPAQUE_PYOBJECT.
|
|
// See end of 'extension.c'
|
|
|
|
|
|
#undef _Py_OPAQUE_PYOBJECT
|
|
#undef Py_LIMITED_API
|
|
#include "Python.h"
|
|
|
|
|
|
// (repeated definition to avoid creating a header)
|
|
extern PyObject *testcext_create_moduledef(
|
|
const char *name, const char *doc,
|
|
PyMethodDef *methods, PyModuleDef_Slot *slots);
|
|
|
|
PyObject *testcext_create_moduledef(
|
|
const char *name, const char *doc,
|
|
PyMethodDef *methods, PyModuleDef_Slot *slots) {
|
|
|
|
static struct PyModuleDef _testcext_module = {
|
|
PyModuleDef_HEAD_INIT,
|
|
};
|
|
if (!_testcext_module.m_name) {
|
|
_testcext_module.m_name = name;
|
|
_testcext_module.m_doc = doc;
|
|
_testcext_module.m_methods = methods;
|
|
_testcext_module.m_slots = slots;
|
|
}
|
|
return PyModuleDef_Init(&_testcext_module);
|
|
}
|