]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-39946: Remove _PyThreadState_GetFrame (GH-19094)
authorVictor Stinner <vstinner@python.org>
Fri, 20 Mar 2020 16:46:56 +0000 (17:46 +0100)
committerGitHub <noreply@github.com>
Fri, 20 Mar 2020 16:46:56 +0000 (17:46 +0100)
Remove _PyRuntime.getframe hook and remove _PyThreadState_GetFrame
macro which was an alias to _PyRuntime.getframe. They were only
exposed by the internal C API. Remove also PyThreadFrameGetter type.

Doc/whatsnew/3.9.rst
Include/cpython/pystate.h
Include/internal/pycore_pystate.h
Misc/NEWS.d/next/C API/2020-03-20-17-05-52.bpo-39946.3NS-Ls.rst [new file with mode: 0644]
Python/ceval.c
Python/pystate.c
Python/traceback.c

index 3e30f84c2ce22f6ed47c4276cfcbac77505242e0..5c84ca10e20378975f012bebbddb23024827c761 100644 (file)
@@ -533,6 +533,10 @@ Build and C API Changes
   scheduled calls.
   (Contributed by Victor Stinner in :issue:`39984`.)
 
+* Remove ``_PyRuntime.getframe`` hook and remove ``_PyThreadState_GetFrame``
+  macro which was an alias to ``_PyRuntime.getframe``. They were only exposed
+  by the internal C API. Remove also ``PyThreadFrameGetter`` type.
+  (Contributed by Victor Stinner in :issue:`39946`.)
 
 Deprecated
 ==========
index 96df0d91fb544bde9a2239dcca7aa1953617f875..de3529670a845b3a523c25044e4f9f3013151018 100644 (file)
@@ -179,8 +179,6 @@ PyAPI_FUNC(PyThreadState *) PyInterpreterState_ThreadHead(PyInterpreterState *);
 PyAPI_FUNC(PyThreadState *) PyThreadState_Next(PyThreadState *);
 PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void);
 
-typedef struct _frame *(*PyThreadFrameGetter)(PyThreadState *self_);
-
 /* Frame evaluation API */
 
 typedef PyObject* (*_PyFrameEvalFunction)(PyThreadState *tstate, struct _frame *, int);
index 0073e205bea96f2074defeedd7e4190d874f1139..50d906c4c6ddecbb17dc861c8409f84970d82634 100644 (file)
@@ -192,7 +192,6 @@ struct _gilstate_runtime_state {
     /* Assuming the current thread holds the GIL, this is the
        PyThreadState for the current thread. */
     _Py_atomic_address tstate_current;
-    PyThreadFrameGetter getframe;
     /* The single PyInterpreterState used by this process'
        GILState implementation
     */
@@ -201,9 +200,6 @@ struct _gilstate_runtime_state {
     Py_tss_t autoTSSkey;
 };
 
-/* hook for PyEval_GetFrame(), requested for Psyco */
-#define _PyThreadState_GetFrame _PyRuntime.gilstate.getframe
-
 /* Issue #26558: Flag to disable PyGILState_Check().
    If set to non-zero, PyGILState_Check() always return 1. */
 #define _PyGILState_check_enabled _PyRuntime.gilstate.check_enabled
diff --git a/Misc/NEWS.d/next/C API/2020-03-20-17-05-52.bpo-39946.3NS-Ls.rst b/Misc/NEWS.d/next/C API/2020-03-20-17-05-52.bpo-39946.3NS-Ls.rst
new file mode 100644 (file)
index 0000000..4f0e4b7
--- /dev/null
@@ -0,0 +1,3 @@
+Remove ``_PyRuntime.getframe`` hook and remove ``_PyThreadState_GetFrame``
+macro which was an alias to ``_PyRuntime.getframe``. They were only exposed
+by the internal C API. Remove also ``PyThreadFrameGetter`` type.
index c80ee4b463cf7f7cb812f65fd334645535595d99..836457d1a57a4313e7b90b1fca3fed875bd8d7b3 100644 (file)
@@ -4825,25 +4825,18 @@ _PyEval_GetAsyncGenFinalizer(void)
     return tstate->async_gen_finalizer;
 }
 
