- PyEval_GetFrame() is now declared to return a PyFrameObject *
  instead of a plain PyObject *.  (SF patch #686601 by Ben Laurie.)
diff --git a/Python/ceval.c b/Python/ceval.c
index 801f08d..9a5d039 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -3077,7 +3077,7 @@
 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 @@
 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 @@
 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 707e43e..e200ece 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -35,7 +35,7 @@
 static PyInterpreterState *interp_head = NULL;
 
 PyThreadState *_PyThreadState_Current = NULL;
-unaryfunc _PyThreadState_GetFrame = NULL;
+PyThreadFrameGetter _PyThreadState_GetFrame = NULL;
 
 
 PyInterpreterState *
@@ -126,7 +126,7 @@
 {
 	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;