diff options
author | Mark Shannon <mark@hotpy.org> | 2021-08-12 11:47:38 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-12 11:47:38 +0100 |
commit | a530a9538f3f444bebd2d2b71fe5f2e747e76d73 (patch) | |
tree | 00af91aa7c5b3c6ef5ed0b9649fbe0027ee4d8ad /Python/ceval.c | |
parent | f08e6d1bb3c5655f184af88c6793e90908bb6338 (diff) | |
download | cpython-a530a9538f3f444bebd2d2b71fe5f2e747e76d73.tar.gz cpython-a530a9538f3f444bebd2d2b71fe5f2e747e76d73.zip |
bpo-44878: Remove loop from interpreter. All dispatching is done by gotos. (GH-27727)
Diffstat (limited to 'Python/ceval.c')
-rw-r--r-- | Python/ceval.c | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/Python/ceval.c b/Python/ceval.c index e8c4e4c8c07..f494e8477fa 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1280,7 +1280,7 @@ eval_frame_handle_pending(PyThreadState *tstate) #define CHECK_EVAL_BREAKER() \ if (_Py_atomic_load_relaxed(eval_breaker)) { \ - continue; \ + goto check_eval_breaker; \ } @@ -1584,7 +1584,8 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr assert(!_PyErr_Occurred(tstate)); #endif - for (;;) { +check_eval_breaker: + { assert(STACK_LEVEL() >= 0); /* else underflow */ assert(STACK_LEVEL() <= co->co_stacksize); /* else overflow */ assert(!_PyErr_Occurred(tstate)); @@ -4292,6 +4293,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr CHECK_EVAL_BREAKER(); DISPATCH(); } + TARGET(CALL_METHOD_KW): { /* Designed to work in tandem with LOAD_METHOD. Same as CALL_METHOD but pops TOS to get a tuple of keyword names. */ @@ -4315,6 +4317,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, InterpreterFrame *frame, int thr CHECK_EVAL_BREAKER(); DISPATCH(); } + TARGET(CALL_FUNCTION): { PREDICTED(CALL_FUNCTION); PyObject **sp, *res; @@ -4621,7 +4624,17 @@ exception_unwind: int level, handler, lasti; if (get_exception_handler(co, offset, &level, &handler, &lasti) == 0) { // No handlers, so exit. - break; + assert(retval == NULL); + assert(_PyErr_Occurred(tstate)); + + /* Pop remaining stack entries. */ + while (!EMPTY()) { + PyObject *o = POP(); + Py_XDECREF(o); + } + frame->stackdepth = 0; + frame->f_state = FRAME_RAISED; + goto exiting; } assert(STACK_LEVEL() >= level); @@ -4661,18 +4674,8 @@ exception_unwind: NEXTOPARG(); PRE_DISPATCH_GOTO(); DISPATCH_GOTO(); - } /* main loop */ - - assert(retval == NULL); - assert(_PyErr_Occurred(tstate)); - - /* Pop remaining stack entries. */ - while (!EMPTY()) { - PyObject *o = POP(); - Py_XDECREF(o); } - frame->stackdepth = 0; - frame->f_state = FRAME_RAISED; + exiting: if (cframe.use_tracing) { if (tstate->c_tracefunc) { |