-static PyFrameObject *
-_PyEval_GetFrame(PyThreadState *tstate)
-{
-    _PyRuntimeState *runtime = tstate->interp->runtime;
-    return runtime->gilstate.getframe(tstate);
-}
-
 PyFrameObject *
 PyEval_GetFrame(void)
 {
     PyThreadState *tstate = _PyThreadState_GET();
-    return _PyEval_GetFrame(tstate);
+    return tstate->frame;
 }
 
 PyObject *
 PyEval_GetBuiltins(void)
 {
     PyThreadState *tstate = _PyThreadState_GET();
-    PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
+    PyFrameObject *current_frame = tstate->frame;
     if (current_frame == NULL)
         return tstate->interp->builtins;
     else
@@ -4869,7 +4862,7 @@ PyObject *
 PyEval_GetLocals(void)
 {
     PyThreadState *tstate = _PyThreadState_GET();
-    PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
+    PyFrameObject *current_frame = tstate->frame;
     if (current_frame == NULL) {
         _PyErr_SetString(tstate, PyExc_SystemError, "frame does not exist");
         return NULL;
@@ -4887,7 +4880,7 @@ PyObject *
 PyEval_GetGlobals(void)
 {
     PyThreadState *tstate = _PyThreadState_GET();
-    PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
+    PyFrameObject *current_frame = tstate->frame;
     if (current_frame == NULL) {
         return NULL;
     }
@@ -4900,7 +4893,7 @@ int
 PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
 {
     PyThreadState *tstate = _PyThreadState_GET();
-    PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
+    PyFrameObject *current_frame = tstate->frame;
     int result = cf->cf_flags != 0;
 
     if (current_frame != NULL) {
index eea666b7e5b6d21515b52bcd6fa7aeff024939ee..6331a854c810f86af8173db5ceaf36cfcf997299 100644 (file)
@@ -546,13 +546,6 @@ PyInterpreterState_GetDict(PyInterpreterState *interp)
     return interp->dict;
 }
 
-/* Default implementation for _PyThreadState_GetFrame */
-static struct _frame *
-threadstate_getframe(PyThreadState *self)
-{
-    return self->frame;
-}
-
 static PyThreadState *
 new_threadstate(PyInterpreterState *interp, int init)
 {
@@ -562,10 +555,6 @@ new_threadstate(PyInterpreterState *interp, int init)
         return NULL;
     }
 
-    if (_PyThreadState_GetFrame == NULL) {
-        _PyThreadState_GetFrame = threadstate_getframe;
-    }
-
     tstate->interp = interp;
 
     tstate->frame = NULL;
@@ -1000,9 +989,6 @@ PyInterpreterState *
 PyThreadState_GetInterpreter(PyThreadState *tstate)
 {
     assert(tstate != NULL);
-    if (tstate == NULL) {
-        return NULL;
-    }
     return tstate->interp;
 }
 
@@ -1011,7 +997,7 @@ struct _frame*
 PyThreadState_GetFrame(PyThreadState *tstate)
 {
     assert(tstate != NULL);
-    return _PyThreadState_GetFrame(tstate);
+    return tstate->frame;
 }
 
 
index 8aaee12031d291da7d389478908f79212e1b901a..f88ba1d0ad55a8f29f405d1918734ee54448cc82 100644 (file)
@@ -801,7 +801,7 @@ dump_traceback(int fd, PyThreadState *tstate, int write_header)
         PUTS(fd, "Stack (most recent call first):\n");
     }
 
-    frame = _PyThreadState_GetFrame(tstate);
+    frame = tstate->frame;
     if (frame == NULL) {
         PUTS(fd, "<no Python frame>\n");
         return;