]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
This is Armin Rigo's patch:
authorMichael W. Hudson <mwh@python.net>
Mon, 7 Oct 2002 09:47:21 +0000 (09:47 +0000)
committerMichael W. Hudson <mwh@python.net>
Mon, 7 Oct 2002 09:47:21 +0000 (09:47 +0000)
[ 617309 ] getframe hook (Psyco #1)

Forward port candidate.

Include/pystate.h
Modules/pyexpat.c
Python/ceval.c
Python/pystate.c

index 675b44a4c4ea989a9b7605cfc9c6c800c37f4cc0..9aa8ec8d577bc9c6610546b241098cd189ea43c3 100644 (file)
@@ -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
index 7b2f6c824e85d1ab5b5ec109e41525fc1213a011..44527e3af2b6dd193364aa1f3ae8dc00dbca0d9c 100644 (file)
@@ -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)
index 3a5504b6e6328019cb13db84c882c0ec7a775b4e..d764b54d5e125e49059e9b500d1a42ddad13e68f 100644 (file)
@@ -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) {
index 9a41ccffd462574a15fd4050d5120d036aa4a2fd..faf55f1a3548303aa9d7ed5b139f1bc966d7f4b9 100644 (file)
@@ -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;