GH-104584: Don't call executors from `JUMP_BACKWARD` by brandtbucher · Pull Request #109347 · python/cpython
_PyInterpreterFrame * int _PyOptimizer_BackEdge(_PyInterpreterFrame *frame, _Py_CODEUNIT *src, _Py_CODEUNIT *dest, PyObject **stack_pointer) { assert(src->op.code == JUMP_BACKWARD); PyCodeObject *code = (PyCodeObject *)frame->f_executable; 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) {
_PyExecutorObject *