From 5e40e74bbe77c0f9a2bc16ed19b5a2c83345c960 Mon Sep 17 00:00:00 2001 From: "Michael W. Hudson" Date: Mon, 7 Oct 2002 09:47:21 +0000 Subject: This is Armin Rigo's patch: [ 617309 ] getframe hook (Psyco #1) Forward port candidate. --- Include/pystate.h | 3 +++ Modules/pyexpat.c | 2 +- Python/ceval.c | 17 ++++++++--------- Python/pystate.c | 10 ++++++++++ 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/Include/pystate.h b/Include/pystate.h index 675b44a..9aa8ec8 100644 --- a/Include/pystate.h +++ b/Include/pystate.h @@ -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 diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index 7b2f6c8..44527e3 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -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) diff --git a/Python/ceval.c b/Python/ceval.c index 3a5504b..d764b54 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -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) { diff --git a/Python/pystate.c b/Python/pystate.c index 9a41ccf..faf55f1 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -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; -- cgit v0.12