diff options
author | Mark Shannon <mark@hotpy.org> | 2023-12-12 19:02:24 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-12 19:02:24 +0000 |
commit | 956023826a393b5704d3414dcd01f1bcbeaeda15 (patch) | |
tree | 733a71e8bdcbb8630c89375bf6bc1d5e51b5b5c4 /Python/optimizer.c | |
parent | 9898e6104171dcdd88b32776e69ca2cddf515e63 (diff) | |
download | cpython-956023826a393b5704d3414dcd01f1bcbeaeda15.tar.gz cpython-956023826a393b5704d3414dcd01f1bcbeaeda15.zip |
GH-108866: Guarantee forward progress in executors. (GH-113006)
Diffstat (limited to 'Python/optimizer.c')
-rw-r--r-- | Python/optimizer.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/Python/optimizer.c b/Python/optimizer.c index dd24fbebbfd..7c46bd69157 100644 --- a/Python/optimizer.c +++ b/Python/optimizer.c @@ -167,6 +167,7 @@ _PyOptimizer_BackEdge(_PyInterpreterFrame *frame, _Py_CODEUNIT *src, _Py_CODEUNI } _PyOptimizerObject *opt = interp->optimizer; _PyExecutorObject *executor = NULL; + /* Start optimizing at the destination to guarantee forward progress */ int err = opt->optimize(opt, code, dest, &executor, (int)(stack_pointer - _PyFrame_Stackbase(frame))); if (err <= 0) { assert(executor == NULL); @@ -247,14 +248,13 @@ PyTypeObject _PyCounterExecutor_Type = { .tp_methods = executor_methods, }; -static _PyInterpreterFrame * +static _Py_CODEUNIT * counter_execute(_PyExecutorObject *self, _PyInterpreterFrame *frame, PyObject **stack_pointer) { ((_PyCounterExecutorObject *)self)->optimizer->count++; _PyFrame_SetStackPointer(frame, stack_pointer); - frame->instr_ptr = ((_PyCounterExecutorObject *)self)->next_instr; Py_DECREF(self); - return frame; + return ((_PyCounterExecutorObject *)self)->next_instr; } static int @@ -891,7 +891,7 @@ uop_optimize( /* Dummy execute() function for UOp Executor. * The actual implementation is inlined in ceval.c, * in _PyEval_EvalFrameDefault(). */ -_PyInterpreterFrame * +_Py_CODEUNIT * _PyUOpExecute(_PyExecutorObject *executor, _PyInterpreterFrame *frame, PyObject **stack_pointer) { Py_FatalError("Tier 2 is now inlined into Tier 1"); |