Fix crash executing a script when sys.modules doesn't contain __main__

While in practice sys.modules has __main__ module, the purpose of
PyC_MainModule_Backup/Restore is to temporarily override __main__.

Running code outside of the text editor (callbacks for timers for e.g.)
could remove the __main__ module which would then crash when running
a script from the text editor.
This commit is contained in:
Campbell Barton 2023-09-15 12:23:41 +10:00
parent 7516a9c0b6
commit bcda667d37

@ -1162,15 +1162,25 @@ bool PyC_NameSpace_ImportArray(PyObject *py_dict, const char *imports[])
void PyC_MainModule_Backup(PyObject **r_main_mod)
{
PyObject *modules = PyImport_GetModuleDict();
*r_main_mod = PyDict_GetItemString(modules, "__main__");
Py_XINCREF(*r_main_mod); /* don't free */
PyObject *main_mod = PyDict_GetItemString(modules, "__main__");
if (main_mod) {
/* Ensure the backed up module is kept until it's ownership */
/* is transferred back to `sys.modules`. */
Py_INCREF(main_mod);
}
*r_main_mod = main_mod;
}
void PyC_MainModule_Restore(PyObject *main_mod)
{
PyObject *modules = PyImport_GetModuleDict();
PyDict_SetItemString(modules, "__main__", main_mod);
Py_XDECREF(main_mod);
if (main_mod) {
PyDict_SetItemString(modules, "__main__", main_mod);
Py_DECREF(main_mod);
}
else {
PyDict_DelItemString(modules, "__main__");
}
}
bool PyC_IsInterpreterActive()