summaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/src/Modules/_xxsubinterpretersmodule.c
diff options
context:
space:
mode:
authorshadchin <[email protected]>2022-04-18 12:39:32 +0300
committershadchin <[email protected]>2022-04-18 12:39:32 +0300
commitd4be68e361f4258cf0848fc70018dfe37a2acc24 (patch)
tree153e294cd97ac8b5d7a989612704a0c1f58e8ad4 /contrib/tools/python3/src/Modules/_xxsubinterpretersmodule.c
parent260c02f5ccf242d9d9b8a873afaf6588c00237d6 (diff)
IGNIETFERRO-1816 Update Python 3 from 3.9.12 to 3.10.4
ref:9f96be6d02ee8044fdd6f124b799b270c20ce641
Diffstat (limited to 'contrib/tools/python3/src/Modules/_xxsubinterpretersmodule.c')
-rw-r--r--contrib/tools/python3/src/Modules/_xxsubinterpretersmodule.c37
1 files changed, 22 insertions, 15 deletions
diff --git a/contrib/tools/python3/src/Modules/_xxsubinterpretersmodule.c b/contrib/tools/python3/src/Modules/_xxsubinterpretersmodule.c
index 314059d1082..9290255c66c 100644
--- a/contrib/tools/python3/src/Modules/_xxsubinterpretersmodule.c
+++ b/contrib/tools/python3/src/Modules/_xxsubinterpretersmodule.c
@@ -1780,7 +1780,12 @@ static PyTypeObject ChannelIDtype = {
0, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
+ // Use Py_TPFLAGS_DISALLOW_INSTANTIATION so the type cannot be instantiated
+ // from Python code. We do this because there is a strong relationship
+ // between channel IDs and the channel lifecycle, so this limitation avoids
+ // related complications. Use the _channel_id() function instead.
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE
+ | Py_TPFLAGS_DISALLOW_INSTANTIATION, /* tp_flags */
channelid_doc, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
@@ -1791,19 +1796,6 @@ static PyTypeObject ChannelIDtype = {
0, /* tp_methods */
0, /* tp_members */
channelid_getsets, /* tp_getset */
- 0, /* tp_base */
- 0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- 0, /* tp_init */
- 0, /* tp_alloc */
- // Note that we do not set tp_new to channelid_new. Instead we
- // set it to NULL, meaning it cannot be instantiated from Python
- // code. We do this because there is a strong relationship between
- // channel IDs and the channel lifecycle, so this limitation avoids
- // related complications.
- NULL, /* tp_new */
};
@@ -1847,7 +1839,7 @@ _is_running(PyInterpreterState *interp)
return 0;
}
- int executing = (int)(frame->f_executing);
+ int executing = _PyFrame_IsExecuting(frame);
Py_DECREF(frame);
return executing;
@@ -1939,6 +1931,20 @@ _run_script_in_interpreter(PyInterpreterState *interp, const char *codestr,
return -1;
}
+#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
+ // Switch to interpreter.
+ PyThreadState *new_tstate = PyInterpreterState_ThreadHead(interp);
+ PyThreadState *save1 = PyEval_SaveThread();
+
+ (void)PyThreadState_Swap(new_tstate);
+
+ // Run the script.
+ _sharedexception *exc = NULL;
+ int result = _run_script(interp, codestr, shared, &exc);
+
+ // Switch back.
+ PyEval_RestoreThread(save1);
+#else
// Switch to interpreter.
PyThreadState *save_tstate = NULL;
if (interp != PyInterpreterState_Get()) {
@@ -1956,6 +1962,7 @@ _run_script_in_interpreter(PyInterpreterState *interp, const char *codestr,
if (save_tstate != NULL) {
PyThreadState_Swap(save_tstate);
}
+#endif
// Propagate any exception out to the caller.
if (exc != NULL) {