Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Include/internal/pycore_pylifecycle.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ extern PyObject * _PyBuiltin_Init(PyThreadState *tstate);
extern PyStatus _PySys_Create(
PyThreadState *tstate,
PyObject **sysmod_p);
extern PyStatus _PySys_SetPreliminaryStderr(PyObject *sysdict);
extern PyStatus _PySys_ReadPreinitWarnOptions(PyWideStringList *options);
extern PyStatus _PySys_ReadPreinitXOptions(PyConfig *config);
extern int _PySys_InitMain(PyThreadState *tstate);
Expand Down
119 changes: 72 additions & 47 deletions Python/pylifecycle.c
Original file line number Diff line number Diff line change
Expand Up @@ -622,8 +622,6 @@ pycore_init_types(PyThreadState *tstate)
static PyStatus
pycore_init_builtins(PyThreadState *tstate)
{
assert(!_PyErr_Occurred(tstate));

PyObject *bimod = _PyBuiltin_Init(tstate);
if (bimod == NULL) {
goto error;
Expand Down Expand Up @@ -651,9 +649,6 @@ pycore_init_builtins(PyThreadState *tstate)
goto error;
}
Py_DECREF(bimod);

assert(!_PyErr_Occurred(tstate));

return _PyStatus_OK();

error:
Expand All @@ -665,14 +660,13 @@ pycore_init_builtins(PyThreadState *tstate)
static PyStatus
pycore_init_import_warnings(PyThreadState *tstate, PyObject *sysmod)
{
assert(!_PyErr_Occurred(tstate));
const PyConfig *config = &tstate->interp->config;

PyStatus status = _PyImportHooks_Init(tstate);
if (_PyStatus_EXCEPTION(status)) {
return status;
}

const PyConfig *config = &tstate->interp->config;
if (_Py_IsMainInterpreter(tstate)) {
/* Initialize _warnings. */
if (_PyWarnings_Init() == NULL) {
Expand All @@ -694,59 +688,47 @@ pycore_init_import_warnings(PyThreadState *tstate, PyObject *sysmod)
return status;
}
}

assert(!_PyErr_Occurred(tstate));

return _PyStatus_OK();
}


static PyStatus
pycore_interp_init(PyThreadState *tstate)
pyinit_config(_PyRuntimeState *runtime,
PyThreadState **tstate_p,
const PyConfig *config)
{
PyStatus status;
_PyConfig_Write(config, runtime);

status = pycore_init_types(tstate);
PyStatus status = pycore_init_runtime(runtime, config);
if (_PyStatus_EXCEPTION(status)) {
return status;
}

PyObject *sysmod;
status = _PySys_Create(tstate, &sysmod);
PyThreadState *tstate;
status = pycore_create_interpreter(runtime, config, &tstate);
if (_PyStatus_EXCEPTION(status)) {
return status;
}
config = &tstate->interp->config;
*tstate_p = tstate;

status = pycore_init_builtins(tstate);
status = pycore_init_types(tstate);
if (_PyStatus_EXCEPTION(status)) {
return status;
}

return pycore_init_import_warnings(tstate, sysmod);
}


static PyStatus
pyinit_config(_PyRuntimeState *runtime,
PyThreadState **tstate_p,
const PyConfig *config)
{
_PyConfig_Write(config, runtime);

PyStatus status = pycore_init_runtime(runtime, config);
PyObject *sysmod;
status = _PySys_Create(tstate, &sysmod);
if (_PyStatus_EXCEPTION(status)) {
return status;
}

PyThreadState *tstate;
status = pycore_create_interpreter(runtime, config, &tstate);
status = pycore_init_builtins(tstate);
if (_PyStatus_EXCEPTION(status)) {
return status;
}
config = &tstate->interp->config;
*tstate_p = tstate;

status = pycore_interp_init(tstate);
status = pycore_init_import_warnings(tstate, sysmod);
if (_PyStatus_EXCEPTION(status)) {
return status;
}
Expand Down Expand Up @@ -947,8 +929,6 @@ _Py_ReconfigureMainInterpreter(PyThreadState *tstate)
static PyStatus
init_interp_main(PyThreadState *tstate)
{
assert(!_PyErr_Occurred(tstate));

PyStatus status;
int is_main_interp = _Py_IsMainInterpreter(tstate);
PyInterpreterState *interp = tstate->interp;
Expand All @@ -970,10 +950,10 @@ init_interp_main(PyThreadState *tstate)
if (_PyTime_Init() < 0) {
return _PyStatus_ERR("can't initialize time");
}
}

if (_PySys_InitMain(tstate) < 0) {
return _PyStatus_ERR("can't finish initializing sys");
if (_PySys_InitMain(tstate) < 0) {
return _PyStatus_ERR("can't finish initializing sys");
}
}

status = init_importlib_external(tstate);
Expand Down Expand Up @@ -1051,8 +1031,6 @@ init_interp_main(PyThreadState *tstate)
#endif
}

assert(!_PyErr_Occurred(tstate));

return _PyStatus_OK();
}

