diff --git a/Include/ceval.h b/Include/ceval.h index 9bb145d14ea..8d0ca9eb1fd 100644 --- a/Include/ceval.h +++ b/Include/ceval.h @@ -25,11 +25,13 @@ PyAPI_FUNC(PyObject *) PyEval_CallMethod(PyObject *obj, PyAPI_FUNC(void) PyEval_SetProfile(Py_tracefunc, PyObject *); PyAPI_FUNC(void) PyEval_SetTrace(Py_tracefunc, PyObject *); +struct _frame; /* Avoid including frameobject.h */ + PyAPI_FUNC(PyObject *) PyEval_GetBuiltins(void); PyAPI_FUNC(PyObject *) PyEval_GetGlobals(void); PyAPI_FUNC(PyObject *) PyEval_GetLocals(void); PyAPI_FUNC(PyObject *) PyEval_GetOwner(void); -PyAPI_FUNC(PyObject *) PyEval_GetFrame(void); +PyAPI_FUNC(struct _frame *) PyEval_GetFrame(void); PyAPI_FUNC(int) PyEval_GetRestricted(void); /* Look at the current frame's (if any) code's co_flags, and turn on diff --git a/Include/pystate.h b/Include/pystate.h index d4233bfeeda..3e5b5b402d1 100644 --- a/Include/pystate.h +++ b/Include/pystate.h @@ -107,8 +107,10 @@ PyAPI_FUNC(PyInterpreterState *) PyInterpreterState_Next(PyInterpreterState *); PyAPI_FUNC(PyThreadState *) PyInterpreterState_ThreadHead(PyInterpreterState *); PyAPI_FUNC(PyThreadState *) PyThreadState_Next(PyThreadState *); +typedef struct _frame *(*PyThreadFrameGetter)(PyThreadState *self_); + /* hook for PyEval_GetFrame(), requested for Psyco */ -PyAPI_DATA(unaryfunc) _PyThreadState_GetFrame; +PyAPI_DATA(PyThreadFrameGetter) _PyThreadState_GetFrame; #ifdef __cplusplus } diff --git a/Misc/NEWS b/Misc/NEWS index 7198541a2ab..2b12d6cb732 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -326,6 +326,9 @@ Build C API ----- +- PyEval_GetFrame() is now declared to return a PyFrameObject * + instead of a plain PyObject *. (SF patch #686601.) + - PyNumber_Check() now checks that the object has a nb_int or nb_float slot, rather than simply checking whether it has a non-NULL tp_as_number pointer. diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c index 0f9574fe29b..2224ec9f05f 100644 --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -766,7 +766,7 @@ PyErr_CheckSignals(void) if (PyThread_get_thread_ident() != main_thread) return 0; #endif - if (!(f = PyEval_GetFrame())) + if (!(f = (PyObject *)PyEval_GetFrame())) f = Py_None; for (i = 1; i < NSIG; i++) { diff --git a/Python/ceval.c b/Python/ceval.c index 801f08d15eb..9a5d03994d5 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -3077,7 +3077,7 @@ PyEval_SetTrace(Py_tracefunc func, PyObject *arg) PyObject * PyEval_GetBuiltins(void) { - PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame(); + PyFrameObject *current_frame = PyEval_GetFrame(); if (current_frame == NULL) return PyThreadState_Get()->interp->builtins; else @@ -3087,7 +3087,7 @@ PyEval_GetBuiltins(void) PyObject * PyEval_GetLocals(void) { - PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame(); + PyFrameObject *current_frame = PyEval_GetFrame(); if (current_frame == NULL) return NULL; PyFrame_FastToLocals(current_frame); @@ -3097,31 +3097,31 @@ PyEval_GetLocals(void) PyObject * PyEval_GetGlobals(void) { - PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame(); + PyFrameObject *current_frame = PyEval_GetFrame(); if (current_frame == NULL) return NULL; else return current_frame->f_globals; } -PyObject * +PyFrameObject * PyEval_GetFrame(void) { PyThreadState *tstate = PyThreadState_Get(); - return _PyThreadState_GetFrame((PyObject *)tstate); + return _PyThreadState_GetFrame(tstate); } int PyEval_GetRestricted(void) { - PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame(); + PyFrameObject *current_frame = PyEval_GetFrame(); return current_frame == NULL ? 0 : current_frame->f_restricted; } int PyEval_MergeCompilerFlags(PyCompilerFlags *cf) { - PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame(); + PyFrameObject *current_frame = PyEval_GetFrame(); int result = cf->cf_flags != 0; if (current_frame != NULL) { diff --git a/Python/pystate.c b/Python/pystate.c index 707e43e90d7..e200ece8b9b 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -35,7 +35,7 @@ static PyThread_type_lock head_mutex = NULL; /* Protects interp->tstate_head */ static PyInterpreterState *interp_head = NULL; PyThreadState *_PyThreadState_Current = NULL; -unaryfunc _PyThreadState_GetFrame = NULL; +PyThreadFrameGetter _PyThreadState_GetFrame = NULL; PyInterpreterState * @@ -126,7 +126,7 @@ PyThreadState_New(PyInterpreterState *interp) { PyThreadState *tstate = PyMem_NEW(PyThreadState, 1); if (_PyThreadState_GetFrame == NULL) - _PyThreadState_GetFrame = (unaryfunc)threadstate_getframe; + _PyThreadState_GetFrame = threadstate_getframe; if (tstate != NULL) { tstate->interp = interp;