Kaydet (Commit) 5e40e74b authored tarafından Michael W. Hudson's avatar Michael W. Hudson

This is Armin Rigo's patch:

[ 617309 ] getframe hook (Psyco #1)

Forward port candidate.
üst ddd3f0ea
......@@ -109,6 +109,9 @@ DL_IMPORT(PyInterpreterState *) PyInterpreterState_Next(PyInterpreterState *);
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
......
......@@ -392,7 +392,7 @@ call_with_frame(PyCodeObject *c, PyObject* func, PyObject* args)
f = PyFrame_New(
tstate, /*back*/
c, /*code*/
tstate->frame->f_globals, /*globals*/
PyEval_GetGlobals(), /*globals*/
NULL /*locals*/
);
if (f == NULL)
......
......@@ -2949,10 +2949,9 @@ PyEval_SetTrace(Py_tracefunc func, PyObject *arg)
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;
}
......@@ -2960,7 +2959,7 @@ PyEval_GetBuiltins(void)
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);
......@@ -2970,7 +2969,7 @@ PyEval_GetLocals(void)
PyObject *
PyEval_GetGlobals(void)
{
PyFrameObject *current_frame = PyThreadState_Get()->frame;
PyFrameObject *current_frame = (PyFrameObject *)PyEval_GetFrame();
if (current_frame == NULL)
return NULL;
else
......@@ -2980,21 +2979,21 @@ PyEval_GetGlobals(void)
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) {
......
......@@ -35,6 +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;
PyInterpreterState *
......@@ -114,10 +115,19 @@ PyInterpreterState_Delete(PyInterpreterState *interp)
}
/* 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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment