]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-38644: Add _PyEval_EvalFrame() with tstate (GH-17131)
authorVictor Stinner <vstinner@python.org>
Thu, 14 Nov 2019 11:20:46 +0000 (12:20 +0100)
committerGitHub <noreply@github.com>
Thu, 14 Nov 2019 11:20:46 +0000 (12:20 +0100)
Add _PyEval_EvalFrame() static inline function to get eval_frame from
tstate->interp.

Include/internal/pycore_ceval.h
Objects/call.c
Objects/genobject.c
Python/ceval.c

index f20e4ebb7b18c8e75cb50e1508632f8958f04865..7adb87214a05864fb5987243b5f576763ac4dde2 100644 (file)
@@ -11,6 +11,9 @@ extern "C" {
 /* Forward declarations */
 struct pyruntimestate;
 struct _ceval_runtime_state;
+struct _frame;
+
+#include "pycore_pystate.h"   /* PyInterpreterState.eval_frame */
 
 PyAPI_FUNC(void) _Py_FinishPendingCalls(struct pyruntimestate *runtime);
 PyAPI_FUNC(void) _PyEval_Initialize(struct _ceval_runtime_state *);
@@ -34,6 +37,12 @@ PyAPI_FUNC(void) _PyEval_SetCoroutineOriginTrackingDepth(
 /* Private function */
 void _PyEval_Fini(void);
 
+static inline PyObject*
+_PyEval_EvalFrame(PyThreadState *tstate, struct _frame *f, int throwflag)
+{
+    return tstate->interp->eval_frame(f, throwflag);
+}
+
 #ifdef __cplusplus
 }
 #endif
index a8ae41a7842aef4b49d7f3e960013f6a0212cea6..96174c4e331e76406f6ec281a10aedaddf130836 100644 (file)
@@ -1,4 +1,5 @@
 #include "Python.h"
+#include "pycore_ceval.h"   /* _PyEval_EvalFrame() */
 #include "pycore_object.h"
 #include "pycore_pyerrors.h"
 #include "pycore_pystate.h"
@@ -303,7 +304,7 @@ function_code_fastcall(PyCodeObject *co, PyObject *const *args, Py_ssize_t nargs
         Py_INCREF(*args);
         fastlocals[i] = *args++;
     }
-    PyObject *result = PyEval_EvalFrameEx(f, 0);
+    PyObject *result = _PyEval_EvalFrame(tstate, f, 0);
 
     if (Py_REFCNT(f) > 1) {
         Py_DECREF(f);
index b72248caf9cc72b78097a6703667c02a2da0d590..98eb9c34c3dcd5c1327494ababb1c48307268b5e 100644 (file)
@@ -1,6 +1,7 @@
 /* Generator object implementation */
 
 #include "Python.h"
+#include "pycore_ceval.h"   /* _PyEval_EvalFrame() */
 #include "pycore_object.h"
 #include "pycore_pystate.h"
 #include "frameobject.h"
@@ -219,7 +220,7 @@ gen_send_ex(PyGenObject *gen, PyObject *arg, int exc, int closing)
     gen->gi_running = 1;
     gen->gi_exc_state.previous_item = tstate->exc_info;
     tstate->exc_info = &gen->gi_exc_state;
-    result = PyEval_EvalFrameEx(f, exc);
+    result = _PyEval_EvalFrame(tstate, f, exc);
     tstate->exc_info = gen->gi_exc_state.previous_item;
     gen->gi_exc_state.previous_item = NULL;
     gen->gi_running = 0;
index 4d8f1b913c5305537f355b33657cbcdba81f88bb..046cd69151b4eebeae727213f83ac720d5d82346 100644 (file)
@@ -722,18 +722,20 @@ PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals)
 /* Interpreter main loop */
 
 PyObject *
-PyEval_EvalFrame(PyFrameObject *f) {
+PyEval_EvalFrame(PyFrameObject *f)
+{
     /* This is for backward compatibility with extension modules that
        used this API; core interpreter code should call
        PyEval_EvalFrameEx() */
-    return PyEval_EvalFrameEx(f, 0);
+    PyThreadState *tstate = _PyThreadState_GET();
+    return _PyEval_EvalFrame(tstate, f, 0);
 }
 
 PyObject *
 PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
 {
-    PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
-    return interp->eval_frame(f, throwflag);
+    PyThreadState *tstate = _PyThreadState_GET();
+    return _PyEval_EvalFrame(tstate, f, throwflag);
 }
 
 PyObject* _Py_HOT_FUNCTION
@@ -4295,7 +4297,7 @@ _PyEval_EvalCodeWithName(PyObject *_co, PyObject *globals, PyObject *locals,
         return gen;
     }
 
-    retval = PyEval_EvalFrameEx(f,0);
+    retval = _PyEval_EvalFrame(tstate, f, 0);
 
 fail: /* Jump here from prelude on failure */