Skip to content

bpo-38858: new_interpreter() reuses pycore_init_builtins() #17351

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Nov 22, 2019
Merged
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
2 changes: 0 additions & 2 deletions Doc/data/refcounts.dat
Original file line number Diff line number Diff line change
Expand Up @@ -3045,8 +3045,6 @@ Py_XINCREF:PyObject*:o:+1:if o is not NULL

_PyImport_Fini:void:::

_PyImport_Init:void:::

_PyObject_New:PyObject*::+1:
_PyObject_New:PyTypeObject*:type:0:

Expand Down
1 change: 0 additions & 1 deletion Include/internal/pycore_pylifecycle.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@ extern PyStatus _PySys_SetPreliminaryStderr(PyObject *sysdict);
extern PyStatus _PySys_ReadPreinitWarnOptions(PyWideStringList *options);
extern PyStatus _PySys_ReadPreinitXOptions(PyConfig *config);
extern int _PySys_InitMain(PyThreadState *tstate);
extern PyStatus _PyImport_Init(PyThreadState *tstate);
extern PyStatus _PyExc_Init(void);
extern PyStatus _PyErr_Init(void);
extern PyStatus _PyBuiltins_AddExceptions(PyObject * bltinmod);
Expand Down
11 changes: 0 additions & 11 deletions Python/import.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,17 +48,6 @@ module _imp

/* Initialize things */

PyStatus
_PyImport_Init(PyThreadState *tstate)
{
PyInterpreterState *interp = tstate->interp;
interp->builtins_copy = PyDict_Copy(interp->builtins);
if (interp->builtins_copy == NULL) {
return _PyStatus_ERR("Can't backup builtins dict");
}
return _PyStatus_OK();
}

PyStatus
_PyImportHooks_Init(PyThreadState *tstate)
{
Expand Down
53 changes: 24 additions & 29 deletions Python/pylifecycle.c
Original file line number Diff line number Diff line change
Expand Up @@ -622,25 +622,36 @@ pycore_init_types(PyThreadState *tstate)
static PyStatus
pycore_init_builtins(PyThreadState *tstate)
{
PyInterpreterState *interp = tstate->interp;

PyObject *bimod = _PyBuiltin_Init(tstate);
if (bimod == NULL) {
return _PyStatus_ERR("can't initialize builtins modules");
goto error;
}

PyInterpreterState *interp = tstate->interp;
if (_PyImport_FixupBuiltin(bimod, "builtins", interp->modules) < 0) {
goto error;
}
_PyImport_FixupBuiltin(bimod, "builtins", interp->modules);

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

PyStatus status = _PyBuiltins_AddExceptions(bimod);
if (_PyStatus_EXCEPTION(status)) {
return status;
}

interp->builtins_copy = PyDict_Copy(interp->builtins);
if (interp->builtins_copy == NULL) {
goto error;
}
return _PyStatus_OK();

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


Expand All @@ -649,12 +660,7 @@ pycore_init_import_warnings(PyThreadState *tstate, PyObject *sysmod)
{
const PyConfig *config = &tstate->interp->config;

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

status = _PyImportHooks_Init(tstate);
PyStatus status = _PyImportHooks_Init(tstate);
if (_PyStatus_EXCEPTION(status)) {
return status;
}
Expand Down Expand Up @@ -1558,23 +1564,12 @@ new_interpreter(PyThreadState **tstate_p)
goto handle_exc;
}

PyObject *bimod = _PyImport_FindBuiltin(tstate, "builtins");
if (bimod != NULL) {
interp->builtins = PyModule_GetDict(bimod);
if (interp->builtins == NULL)
goto handle_exc;
Py_INCREF(interp->builtins);
}
else if (_PyErr_Occurred(tstate)) {
goto handle_exc;
status = pycore_init_builtins(tstate);
if (_PyStatus_EXCEPTION(status)) {
goto done;
}

if (bimod != NULL && sysmod != NULL) {
status = _PyBuiltins_AddExceptions(bimod);
if (_PyStatus_EXCEPTION(status)) {
goto done;
}

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