gh-105927: finalize_modules_clear_weaklist() uses _PyWeakref_GET_REF() (#105971)

finalize_modules_clear_weaklist() now holds a strong reference to the
module longer than before: replace PyWeakref_GET_OBJECT() with
_PyWeakref_GET_REF().
This commit is contained in:
Victor Stinner 2023-06-21 21:50:20 +02:00 committed by GitHub
parent fc32522b08
commit 4328dc6465
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 7 additions and 6 deletions

View file

@ -33,7 +33,7 @@ static inline PyObject* _PyModule_GetDict(PyObject *mod) {
PyObject *dict = ((PyModuleObject *)mod) -> md_dict; PyObject *dict = ((PyModuleObject *)mod) -> md_dict;
// _PyModule_GetDict(mod) must not be used after calling module_clear(mod) // _PyModule_GetDict(mod) must not be used after calling module_clear(mod)
assert(dict != NULL); assert(dict != NULL);
return dict; return dict; // borrowed reference
} }
PyObject* _Py_module_getattro_impl(PyModuleObject *m, PyObject *name, int suppress); PyObject* _Py_module_getattro_impl(PyModuleObject *m, PyObject *name, int suppress);

View file

@ -504,7 +504,7 @@ PyModule_GetDict(PyObject *m)
PyErr_BadInternalCall(); PyErr_BadInternalCall();
return NULL; return NULL;
} }
return _PyModule_GetDict(m); return _PyModule_GetDict(m); // borrowed reference
} }
PyObject* PyObject*

View file

@ -28,6 +28,7 @@
#include "pycore_typeobject.h" // _PyTypes_InitTypes() #include "pycore_typeobject.h" // _PyTypes_InitTypes()
#include "pycore_typevarobject.h" // _Py_clear_generic_types() #include "pycore_typevarobject.h" // _Py_clear_generic_types()
#include "pycore_unicodeobject.h" // _PyUnicode_InitTypes() #include "pycore_unicodeobject.h" // _PyUnicode_InitTypes()
#include "pycore_weakref.h" // _PyWeakref_GET_REF()
#include "opcode.h" #include "opcode.h"
#include <locale.h> // setlocale() #include <locale.h> // setlocale()
@ -1464,16 +1465,16 @@ finalize_modules_clear_weaklist(PyInterpreterState *interp,
for (Py_ssize_t i = PyList_GET_SIZE(weaklist) - 1; i >= 0; i--) { for (Py_ssize_t i = PyList_GET_SIZE(weaklist) - 1; i >= 0; i--) {
PyObject *tup = PyList_GET_ITEM(weaklist, i); PyObject *tup = PyList_GET_ITEM(weaklist, i);
PyObject *name = PyTuple_GET_ITEM(tup, 0); PyObject *name = PyTuple_GET_ITEM(tup, 0);
PyObject *mod = PyWeakref_GET_OBJECT(PyTuple_GET_ITEM(tup, 1)); PyObject *mod = _PyWeakref_GET_REF(PyTuple_GET_ITEM(tup, 1));
if (mod == Py_None) { if (mod == NULL) {
continue; continue;
} }
assert(PyModule_Check(mod)); assert(PyModule_Check(mod));
PyObject *dict = PyModule_GetDict(mod); PyObject *dict = _PyModule_GetDict(mod); // borrowed reference
if (dict == interp->builtins || dict == interp->sysdict) { if (dict == interp->builtins || dict == interp->sysdict) {
Py_DECREF(mod);
continue; continue;
} }
Py_INCREF(mod);
if (verbose && PyUnicode_Check(name)) { if (verbose && PyUnicode_Check(name)) {
PySys_FormatStderr("# cleanup[3] wiping %U\n", name); PySys_FormatStderr("# cleanup[3] wiping %U\n", name);
} }