https://github.com/python/cpython/commit/a4be3bc34f9d3671e42ef8a301dfbbc9bdac3421
commit: a4be3bc34f9d3671e42ef8a301dfbbc9bdac3421
branch: main
author: Irit Katriel <[email protected]>
committer: ambv <[email protected]>
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 -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]