Expand Down Expand Up @@ -1556,23 +1534,70 @@ new_interpreter(PyThreadState **tstate_p)

status = _PyConfig_Copy(&interp->config, config);
if (_PyStatus_EXCEPTION(status)) {
goto error;
goto done;
}
config = &interp->config;

status = pycore_interp_init(tstate);
if (_PyStatus_EXCEPTION(status)) {
goto error;
status = pycore_init_types(tstate);

/* XXX The following is lax in error checking */
PyObject *modules = PyDict_New();
if (modules == NULL) {
status = _PyStatus_ERR("can't make modules dictionary");
goto done;
}
interp->modules = modules;

PyObject *sysmod = _PyImport_FindBuiltin(tstate, "sys");
if (sysmod != NULL) {
interp->sysdict = PyModule_GetDict(sysmod);
if (interp->sysdict == NULL) {
goto handle_exc;
}
Py_INCREF(interp->sysdict);
PyDict_SetItemString(interp->sysdict, "modules", modules);
if (_PySys_InitMain(tstate) < 0) {
status = _PyStatus_ERR("can't finish initializing sys");
goto done;
}
}
else if (_PyErr_Occurred(tstate)) {
goto handle_exc;
}

status = init_interp_main(tstate);
status = pycore_init_builtins(tstate);
if (_PyStatus_EXCEPTION(status)) {
goto error;
goto done;
}

if (sysmod != NULL) {
status = _PySys_SetPreliminaryStderr(interp->sysdict);
if (_PyStatus_EXCEPTION(status)) {
goto done;
}

status = pycore_init_import_warnings(tstate, sysmod);
if (_PyStatus_EXCEPTION(status)) {
goto done;
}

status = init_interp_main(tstate);
if (_PyStatus_EXCEPTION(status)) {
goto done;
}
}

if (_PyErr_Occurred(tstate)) {
goto handle_exc;
}

*tstate_p = tstate;
return _PyStatus_OK();

error:
handle_exc:
status = _PyStatus_OK();

done:
*tstate_p = NULL;

/* Oops, it didn't work. Undo it all. */
Expand Down
19 changes: 5 additions & 14 deletions Python/sysmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -2919,7 +2919,7 @@ _PySys_InitMain(PyThreadState *tstate)
infrastructure for the io module in place.

Use UTF-8/surrogateescape and ignore EAGAIN errors. */
static PyStatus
PyStatus
_PySys_SetPreliminaryStderr(PyObject *sysdict)
{
PyObject *pstderr = PyFile_NewStdPrinter(fileno(stderr));
Expand All @@ -2946,13 +2946,11 @@ _PySys_SetPreliminaryStderr(PyObject *sysdict)
PyStatus
_PySys_Create(PyThreadState *tstate, PyObject **sysmod_p)
{
assert(!_PyErr_Occurred(tstate));

PyInterpreterState *interp = tstate->interp;

PyObject *modules = PyDict_New();
if (modules == NULL) {
goto error;
return _PyStatus_ERR("can't make modules dictionary");
}
interp->modules = modules;

Expand All @@ -2963,13 +2961,13 @@ _PySys_Create(PyThreadState *tstate, PyObject **sysmod_p)

PyObject *sysdict = PyModule_GetDict(sysmod);
if (sysdict == NULL) {
goto error;
return _PyStatus_ERR("can't initialize sys dict");
}
Py_INCREF(sysdict);
interp->sysdict = sysdict;

if (PyDict_SetItemString(sysdict, "modules", interp->modules) < 0) {
goto error;
return _PyStatus_ERR("can't initialize sys module");
}

PyStatus status = _PySys_SetPreliminaryStderr(sysdict);
Expand All @@ -2982,17 +2980,10 @@ _PySys_Create(PyThreadState *tstate, PyObject **sysmod_p)
return status;
}

if (_PyImport_FixupBuiltin(sysmod, "sys", interp->modules) < 0) {
goto error;
}

assert(!_PyErr_Occurred(tstate));
_PyImport_FixupBuiltin(sysmod, "sys", interp->modules);

*sysmod_p = sysmod;
return _PyStatus_OK();

error:
return _PyStatus_ERR("can't initialize sys module");
}


Expand Down