bpo-35713: Reorganize sys module initialization (GH-11658)

* Rename _PySys_BeginInit() to _PySys_InitCore().
* Rename _PySys_EndInit() to _PySys_InitMain().
* Add _PySys_Create(). It calls _PySys_InitCore() which becomes
  private.
* Add _PySys_SetPreliminaryStderr().
* Rename _Py_ReadyTypes() to _PyTypes_Init().
* Misc code cleanup.
This commit is contained in:
Victor Stinner 2019-01-23 15:04:40 +01:00 committed by GitHub
parent cda73a5af2
commit ab67281e95
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 96 additions and 75 deletions

View file

@ -589,7 +589,7 @@ pycore_create_interpreter(const _PyCoreConfig *core_config,
static _PyInitError
pycore_init_types(void)
{
_PyInitError err = _Py_ReadyTypes();
_PyInitError err = _PyTypes_Init();
if (_Py_INIT_FAILED(err)) {
return err;
}
@ -623,46 +623,6 @@ pycore_init_types(void)
}
static _PyInitError
pycore_init_sys(PyInterpreterState *interp, PyObject **sysmod_p)
{
PyObject *modules = PyDict_New();
if (modules == NULL)
return _Py_INIT_ERR("can't make modules dictionary");
interp->modules = modules;
PyObject *sysmod;
_PyInitError err = _PySys_BeginInit(&sysmod);
if (_Py_INIT_FAILED(err)) {
return err;
}
*sysmod_p = sysmod;
interp->sysdict = PyModule_GetDict(sysmod);
if (interp->sysdict == NULL) {
return _Py_INIT_ERR("can't initialize sys dict");
}
Py_INCREF(interp->sysdict);
PyDict_SetItemString(interp->sysdict, "modules", modules);
_PyImport_FixupBuiltin(sysmod, "sys", modules);
/* Set up a preliminary stderr printer until we have enough
infrastructure for the io module in place.
Use UTF-8/surrogateescape and ignore EAGAIN errors. */
PyObject *pstderr = PyFile_NewStdPrinter(fileno(stderr));
if (pstderr == NULL) {
return _Py_INIT_ERR("can't set preliminary stderr");
}
_PySys_SetObjectId(&PyId_stderr, pstderr);
PySys_SetObject("__stderr__", pstderr);
Py_DECREF(pstderr);
return _Py_INIT_OK();
}
static _PyInitError
pycore_init_builtins(PyInterpreterState *interp)
{
@ -746,7 +706,7 @@ _Py_InitializeCore_impl(PyInterpreterState **interp_p,
}
PyObject *sysmod;
err = pycore_init_sys(interp, &sysmod);
err = _PySys_Create(interp, &sysmod);
if (_Py_INIT_FAILED(err)) {
return err;
}
@ -887,7 +847,7 @@ _Py_InitializeMainInterpreter(PyInterpreterState *interp,
return _Py_INIT_ERR("can't initialize time");
}
if (_PySys_EndInit(interp->sysdict, interp) < 0) {
if (_PySys_InitMain(interp) < 0) {
return _Py_INIT_ERR("can't finish initializing sys");
}
@ -1376,7 +1336,9 @@ new_interpreter(PyThreadState **tstate_p)
goto handle_error;
Py_INCREF(interp->sysdict);
PyDict_SetItemString(interp->sysdict, "modules", modules);
_PySys_EndInit(interp->sysdict, interp);
if (_PySys_InitMain(interp) < 0) {
return _Py_INIT_ERR("can't finish initializing sys");
}
}
else if (PyErr_Occurred()) {
goto handle_error;
@ -1399,15 +1361,10 @@ new_interpreter(PyThreadState **tstate_p)
return err;
}
/* Set up a preliminary stderr printer until we have enough
infrastructure for the io module in place. */
PyObject *pstderr = PyFile_NewStdPrinter(fileno(stderr));
if (pstderr == NULL) {
return _Py_INIT_ERR("can't set preliminary stderr");
err = _PySys_SetPreliminaryStderr(interp->sysdict);
if (_Py_INIT_FAILED(err)) {
return err;
}
_PySys_SetObjectId(&PyId_stderr, pstderr);
PySys_SetObject("__stderr__", pstderr);
Py_DECREF(pstderr);
err = _PyImportHooks_Init();
if (_Py_INIT_FAILED(err)) {