DL_IMPORT(PyThreadState *) PyInterpreterState_ThreadHead(PyInterpreterState *);
DL_IMPORT(PyThreadState *) PyThreadState_Next(PyThreadState *);
+/* hook for PyEval_GetFrame(), requested for Psyco */
+extern DL_IMPORT(unaryfunc) _PyThreadState_GetFrame;
+
#ifdef __cplusplus
}
#endif
PyObject *
PyEval_GetBuiltins(void)
{
- PyThreadState *tstate = PyThreadState_Get();
- PyFrameObject *current_frame = tstate->frame;
+ PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
if (current_frame == NULL)
- return tstate->interp->builtins;
+ return PyThreadState_Get()->interp->builtins;
else
return current_frame->f_builtins;
}
PyObject *
PyEval_GetLocals(void)
{
- PyFrameObject *current_frame = PyThreadState_Get()->frame;
+ PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
if (current_frame == NULL)
return NULL;
PyFrame_FastToLocals(current_frame);
PyObject *
PyEval_GetGlobals(void)
{
- PyFrameObject *current_frame = PyThreadState_Get()->frame;
+ PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
if (current_frame == NULL)
return NULL;
else
PyObject *
PyEval_GetFrame(void)
{
- PyFrameObject *current_frame = PyThreadState_Get()->frame;
- return (PyObject *)current_frame;
+ PyThreadState *tstate = PyThreadState_Get();
+ return _PyThreadState_GetFrame((PyObject *)tstate);
}
int
PyEval_GetRestricted(void)
{
- PyFrameObject *current_frame = PyThreadState_Get()->frame;
+ PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
return current_frame == NULL ? 0 : current_frame->f_restricted;
}
int
PyEval_MergeCompilerFlags(PyCompilerFlags *cf)
{
- PyFrameObject *current_frame = PyThreadState_Get()->frame;
+ PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
int result = 0;
if (current_frame != NULL) {
static PyInterpreterState *interp_head = NULL;
PyThreadState *_PyThreadState_Current = NULL;
+unaryfunc _PyThreadState_GetFrame = NULL;
PyInterpreterState *
}
+/* Default implementation for _PyThreadState_GetFrame */
+static struct _frame *
+threadstate_getframe(PyThreadState *self)
+{
+ return self->frame;
+}
+
PyThreadState *
PyThreadState_New(PyInterpreterState *interp)
{
PyThreadState *tstate = PyMem_NEW(PyThreadState, 1);
+ if (_PyThreadState_GetFrame == NULL)
+ _PyThreadState_GetFrame = (unaryfunc)threadstate_getframe;
if (tstate != NULL) {
tstate->interp = interp;