gh-132775: Drop PyUnstable_InterpreterState_GetMainModule() (gh-132978)

We replace it with _Py_GetMainModule(), and add _Py_CheckMainModule(), but both in the internal-only C-API.  We also add _PyImport_GetModulesRef(), which is the equivalent of _PyImport_GetModules(), but which increfs before the lock is released.

This is used by a later change related to pickle and handling __main__.
This commit is contained in:
Eric Snow 2025-04-28 12:46:22 -06:00 committed by GitHub
parent c17238251f
commit fe462f5a91
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 53 additions and 20 deletions

View file

@ -1210,14 +1210,40 @@ _PyInterpreterState_SetWhence(PyInterpreterState *interp, long whence)
PyObject *
PyUnstable_InterpreterState_GetMainModule(PyInterpreterState *interp)
_Py_GetMainModule(PyThreadState *tstate)
{
PyObject *modules = _PyImport_GetModules(interp);
if (modules == NULL) {
PyErr_SetString(PyExc_RuntimeError, "interpreter not initialized");
return NULL;
// We return None to indicate "not found" or "bogus".
PyObject *modules = _PyImport_GetModulesRef(tstate->interp);
if (modules == Py_None) {
return modules;
}
return PyMapping_GetItemString(modules, "__main__");
PyObject *module = NULL;
(void)PyMapping_GetOptionalItem(modules, &_Py_ID(__main__), &module);
Py_DECREF(modules);
if (module == NULL && !PyErr_Occurred()) {
Py_RETURN_NONE;
}
return module;
}
int
_Py_CheckMainModule(PyObject *module)
{
if (module == NULL || module == Py_None) {
if (!PyErr_Occurred()) {
(void)_PyErr_SetModuleNotFoundError(&_Py_ID(__main__));
}
return -1;
}
if (!Py_IS_TYPE(module, &PyModule_Type)) {
/* The __main__ module has been tampered with. */
PyObject *msg = PyUnicode_FromString("invalid __main__ module");
if (msg != NULL) {
(void)PyErr_SetImportError(msg, &_Py_ID(__main__), NULL);
}
return -1;
}
return 0;
}