https://github.com/python/cpython/commit/a4be3bc34f9d3671e42ef8a301dfbbc9bdac3421 commit: a4be3bc34f9d3671e42ef8a301dfbbc9bdac3421 branch: main author: Irit Katriel <1055913+iritkatr...@users.noreply.github.com> committer: ambv <luk...@langa.pl> date: 2025-05-01T19:15:53+02:00 summary:
gh-133258: Fix crash in test_index (GH-133262) files: M Include/internal/pycore_opcode_metadata.h M Include/internal/pycore_uop_metadata.h M Python/bytecodes.c M Python/executor_cases.c.h M Python/generated_cases.c.h diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h index b4c3c21c57e3f4..852d6313394918 100644 --- a/Include/internal/pycore_opcode_metadata.h +++ b/Include/internal/pycore_opcode_metadata.h @@ -1089,7 +1089,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = { [BINARY_OP_SUBSCR_DICT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, [BINARY_OP_SUBSCR_GETITEM] = { true, INSTR_FMT_IXC0000, HAS_DEOPT_FLAG }, [BINARY_OP_SUBSCR_LIST_INT] = { true, INSTR_FMT_IXC0000, HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG }, - [BINARY_OP_SUBSCR_LIST_SLICE] = { true, INSTR_FMT_IXC0000, HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG }, + [BINARY_OP_SUBSCR_LIST_SLICE] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, [BINARY_OP_SUBSCR_STR_INT] = { true, INSTR_FMT_IXC0000, HAS_DEOPT_FLAG | HAS_EXIT_FLAG | HAS_ESCAPES_FLAG }, [BINARY_OP_SUBSCR_TUPLE_INT] = { true, INSTR_FMT_IXC0000, HAS_DEOPT_FLAG | HAS_EXIT_FLAG }, [BINARY_OP_SUBTRACT_FLOAT] = { true, INSTR_FMT_IXC0000, HAS_EXIT_FLAG | HAS_ERROR_FLAG }, diff --git a/Include/internal/pycore_uop_metadata.h b/Include/internal/pycore_uop_metadata.h index e2a9298537c251..03113cd4c963b7 100644 --- a/Include/internal/pycore_uop_metadata.h +++ b/Include/internal/pycore_uop_metadata.h @@ -99,7 +99,7 @@ const uint16_t _PyUop_Flags[MAX_UOP_ID+1] = { [_BINARY_SLICE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, [_STORE_SLICE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, [_BINARY_OP_SUBSCR_LIST_INT] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG, - [_BINARY_OP_SUBSCR_LIST_SLICE] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG, + [_BINARY_OP_SUBSCR_LIST_SLICE] = HAS_ERROR_FLAG | HAS_ESCAPES_FLAG, [_BINARY_OP_SUBSCR_STR_INT] = HAS_DEOPT_FLAG | HAS_ESCAPES_FLAG, [_GUARD_NOS_TUPLE] = HAS_EXIT_FLAG, [_GUARD_TOS_TUPLE] = HAS_EXIT_FLAG, diff --git a/Python/bytecodes.c b/Python/bytecodes.c index bcc128cbd039a3..b6fde3f1029421 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -916,11 +916,10 @@ dummy_func( assert(PyList_CheckExact(list)); PyObject *res_o = _PyList_SliceSubscript(list, sub); - DEOPT_IF(res_o == NULL); - STAT_INC(BINARY_OP, hit); - res = PyStackRef_FromPyObjectSteal(res_o); STAT_INC(BINARY_OP, hit); DECREF_INPUTS(); + ERROR_IF(res_o == NULL); + res = PyStackRef_FromPyObjectSteal(res_o); } macro(BINARY_OP_SUBSCR_STR_INT) = diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 82c37bc0e1094e..040be54f9b87ff 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -1348,24 +1348,25 @@ _PyFrame_SetStackPointer(frame, stack_pointer); PyObject *res_o = _PyList_SliceSubscript(list, sub); stack_pointer = _PyFrame_GetStackPointer(frame); - if (res_o == NULL) { - UOP_STAT_INC(uopcode, miss); - JUMP_TO_JUMP_TARGET(); - } - STAT_INC(BINARY_OP, hit); - res = PyStackRef_FromPyObjectSteal(res_o); STAT_INC(BINARY_OP, hit); _PyFrame_SetStackPointer(frame, stack_pointer); - _PyStackRef tmp = list_st; - list_st = res; - stack_pointer[-2] = list_st; - PyStackRef_CLOSE(tmp); - tmp = sub_st; + _PyStackRef tmp = sub_st; sub_st = PyStackRef_NULL; stack_pointer[-1] = sub_st; PyStackRef_CLOSE(tmp); + tmp = list_st; + list_st = PyStackRef_NULL; + stack_pointer[-2] = list_st; + PyStackRef_CLOSE(tmp); stack_pointer = _PyFrame_GetStackPointer(frame); - stack_pointer += -1; + stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); + if (res_o == NULL) { + JUMP_TO_ERROR(); + } + res = PyStackRef_FromPyObjectSteal(res_o); + stack_pointer[0] = res; + stack_pointer += 1; assert(WITHIN_STACK_BOUNDS()); break; } diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index a432603dc41e21..004f4db593dc10 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -811,27 +811,27 @@ _PyFrame_SetStackPointer(frame, stack_pointer); PyObject *res_o = _PyList_SliceSubscript(list, sub); stack_pointer = _PyFrame_GetStackPointer(frame); - if (res_o == NULL) { - UPDATE_MISS_STATS(BINARY_OP); - assert(_PyOpcode_Deopt[opcode] == (BINARY_OP)); - JUMP_TO_PREDICTED(BINARY_OP); - } - STAT_INC(BINARY_OP, hit); - res = PyStackRef_FromPyObjectSteal(res_o); STAT_INC(BINARY_OP, hit); _PyFrame_SetStackPointer(frame, stack_pointer); - _PyStackRef tmp = list_st; - list_st = res; - stack_pointer[-2] = list_st; - PyStackRef_CLOSE(tmp); - tmp = sub_st; + _PyStackRef tmp = sub_st; sub_st = PyStackRef_NULL; stack_pointer[-1] = sub_st; PyStackRef_CLOSE(tmp); + tmp = list_st; + list_st = PyStackRef_NULL; + stack_pointer[-2] = list_st; + PyStackRef_CLOSE(tmp); stack_pointer = _PyFrame_GetStackPointer(frame); - stack_pointer += -1; + stack_pointer += -2; assert(WITHIN_STACK_BOUNDS()); + if (res_o == NULL) { + JUMP_TO_LABEL(error); + } + res = PyStackRef_FromPyObjectSteal(res_o); } + stack_pointer[0] = res; + stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } _______________________________________________ Python-checkins mailing list -- python-checkins@python.org To unsubscribe send an email to python-checkins-le...@python.org https://mail.python.org/mailman3/lists/python-checkins.python.org/ Member address: arch...@mail-archive.com