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
==========
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);
/* 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
*/
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
--- /dev/null
+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.
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
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;
PyEval_GetGlobals(void)
{
PyThreadState *tstate = _PyThreadState_GET();
- PyFrameObject *current_frame = _PyEval_GetFrame(tstate);
+ PyFrameObject *current_frame = tstate->frame;
if (current_frame == NULL) {
return NULL;
}
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) {
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)
{
return NULL;
}
- if (_PyThreadState_GetFrame == NULL) {
- _PyThreadState_GetFrame = threadstate_getframe;
- }
-
tstate->interp = interp;
tstate->frame = NULL;
PyThreadState_GetInterpreter(PyThreadState *tstate)
{
assert(tstate != NULL);
- if (tstate == NULL) {
- return NULL;
- }
return tstate->interp;
}
PyThreadState_GetFrame(PyThreadState *tstate)
{
assert(tstate != NULL);
- return _PyThreadState_GetFrame(tstate);
+ return tstate->frame;
}
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;