Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Doc/whatsnew/3.9.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
==========
Expand Down
2 changes: 0 additions & 2 deletions Include/cpython/pystate.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
4 changes: 0 additions & 4 deletions Include/internal/pycore_pystate.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
*/
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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.
17 changes: 5 additions & 12 deletions Python/ceval.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
Expand All @@ -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;
}
Expand All @@ -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) {
Expand Down
16 changes: 1 addition & 15 deletions Python/pystate.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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;
Expand Down Expand Up @@ -1000,9 +989,6 @@ PyInterpreterState *
PyThreadState_GetInterpreter(PyThreadState *tstate)
{
assert(tstate != NULL);
if (tstate == NULL) {
return NULL;
}
return tstate->interp;
}

Expand All @@ -1011,7 +997,7 @@ struct _frame*
PyThreadState_GetFrame(PyThreadState *tstate)
{
assert(tstate != NULL);
return _PyThreadState_GetFrame(tstate);
return tstate->frame;
}


Expand Down
2 changes: 1 addition & 1 deletion Python/traceback.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down