bpo-38858: new_interpreter() reuses pycore_init_builtins() (GH-17351) · python/cpython@2582d46

@@ -622,25 +622,36 @@ pycore_init_types(PyThreadState *tstate)

622622

static PyStatus

623623

pycore_init_builtins(PyThreadState *tstate)

624624

{

625-

PyInterpreterState *interp = tstate->interp;

626-627625

PyObject *bimod = _PyBuiltin_Init(tstate);

628626

if (bimod == NULL) {

629-

return _PyStatus_ERR("can't initialize builtins modules");

627+

goto error;

628+

}

629+630+

PyInterpreterState *interp = tstate->interp;

631+

if (_PyImport_FixupBuiltin(bimod, "builtins", interp->modules) < 0) {

632+

goto error;

630633

}

631-

_PyImport_FixupBuiltin(bimod, "builtins", interp->modules);

632634633-

interp->builtins = PyModule_GetDict(bimod);

634-

if (interp->builtins == NULL) {

635-

return _PyStatus_ERR("can't initialize builtins dict");

635+

PyObject *builtins_dict = PyModule_GetDict(bimod);

636+

if (builtins_dict == NULL) {

637+

goto error;

636638

}

637-

Py_INCREF(interp->builtins);

639+

Py_INCREF(builtins_dict);

640+

interp->builtins = builtins_dict;

638641639642

PyStatus status = _PyBuiltins_AddExceptions(bimod);

640643

if (_PyStatus_EXCEPTION(status)) {

641644

return status;

642645

}

646+647+

interp->builtins_copy = PyDict_Copy(interp->builtins);

648+

if (interp->builtins_copy == NULL) {

649+

goto error;

650+

}

643651

return _PyStatus_OK();

652+653+

error:

654+

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

644655

}

645656646657

@@ -649,12 +660,7 @@ pycore_init_import_warnings(PyThreadState *tstate, PyObject *sysmod)

649660

{

650661

const PyConfig *config = &tstate->interp->config;

651662652-

PyStatus status = _PyImport_Init(tstate);

653-

if (_PyStatus_EXCEPTION(status)) {

654-

return status;

655-

}

656-657-

status = _PyImportHooks_Init(tstate);

663+

PyStatus status = _PyImportHooks_Init(tstate);

658664

if (_PyStatus_EXCEPTION(status)) {

659665

return status;

660666

}

@@ -1558,23 +1564,12 @@ new_interpreter(PyThreadState **tstate_p)

15581564

goto handle_exc;

15591565

}

156015661561-

PyObject *bimod = _PyImport_FindBuiltin(tstate, "builtins");

1562-

if (bimod != NULL) {

1563-

interp->builtins = PyModule_GetDict(bimod);

1564-

if (interp->builtins == NULL)

1565-

goto handle_exc;

1566-

Py_INCREF(interp->builtins);

1567-

}

1568-

else if (_PyErr_Occurred(tstate)) {

1569-

goto handle_exc;

1567+

status = pycore_init_builtins(tstate);

1568+

if (_PyStatus_EXCEPTION(status)) {

1569+

goto done;

15701570

}

157115711572-

if (bimod != NULL && sysmod != NULL) {

1573-

status = _PyBuiltins_AddExceptions(bimod);

1574-

if (_PyStatus_EXCEPTION(status)) {

1575-

goto done;

1576-

}

1577-1572+

if (sysmod != NULL) {

15781573

status = _PySys_SetPreliminaryStderr(interp->sysdict);

15791574

if (_PyStatus_EXCEPTION(status)) {

15801575

goto done;