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:
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()
|
||||
|
Loading…
Reference in New Issue
Block a user