]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-39947: Use PyThreadState_GetFrame() (GH-19159)
authorVictor Stinner <vstinner@python.org>
Wed, 25 Mar 2020 18:52:02 +0000 (19:52 +0100)
committerGitHub <noreply@github.com>
Wed, 25 Mar 2020 18:52:02 +0000 (19:52 +0100)
_tracemalloc.c and _xxsubinterpretersmodule.c use
PyThreadState_GetFrame() and PyThreadState_GetInterpreter() to no
longer depend on the PyThreadState structure.

Modules/_tracemalloc.c
Modules/_xxsubinterpretersmodule.c

index 74c09e4d48535cff74a9cdd3805c5999144f95a6..bef44dbc28bf241ddce161abc1daa8632f7179f6 100644 (file)
@@ -445,7 +445,8 @@ traceback_get_frames(traceback_t *traceback)
         return;
     }
 
-    for (pyframe = tstate->frame; pyframe != NULL; pyframe = pyframe->f_back) {
+    pyframe = PyThreadState_GetFrame(tstate);
+    for (; pyframe != NULL; pyframe = pyframe->f_back) {
         if (traceback->nframe < _Py_tracemalloc_config.max_nframe) {
             tracemalloc_get_frame(pyframe, &traceback->frames[traceback->nframe]);
             assert(traceback->frames[traceback->nframe].filename != NULL);
index 526115a682648e689abc5eb3a62b49776f5b0f4b..b3616ae1b76652f0fd7fee775ffd48761779abd7 100644 (file)
@@ -1830,7 +1830,7 @@ _is_running(PyInterpreterState *interp)
                         "interpreter has more than one thread");
         return -1;
     }
-    PyFrameObject *frame = tstate->frame;
+    PyFrameObject *frame = PyThreadState_GetFrame(tstate);
     if (frame == NULL) {
         if (PyErr_Occurred() != NULL) {
             return -1;
@@ -2004,7 +2004,8 @@ interp_create(PyObject *self, PyObject *args)
         PyErr_SetString(PyExc_RuntimeError, "interpreter creation failed");
         return NULL;
     }
-    PyObject *idobj = _PyInterpreterState_GetIDObject(tstate->interp);
+    PyInterpreterState *interp = PyThreadState_GetInterpreter(tstate);
+    PyObject *idobj = _PyInterpreterState_GetIDObject(interp);
     if (idobj == NULL) {
         // XXX Possible GILState issues?
         save_tstate = PyThreadState_Swap(tstate);
@@ -2012,7 +2013,7 @@ interp_create(PyObject *self, PyObject *args)
         PyThreadState_Swap(save_tstate);
         return NULL;
     }
-    _PyInterpreterState_RequireIDRef(tstate->interp, 1);
+    _PyInterpreterState_RequireIDRef(interp, 1);
     return idobj;
 }