- PyEval_GetFrame() is now declared to return a PyFrameObject *
authorGuido van Rossum <guido@python.org>
Wed, 19 Feb 2003 15:53:17 +0000 (15:53 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 19 Feb 2003 15:53:17 +0000 (15:53 +0000)
  instead of a plain PyObject *.  (SF patch #686601 by Ben Laurie.)

Include/ceval.h
Include/pystate.h
Misc/NEWS
Modules/signalmodule.c
Python/ceval.c
Python/pystate.c

index 9bb145d14ea8f20145e608a5ee58500e22c49b12..8d0ca9eb1fd0db46ce5e2a57c249336dbccffeb3 100644 (file)
@@ -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
index d4233bfeedab2a1dfd6b8b81d08724d99482cd46..3e5b5b402d1a3962ab48516e966bf7fb5cd14a22 100644 (file)
@@ -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
 }
index 7198541a2ab402abe8e06e68e3083f23673875ff..2b12d6cb73251c5a863d247d8437891ac244fc7c 100644 (file)
--- 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.
index 0f9574fe29b4f857b542c97c8ce2392fe11b6890..2224ec9f05fb405359abf23d6abbc4a3b977409d 100644 (file)
@@ -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++) {
index 801f08d15ebfbecfca84a1bc1f7f22dc4c8acb75..9a5d03994d50220f734f49c67151d32252a02243 100644 (file)
@@ -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) {
index 707e43e90d749b5c611cbdf2708d38290bf6441b..e200ece8b9b5ff239a6e35ffcc16508000d5c4cc 100644 (file)
@@ -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;