bpo-38858: new_interpreter() reuses _PySys_Create() (GH-17481) · python/cpython@81fe5bd (original) (raw)
`@@ -622,6 +622,8 @@ pycore_init_types(PyThreadState *tstate)
`
622
622
`static PyStatus
`
623
623
`pycore_init_builtins(PyThreadState *tstate)
`
624
624
`{
`
``
625
`+
assert(!_PyErr_Occurred(tstate));
`
``
626
+
625
627
`PyObject *bimod = _PyBuiltin_Init(tstate);
`
626
628
`if (bimod == NULL) {
`
627
629
` goto error;
`
`@@ -649,6 +651,9 @@ pycore_init_builtins(PyThreadState *tstate)
`
649
651
` goto error;
`
650
652
` }
`
651
653
`Py_DECREF(bimod);
`
``
654
+
``
655
`+
assert(!_PyErr_Occurred(tstate));
`
``
656
+
652
657
`return _PyStatus_OK();
`
653
658
``
654
659
`error:
`
`@@ -660,13 +665,14 @@ pycore_init_builtins(PyThreadState *tstate)
`
660
665
`static PyStatus
`
661
666
`pycore_init_import_warnings(PyThreadState *tstate, PyObject *sysmod)
`
662
667
`{
`
663
``
`-
const PyConfig *config = &tstate->interp->config;
`
``
668
`+
assert(!_PyErr_Occurred(tstate));
`
664
669
``
665
670
`PyStatus status = _PyImportHooks_Init(tstate);
`
666
671
`if (_PyStatus_EXCEPTION(status)) {
`
667
672
`return status;
`
668
673
` }
`
669
674
``
``
675
`+
const PyConfig *config = &tstate->interp->config;
`
670
676
`if (_Py_IsMainInterpreter(tstate)) {
`
671
677
`/* Initialize _warnings. */
`
672
678
`if (_PyWarnings_Init() == NULL) {
`
`@@ -688,6 +694,9 @@ pycore_init_import_warnings(PyThreadState *tstate, PyObject *sysmod)
`
688
694
`return status;
`
689
695
` }
`
690
696
` }
`
``
697
+
``
698
`+
assert(!_PyErr_Occurred(tstate));
`
``
699
+
691
700
`return _PyStatus_OK();
`
692
701
`}
`
693
702
``
`@@ -929,6 +938,8 @@ _Py_ReconfigureMainInterpreter(PyThreadState *tstate)
`
929
938
`static PyStatus
`
930
939
`init_interp_main(PyThreadState *tstate)
`
931
940
`{
`
``
941
`+
assert(!_PyErr_Occurred(tstate));
`
``
942
+
932
943
`PyStatus status;
`
933
944
`int is_main_interp = _Py_IsMainInterpreter(tstate);
`
934
945
`PyInterpreterState *interp = tstate->interp;
`
`@@ -950,10 +961,10 @@ init_interp_main(PyThreadState *tstate)
`
950
961
`if (_PyTime_Init() < 0) {
`
951
962
`return _PyStatus_ERR("can't initialize time");
`
952
963
` }
`
``
964
`+
}
`
953
965
``
954
``
`-
if (_PySys_InitMain(tstate) < 0) {
`
955
``
`-
return _PyStatus_ERR("can't finish initializing sys");
`
956
``
`-
}
`
``
966
`+
if (_PySys_InitMain(tstate) < 0) {
`
``
967
`+
return _PyStatus_ERR("can't finish initializing sys");
`
957
968
` }
`
958
969
``
959
970
`status = init_importlib_external(tstate);
`
`@@ -1031,6 +1042,8 @@ init_interp_main(PyThreadState *tstate)
`
1031
1042
`#endif
`
1032
1043
` }
`
1033
1044
``
``
1045
`+
assert(!_PyErr_Occurred(tstate));
`
``
1046
+
1034
1047
`return _PyStatus_OK();
`
1035
1048
`}
`
1036
1049
``
`@@ -1534,70 +1547,40 @@ new_interpreter(PyThreadState **tstate_p)
`
1534
1547
``
1535
1548
`status = _PyConfig_Copy(&interp->config, config);
`
1536
1549
`if (_PyStatus_EXCEPTION(status)) {
`
1537
``
`-
goto done;
`
``
1550
`+
goto error;
`
1538
1551
` }
`
1539
1552
`config = &interp->config;
`
1540
1553
``
1541
1554
`status = pycore_init_types(tstate);
`
1542
``
-
1543
``
`-
/* XXX The following is lax in error checking */
`
1544
``
`-
PyObject *modules = PyDict_New();
`
1545
``
`-
if (modules == NULL) {
`
1546
``
`-
status = _PyStatus_ERR("can't make modules dictionary");
`
1547
``
`-
goto done;
`
``
1555
`+
if (_PyStatus_EXCEPTION(status)) {
`
``
1556
`+
goto error;
`
1548
1557
` }
`
1549
``
`-
interp->modules = modules;
`
1550
1558
``
1551
``
`-
PyObject *sysmod = _PyImport_FindBuiltin(tstate, "sys");
`
1552
``
`-
if (sysmod != NULL) {
`
1553
``
`-
interp->sysdict = PyModule_GetDict(sysmod);
`
1554
``
`-
if (interp->sysdict == NULL) {
`
1555
``
`-
goto handle_exc;
`
1556
``
`-
}
`
1557
``
`-
Py_INCREF(interp->sysdict);
`
1558
``
`-
PyDict_SetItemString(interp->sysdict, "modules", modules);
`
1559
``
`-
if (_PySys_InitMain(tstate) < 0) {
`
1560
``
`-
status = _PyStatus_ERR("can't finish initializing sys");
`
1561
``
`-
goto done;
`
1562
``
`-
}
`
1563
``
`-
}
`
1564
``
`-
else if (_PyErr_Occurred(tstate)) {
`
1565
``
`-
goto handle_exc;
`
``
1559
`+
PyObject *sysmod;
`
``
1560
`+
status = _PySys_Create(tstate, &sysmod);
`
``
1561
`+
if (_PyStatus_EXCEPTION(status)) {
`
``
1562
`+
return status;
`
1566
1563
` }
`
1567
1564
``
1568
1565
`status = pycore_init_builtins(tstate);
`
1569
1566
`if (_PyStatus_EXCEPTION(status)) {
`
1570
``
`-
goto done;
`
``
1567
`+
goto error;
`
1571
1568
` }
`
1572
1569
``
1573
``
`-
if (sysmod != NULL) {
`
1574
``
`-
status = _PySys_SetPreliminaryStderr(interp->sysdict);
`
1575
``
`-
if (_PyStatus_EXCEPTION(status)) {
`
1576
``
`-
goto done;
`
1577
``
`-
}
`
1578
``
-
1579
``
`-
status = pycore_init_import_warnings(tstate, sysmod);
`
1580
``
`-
if (_PyStatus_EXCEPTION(status)) {
`
1581
``
`-
goto done;
`
1582
``
`-
}
`
1583
``
-
1584
``
`-
status = init_interp_main(tstate);
`
1585
``
`-
if (_PyStatus_EXCEPTION(status)) {
`
1586
``
`-
goto done;
`
1587
``
`-
}
`
``
1570
`+
status = pycore_init_import_warnings(tstate, sysmod);
`
``
1571
`+
if (_PyStatus_EXCEPTION(status)) {
`
``
1572
`+
goto error;
`
1588
1573
` }
`
1589
1574
``
1590
``
`-
if (_PyErr_Occurred(tstate)) {
`
1591
``
`-
goto handle_exc;
`
``
1575
`+
status = init_interp_main(tstate);
`
``
1576
`+
if (_PyStatus_EXCEPTION(status)) {
`
``
1577
`+
goto error;
`
1592
1578
` }
`
1593
1579
``
1594
1580
`*tstate_p = tstate;
`
1595
1581
`return _PyStatus_OK();
`
1596
1582
``
1597
``
`-
handle_exc:
`
1598
``
`-
status = _PyStatus_OK();
`
1599
``
-
1600
``
`-
done:
`
``
1583
`+
error:
`
1601
1584
`*tstate_p = NULL;
`
1602
1585
``
1603
1586
`/* Oops, it didn't work. Undo it all. */
`