summaryrefslogtreecommitdiffstats
path: root/Python/optimizer.c
diff options
context:
space:
mode:
authorBrandt Bucher <brandtbucher@microsoft.com>2023-09-13 17:26:50 (GMT)
committerGitHub <noreply@github.com>2023-09-13 17:26:50 (GMT)
commit6c13e13b13bebfdde8ad4019536499820cdfc926 (patch)
tree4b3768dc20494d11f8135a6e9633fc088d23e12a /Python/optimizer.c
parent22e65eecaad3f5337862319687047afe9861e1ef (diff)
downloadcpython-6c13e13b13bebfdde8ad4019536499820cdfc926.zip
cpython-6c13e13b13bebfdde8ad4019536499820cdfc926.tar.gz
cpython-6c13e13b13bebfdde8ad4019536499820cdfc926.tar.bz2
GH-104584: Don't call executors from JUMP_BACKWARD (GH-109347)
Diffstat (limited to 'Python/optimizer.c')
-rw-r--r--Python/optimizer.c21
1 files changed, 6 insertions, 15 deletions
diff --git a/Python/optimizer.c b/Python/optimizer.c
index 453e3e8..fbdbf72 100644
--- a/Python/optimizer.c
+++ b/Python/optimizer.c
@@ -154,7 +154,7 @@ PyUnstable_SetOptimizer(_PyOptimizerObject *optimizer)
Py_DECREF(old);
}
-_PyInterpreterFrame *
+int
_PyOptimizer_BackEdge(_PyInterpreterFrame *frame, _Py_CODEUNIT *src, _Py_CODEUNIT *dest, PyObject **stack_pointer)
{
assert(src->op.code == JUMP_BACKWARD);
@@ -162,18 +162,14 @@ _PyOptimizer_BackEdge(_PyInterpreterFrame *frame, _Py_CODEUNIT *src, _Py_CODEUNI
assert(PyCode_Check(code));
PyInterpreterState *interp = _PyInterpreterState_GET();
if (!has_space_for_executor(code, src)) {
- goto jump_to_destination;
+ return 0;
}
_PyOptimizerObject *opt = interp->optimizer;
_PyExecutorObject *executor = NULL;
int err = opt->optimize(opt, code, dest, &executor, (int)(stack_pointer - _PyFrame_Stackbase(frame)));
if (err <= 0) {
assert(executor == NULL);
- if (err < 0) {
- _PyFrame_SetStackPointer(frame, stack_pointer);
- return NULL;
- }
- goto jump_to_destination;
+ return err;
}
int index = get_index_for_executor(code, src);
if (index < 0) {
@@ -184,16 +180,11 @@ _PyOptimizer_BackEdge(_PyInterpreterFrame *frame, _Py_CODEUNIT *src, _Py_CODEUNI
* it might get confused by the executor disappearing,
* but there is not much we can do about that here. */
Py_DECREF(executor);
- goto jump_to_destination;
+ return 0;
}
insert_executor(code, src, index, executor);
- assert(frame->prev_instr == src);
- frame->prev_instr = dest - 1;
- return executor->execute(executor, frame, stack_pointer);
-jump_to_destination:
- frame->prev_instr = dest - 1;
- _PyFrame_SetStackPointer(frame, stack_pointer);
- return frame;
+ Py_DECREF(executor);
+ return 1;
}
_PyExecutorObject *