bpo-38858: new_interpreter() reuses pycore_init_builtins() (GH-17351) · python/cpython@2582d46
@@ -622,25 +622,36 @@ pycore_init_types(PyThreadState *tstate)
622622static PyStatus
623623pycore_init_builtins(PyThreadState *tstate)
624624{
625-PyInterpreterState *interp = tstate->interp;
626-627625PyObject *bimod = _PyBuiltin_Init(tstate);
628626if (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;
638641639642PyStatus status = _PyBuiltins_AddExceptions(bimod);
640643if (_PyStatus_EXCEPTION(status)) {
641644return status;
642645 }
646+647+interp->builtins_copy = PyDict_Copy(interp->builtins);
648+if (interp->builtins_copy == NULL) {
649+ goto error;
650+ }
643651return _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{
650661const 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);
658664if (_PyStatus_EXCEPTION(status)) {
659665return 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) {
15781573status = _PySys_SetPreliminaryStderr(interp->sysdict);
15791574if (_PyStatus_EXCEPTION(status)) {
15801575 goto done;