diff options
author | Victor Stinner <vstinner@python.org> | 2019-11-14 11:20:46 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-11-14 11:20:46 (GMT) |
commit | b9e681261cd5ce6db0a79461c58d7cc52cfa4902 (patch) | |
tree | f7ae0bd04938d34e7af64b9c7a02f2d0318aa558 | |
parent | 3ccdd9b180f9a3f29c8ddc8ad1b331fe8df26519 (diff) | |
download | cpython-b9e681261cd5ce6db0a79461c58d7cc52cfa4902.zip cpython-b9e681261cd5ce6db0a79461c58d7cc52cfa4902.tar.gz cpython-b9e681261cd5ce6db0a79461c58d7cc52cfa4902.tar.bz2 |
bpo-38644: Add _PyEval_EvalFrame() with tstate (GH-17131)
Add _PyEval_EvalFrame() static inline function to get eval_frame from
tstate->interp.
-rw-r--r-- | Include/internal/pycore_ceval.h | 9 | ||||
-rw-r--r-- | Objects/call.c | 3 | ||||
-rw-r--r-- | Objects/genobject.c | 3 | ||||
-rw-r--r-- | Python/ceval.c | 12 |
4 files changed, 20 insertions, 7 deletions
diff --git a/Include/internal/pycore_ceval.h b/Include/internal/pycore_ceval.h index f20e4eb..7adb872 100644 --- a/Include/internal/pycore_ceval.h +++ b/Include/internal/pycore_ceval.h @@ -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 diff --git a/Objects/call.c b/Objects/call.c index a8ae41a..96174c4 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -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); diff --git a/Objects/genobject.c b/Objects/genobject.c index b72248c..98eb9c3 100644 --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -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; diff --git a/Python/ceval.c b/Python/ceval.c index 4d8f1b9..046cd69 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -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 */ |