f" {executor} at offset {idx} rather"
f" than expected _EXIT_TRACE")
+ def test_enter_executor_valid_op_arg(self):
+ script_helper.assert_python_ok("-c", textwrap.dedent("""
+ import sys
+ sys.setrecursionlimit(30) # reduce time of the run
+
+ str_v1 = ''
+ tuple_v2 = (None, None, None, None, None)
+ small_int_v3 = 4
+
+ def f1():
+
+ for _ in range(10):
+ abs(0)
+
+ tuple_v2[small_int_v3]
+ tuple_v2[small_int_v3]
+ tuple_v2[small_int_v3]
+
+ def recursive_wrapper_4569():
+ str_v1 > str_v1
+ str_v1 > str_v1
+ str_v1 > str_v1
+ recursive_wrapper_4569()
+
+ recursive_wrapper_4569()
+
+ for i_f1 in range(19000):
+ try:
+ f1()
+ except RecursionError:
+ pass
+ """))
def global_identity(x):
--- /dev/null
+Fix invalid memory read in the ``ENTER_EXECUTOR`` instruction.
goto stop_tracing;
}
PyCodeObject *code = _PyFrame_GetCode(frame);
- _PyExecutorObject *executor = code->co_executors->executors[oparg & 255];
+ _PyExecutorObject *executor = code->co_executors->executors[this_instr->op.arg];
assert(executor->vm_data.index == INSTR_OFFSET() - 1);
assert(executor->vm_data.code == code);
assert(executor->vm_data.valid);
JUMP_TO_LABEL(stop_tracing);
}
PyCodeObject *code = _PyFrame_GetCode(frame);
- _PyExecutorObject *executor = code->co_executors->executors[oparg & 255];
+ _PyExecutorObject *executor = code->co_executors->executors[this_instr->op.arg];
assert(executor->vm_data.index == INSTR_OFFSET() - 1);
assert(executor->vm_data.code == code);
assert(executor->vm_data.valid);