summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Include/cpython/initconfig.h1
-rw-r--r--Include/cpython/pylifecycle.h5
-rw-r--r--Include/internal/pycore_initconfig.h2
-rw-r--r--Modules/_testcapimodule.c8
-rw-r--r--Modules/_xxsubinterpretersmodule.c9
-rw-r--r--Python/pylifecycle.c19
6 files changed, 27 insertions, 17 deletions
diff --git a/Include/cpython/initconfig.h b/Include/cpython/initconfig.h
index a070fa9..8bc681b 100644
--- a/Include/cpython/initconfig.h
+++ b/Include/cpython/initconfig.h
@@ -25,6 +25,7 @@ PyAPI_FUNC(PyStatus) PyStatus_Exit(int exitcode);
PyAPI_FUNC(int) PyStatus_IsError(PyStatus err);
PyAPI_FUNC(int) PyStatus_IsExit(PyStatus err);
PyAPI_FUNC(int) PyStatus_Exception(PyStatus err);
+PyAPI_FUNC(PyObject *) _PyErr_SetFromPyStatus(PyStatus status);
/* --- PyWideStringList ------------------------------------------------ */
diff --git a/Include/cpython/pylifecycle.h b/Include/cpython/pylifecycle.h
index e1f83ac..821b169 100644
--- a/Include/cpython/pylifecycle.h
+++ b/Include/cpython/pylifecycle.h
@@ -62,5 +62,6 @@ PyAPI_FUNC(int) _Py_CoerceLegacyLocale(int warn);
PyAPI_FUNC(int) _Py_LegacyLocaleDetected(int warn);
PyAPI_FUNC(char *) _Py_SetLocaleFromEnv(int category);
-PyAPI_FUNC(PyThreadState *) _Py_NewInterpreterFromConfig(
- const _PyInterpreterConfig *);
+PyAPI_FUNC(PyStatus) _Py_NewInterpreterFromConfig(
+ PyThreadState **tstate_p,
+ const _PyInterpreterConfig *config);
diff --git a/Include/internal/pycore_initconfig.h b/Include/internal/pycore_initconfig.h
index 69f88d7..4cbd14a 100644
--- a/Include/internal/pycore_initconfig.h
+++ b/Include/internal/pycore_initconfig.h
@@ -44,8 +44,6 @@ struct pyruntimestate;
#define _PyStatus_UPDATE_FUNC(err) \
do { (err).func = _PyStatus_GET_FUNC(); } while (0)
-PyObject* _PyErr_SetFromPyStatus(PyStatus status);
-
/* --- PyWideStringList ------------------------------------------------ */
#define _PyWideStringList_INIT (PyWideStringList){.length = 0, .items = NULL}
diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c
index f45d031..e2ebab5 100644
--- a/Modules/_testcapimodule.c
+++ b/Modules/_testcapimodule.c
@@ -1538,15 +1538,19 @@ run_in_subinterp_with_config(PyObject *self, PyObject *args, PyObject *kwargs)
.allow_daemon_threads = allow_daemon_threads,
.check_multi_interp_extensions = check_multi_interp_extensions,
};
- substate = _Py_NewInterpreterFromConfig(&config);
- if (substate == NULL) {
+ PyStatus status = _Py_NewInterpreterFromConfig(&substate, &config);
+ if (PyStatus_Exception(status)) {
/* Since no new thread state was created, there is no exception to
propagate; raise a fresh one after swapping in the old thread
state. */
PyThreadState_Swap(mainstate);
+ _PyErr_SetFromPyStatus(status);
+ PyObject *exc = PyErr_GetRaisedException();
PyErr_SetString(PyExc_RuntimeError, "sub-interpreter creation failed");
+ _PyErr_ChainExceptions1(exc);
return NULL;
}
+ assert(substate != NULL);
r = PyRun_SimpleStringFlags(code, &cflags);
Py_EndInterpreter(substate);
diff --git a/Modules/_xxsubinterpretersmodule.c b/Modules/_xxsubinterpretersmodule.c
index 76fb87f..9648f08 100644
--- a/Modules/_xxsubinterpretersmodule.c
+++ b/Modules/_xxsubinterpretersmodule.c
@@ -526,15 +526,20 @@ interp_create(PyObject *self, PyObject *args, PyObject *kwds)
? (_PyInterpreterConfig)_PyInterpreterConfig_INIT
: (_PyInterpreterConfig)_PyInterpreterConfig_LEGACY_INIT;
// XXX Possible GILState issues?
- PyThreadState *tstate = _Py_NewInterpreterFromConfig(&config);
+ PyThreadState *tstate = NULL;
+ PyStatus status = _Py_NewInterpreterFromConfig(&tstate, &config);
PyThreadState_Swap(save_tstate);
- if (tstate == NULL) {
+ if (PyStatus_Exception(status)) {
/* Since no new thread state was created, there is no exception to
propagate; raise a fresh one after swapping in the old thread
state. */
+ _PyErr_SetFromPyStatus(status);
+ PyObject *exc = PyErr_GetRaisedException();
PyErr_SetString(PyExc_RuntimeError, "interpreter creation failed");
+ _PyErr_ChainExceptions1(exc);
return NULL;
}
+ assert(tstate != NULL);
PyInterpreterState *interp = PyThreadState_GetInterpreter(tstate);
PyObject *idobj = _PyInterpreterState_GetIDObject(interp);
if (idobj == NULL) {
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index 731f340..8b58a14 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -2065,22 +2065,23 @@ error:
return status;
}
-PyThreadState *
-_Py_NewInterpreterFromConfig(const _PyInterpreterConfig *config)
+PyStatus
+_Py_NewInterpreterFromConfig(PyThreadState **tstate_p,
+ const _PyInterpreterConfig *config)
{
- PyThreadState *tstate = NULL;
- PyStatus status = new_interpreter(&tstate, config);
- if (_PyStatus_EXCEPTION(status)) {
- Py_ExitStatusException(status);
- }
- return tstate;
+ return new_interpreter(tstate_p, config);
}
PyThreadState *
Py_NewInterpreter(void)
{
+ PyThreadState *tstate = NULL;
const _PyInterpreterConfig config = _PyInterpreterConfig_LEGACY_INIT;
- return _Py_NewInterpreterFromConfig(&config);
+ PyStatus status = _Py_NewInterpreterFromConfig(&tstate, &config);
+ if (_PyStatus_EXCEPTION(status)) {
+ Py_ExitStatusException(status);
+ }
+ return tstate;
}
/* Delete an interpreter and its last thread. This requires that the