aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Python/ceval.c
diff options
context:
space:
mode:
authorMark Shannon <mark@hotpy.org>2021-08-12 11:47:38 +0100
committerGitHub <noreply@github.com>2021-08-12 11:47:38 +0100
commita530a9538f3f444bebd2d2b71fe5f2e747e76d73 (patch)
tree00af91aa7c5b3c6ef5ed0b9649fbe0027ee4d8ad /Python/ceval.c
parentf08e6d1bb3c5655f184af88c6793e90908bb6338 (diff)
downloadcpython-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.c31
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) {