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. */

`