gh-111178: Fix function signatures in moduleobject.c (#124900)

This commit is contained in:
Victor Stinner 2024-10-02 16:31:04 +02:00 committed by GitHub
parent 9132148edf
commit 7bd9dbf8e1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 45 additions and 20 deletions

View file

@ -46,7 +46,7 @@ static inline PyObject* _PyModule_GetDict(PyObject *mod) {
} }
PyObject* _Py_module_getattro_impl(PyModuleObject *m, PyObject *name, int suppress); PyObject* _Py_module_getattro_impl(PyModuleObject *m, PyObject *name, int suppress);
PyObject* _Py_module_getattro(PyModuleObject *m, PyObject *name); PyObject* _Py_module_getattro(PyObject *m, PyObject *name);
#ifdef __cplusplus #ifdef __cplusplus
} }

View file

@ -15,6 +15,10 @@
#include "osdefs.h" // MAXPATHLEN #include "osdefs.h" // MAXPATHLEN
#define _PyModule_CAST(op) \
(assert(PyModule_Check(op)), _Py_CAST(PyModuleObject*, (op)))
static PyMemberDef module_members[] = { static PyMemberDef module_members[] = {
{"__dict__", _Py_T_OBJECT, offsetof(PyModuleObject, md_dict), Py_READONLY}, {"__dict__", _Py_T_OBJECT, offsetof(PyModuleObject, md_dict), Py_READONLY},
{0} {0}
@ -225,7 +229,9 @@ _PyModule_CreateInitialized(PyModuleDef* module, int module_api_version)
return NULL; return NULL;
} }
name = _PyImport_ResolveNameWithPackageContext(name); name = _PyImport_ResolveNameWithPackageContext(name);
if ((m = (PyModuleObject*)PyModule_New(name)) == NULL)
m = (PyModuleObject*)PyModule_New(name);
if (m == NULL)
return NULL; return NULL;
if (module->m_size > 0) { if (module->m_size > 0) {
@ -758,22 +764,26 @@ module___init___impl(PyModuleObject *self, PyObject *name, PyObject *doc)
} }
static void static void
module_dealloc(PyModuleObject *m) module_dealloc(PyObject *self)
{ {
int verbose = _Py_GetConfig()->verbose; PyModuleObject *m = _PyModule_CAST(self);
PyObject_GC_UnTrack(m); PyObject_GC_UnTrack(m);
int verbose = _Py_GetConfig()->verbose;
if (verbose && m->md_name) { if (verbose && m->md_name) {
PySys_FormatStderr("# destroy %U\n", m->md_name); PySys_FormatStderr("# destroy %U\n", m->md_name);
} }
if (m->md_weaklist != NULL) if (m->md_weaklist != NULL)
PyObject_ClearWeakRefs((PyObject *) m); PyObject_ClearWeakRefs((PyObject *) m);
/* bpo-39824: Don't call m_free() if m_size > 0 and md_state=NULL */ /* bpo-39824: Don't call m_free() if m_size > 0 and md_state=NULL */
if (m->md_def && m->md_def->m_free if (m->md_def && m->md_def->m_free
&& (m->md_def->m_size <= 0 || m->md_state != NULL)) && (m->md_def->m_size <= 0 || m->md_state != NULL))
{ {
m->md_def->m_free(m); m->md_def->m_free(m);
} }
Py_XDECREF(m->md_dict); Py_XDECREF(m->md_dict);
Py_XDECREF(m->md_name); Py_XDECREF(m->md_name);
if (m->md_state != NULL) if (m->md_state != NULL)
@ -782,8 +792,9 @@ module_dealloc(PyModuleObject *m)
} }
static PyObject * static PyObject *
module_repr(PyModuleObject *m) module_repr(PyObject *self)
{ {
PyModuleObject *m = _PyModule_CAST(self);
PyInterpreterState *interp = _PyInterpreterState_GET(); PyInterpreterState *interp = _PyInterpreterState_GET();
return _PyImport_ImportlibModuleRepr(interp, (PyObject *)m); return _PyImport_ImportlibModuleRepr(interp, (PyObject *)m);
} }
@ -1062,14 +1073,17 @@ _Py_module_getattro_impl(PyModuleObject *m, PyObject *name, int suppress)
PyObject* PyObject*
_Py_module_getattro(PyModuleObject *m, PyObject *name) _Py_module_getattro(PyObject *self, PyObject *name)
{ {
PyModuleObject *m = _PyModule_CAST(self);
return _Py_module_getattro_impl(m, name, 0); return _Py_module_getattro_impl(m, name, 0);
} }
static int static int
module_traverse(PyModuleObject *m, visitproc visit, void *arg) module_traverse(PyObject *self, visitproc visit, void *arg)
{ {
PyModuleObject *m = _PyModule_CAST(self);
/* bpo-39824: Don't call m_traverse() if m_size > 0 and md_state=NULL */ /* bpo-39824: Don't call m_traverse() if m_size > 0 and md_state=NULL */
if (m->md_def && m->md_def->m_traverse if (m->md_def && m->md_def->m_traverse
&& (m->md_def->m_size <= 0 || m->md_state != NULL)) && (m->md_def->m_size <= 0 || m->md_state != NULL))
@ -1078,13 +1092,16 @@ module_traverse(PyModuleObject *m, visitproc visit, void *arg)
if (res) if (res)
return res; return res;
} }
Py_VISIT(m->md_dict); Py_VISIT(m->md_dict);
return 0; return 0;
} }
static int static int
module_clear(PyModuleObject *m) module_clear(PyObject *self)
{ {
PyModuleObject *m = _PyModule_CAST(self);
/* bpo-39824: Don't call m_clear() if m_size > 0 and md_state=NULL */ /* bpo-39824: Don't call m_clear() if m_size > 0 and md_state=NULL */
if (m->md_def && m->md_def->m_clear if (m->md_def && m->md_def->m_clear
&& (m->md_def->m_size <= 0 || m->md_state != NULL)) && (m->md_def->m_size <= 0 || m->md_state != NULL))
@ -1149,8 +1166,10 @@ module_get_dict(PyModuleObject *m)
} }
static PyObject * static PyObject *
module_get_annotate(PyModuleObject *m, void *Py_UNUSED(ignored)) module_get_annotate(PyObject *self, void *Py_UNUSED(ignored))
{ {
PyModuleObject *m = _PyModule_CAST(self);
PyObject *dict = module_get_dict(m); PyObject *dict = module_get_dict(m);
if (dict == NULL) { if (dict == NULL) {
return NULL; return NULL;
@ -1168,12 +1187,14 @@ module_get_annotate(PyModuleObject *m, void *Py_UNUSED(ignored))
} }
static int static int
module_set_annotate(PyModuleObject *m, PyObject *value, void *Py_UNUSED(ignored)) module_set_annotate(PyObject *self, PyObject *value, void *Py_UNUSED(ignored))
{ {
PyModuleObject *m = _PyModule_CAST(self);
if (value == NULL) { if (value == NULL) {
PyErr_SetString(PyExc_TypeError, "cannot delete __annotate__ attribute"); PyErr_SetString(PyExc_TypeError, "cannot delete __annotate__ attribute");
return -1; return -1;
} }
PyObject *dict = module_get_dict(m); PyObject *dict = module_get_dict(m);
if (dict == NULL) { if (dict == NULL) {
return -1; return -1;
@ -1200,8 +1221,10 @@ module_set_annotate(PyModuleObject *m, PyObject *value, void *Py_UNUSED(ignored)
} }
static PyObject * static PyObject *
module_get_annotations(PyModuleObject *m, void *Py_UNUSED(ignored)) module_get_annotations(PyObject *self, void *Py_UNUSED(ignored))
{ {
PyModuleObject *m = _PyModule_CAST(self);
PyObject *dict = module_get_dict(m); PyObject *dict = module_get_dict(m);
if (dict == NULL) { if (dict == NULL) {
return NULL; return NULL;
@ -1249,14 +1272,16 @@ module_get_annotations(PyModuleObject *m, void *Py_UNUSED(ignored))
} }
static int static int
module_set_annotations(PyModuleObject *m, PyObject *value, void *Py_UNUSED(ignored)) module_set_annotations(PyObject *self, PyObject *value, void *Py_UNUSED(ignored))
{ {
int ret = -1; PyModuleObject *m = _PyModule_CAST(self);
PyObject *dict = module_get_dict(m); PyObject *dict = module_get_dict(m);
if (dict == NULL) { if (dict == NULL) {
return -1; return -1;
} }
int ret = -1;
if (value != NULL) { if (value != NULL) {
/* set */ /* set */
ret = PyDict_SetItem(dict, &_Py_ID(__annotations__), value); ret = PyDict_SetItem(dict, &_Py_ID(__annotations__), value);
@ -1282,8 +1307,8 @@ module_set_annotations(PyModuleObject *m, PyObject *value, void *Py_UNUSED(ignor
static PyGetSetDef module_getsets[] = { static PyGetSetDef module_getsets[] = {
{"__annotations__", (getter)module_get_annotations, (setter)module_set_annotations}, {"__annotations__", module_get_annotations, module_set_annotations},
{"__annotate__", (getter)module_get_annotate, (setter)module_set_annotate}, {"__annotate__", module_get_annotate, module_set_annotate},
{NULL} {NULL}
}; };
@ -1292,26 +1317,26 @@ PyTypeObject PyModule_Type = {
"module", /* tp_name */ "module", /* tp_name */
sizeof(PyModuleObject), /* tp_basicsize */ sizeof(PyModuleObject), /* tp_basicsize */
0, /* tp_itemsize */ 0, /* tp_itemsize */
(destructor)module_dealloc, /* tp_dealloc */ module_dealloc, /* tp_dealloc */
0, /* tp_vectorcall_offset */ 0, /* tp_vectorcall_offset */
0, /* tp_getattr */ 0, /* tp_getattr */
0, /* tp_setattr */ 0, /* tp_setattr */
0, /* tp_as_async */ 0, /* tp_as_async */
(reprfunc)module_repr, /* tp_repr */ module_repr, /* tp_repr */
0, /* tp_as_number */ 0, /* tp_as_number */
0, /* tp_as_sequence */ 0, /* tp_as_sequence */
0, /* tp_as_mapping */ 0, /* tp_as_mapping */
0, /* tp_hash */ 0, /* tp_hash */
0, /* tp_call */ 0, /* tp_call */
0, /* tp_str */ 0, /* tp_str */
(getattrofunc)_Py_module_getattro, /* tp_getattro */ _Py_module_getattro, /* tp_getattro */
PyObject_GenericSetAttr, /* tp_setattro */ PyObject_GenericSetAttr, /* tp_setattro */
0, /* tp_as_buffer */ 0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Py_TPFLAGS_BASETYPE, /* tp_flags */ Py_TPFLAGS_BASETYPE, /* tp_flags */
module___init____doc__, /* tp_doc */ module___init____doc__, /* tp_doc */
(traverseproc)module_traverse, /* tp_traverse */ module_traverse, /* tp_traverse */
(inquiry)module_clear, /* tp_clear */ module_clear, /* tp_clear */
0, /* tp_richcompare */ 0, /* tp_richcompare */
offsetof(PyModuleObject, md_weaklist), /* tp_weaklistoffset */ offsetof(PyModuleObject, md_weaklist), /* tp_weaklistoffset */
0, /* tp_iter */ 0, /* tp_iter */