mirror of
https://github.com/python/cpython.git
synced 2025-09-08 18:01:44 +00:00
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:
parent
fc32522b08
commit
4328dc6465
3 changed files with 7 additions and 6 deletions
|
@ -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);
|
||||||
|
|
|
@ -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*
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue