diff --git a/Lib/test/test_generated_cases.py b/Lib/test/test_generated_cases.py index 41eeb9c0705741..71a5711441807d 100644 --- a/Lib/test/test_generated_cases.py +++ b/Lib/test/test_generated_cases.py @@ -151,6 +151,7 @@ def test_inst_one_pop(self): value = stack_pointer[-1]; spam(); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } """ @@ -171,6 +172,7 @@ def test_inst_one_push(self): spam(); stack_pointer[0] = res; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } """ @@ -216,6 +218,7 @@ def test_binary_op(self): spam(); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } """ @@ -337,6 +340,7 @@ def test_error_if_pop(self): if (cond) goto pop_2_label; stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } """ @@ -360,6 +364,7 @@ def test_cache_effect(self): uint32_t extra = read_u32(&this_instr[2].cache); (void)extra; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } """ @@ -425,6 +430,7 @@ def test_macro_instruction(self): } stack_pointer[-3] = res; stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -459,6 +465,7 @@ def test_macro_instruction(self): res = op3(arg2, left, right); stack_pointer[-3] = res; stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } """ @@ -540,6 +547,7 @@ def test_array_input(self): below = stack_pointer[-2 - oparg*2]; spam(); stack_pointer += -2 - oparg*2; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } """ @@ -564,6 +572,7 @@ def test_array_output(self): stack_pointer[-2] = below; stack_pointer[-1 + oparg*3] = above; stack_pointer += oparg*3; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } """ @@ -586,6 +595,7 @@ def test_array_input_output(self): spam(values, oparg); stack_pointer[0] = above; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } """ @@ -608,6 +618,7 @@ def test_array_error_if(self): extra = stack_pointer[-1 - oparg]; if (oparg == 0) { stack_pointer += -1 - oparg; goto somewhere; } stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } """ @@ -638,6 +649,7 @@ def test_cond_effect(self): if (oparg & 2) stack_pointer[-1 - (((oparg & 1) == 1) ? 1 : 0)] = output; stack_pointer[-1 - (((oparg & 1) == 1) ? 1 : 0) + ((oparg & 2) ? 1 : 0)] = zz; stack_pointer += -(((oparg & 1) == 1) ? 1 : 0) + ((oparg & 2) ? 1 : 0); + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } """ @@ -679,6 +691,7 @@ def test_macro_cond_effect(self): if (oparg) stack_pointer[-2] = extra; stack_pointer[-2 + ((oparg) ? 1 : 0)] = res; stack_pointer += -1 + ((oparg) ? 1 : 0); + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } """ @@ -712,6 +725,7 @@ def test_macro_push_push(self): stack_pointer[0] = val1; stack_pointer[1] = val2; stack_pointer += 2; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } """ diff --git a/Python/ceval_macros.h b/Python/ceval_macros.h index 50941e4ec473e8..e9247845b60bc0 100644 --- a/Python/ceval_macros.h +++ b/Python/ceval_macros.h @@ -246,6 +246,8 @@ GETITEM(PyObject *v, Py_ssize_t i) { #define STACK_SHRINK(n) BASIC_STACKADJ(-(n)) #endif +#define WITHIN_STACK_BOUNDS() \ + (frame == &entry_frame || (STACK_LEVEL() >= 0 && STACK_LEVEL() <= STACK_SIZE())) /* Data access macros */ #define FRAME_CO_CONSTS (_PyFrame_GetCode(frame)->co_consts) diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 8de0309fa4dae0..6bee9b03fc3c1f 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -46,6 +46,7 @@ Py_INCREF(value); stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -58,6 +59,7 @@ Py_INCREF(value); stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -70,6 +72,7 @@ Py_INCREF(value); stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -82,6 +85,7 @@ Py_INCREF(value); stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -94,6 +98,7 @@ Py_INCREF(value); stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -106,6 +111,7 @@ Py_INCREF(value); stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -118,6 +124,7 @@ Py_INCREF(value); stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -130,6 +137,7 @@ Py_INCREF(value); stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -142,6 +150,7 @@ Py_INCREF(value); stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -153,6 +162,7 @@ Py_INCREF(value); stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -164,6 +174,7 @@ GETLOCAL(oparg) = NULL; stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -174,6 +185,7 @@ Py_INCREF(value); stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -184,6 +196,7 @@ value = stack_pointer[-1]; SETLOCAL(oparg, value); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -194,6 +207,7 @@ value = stack_pointer[-1]; SETLOCAL(oparg, value); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -204,6 +218,7 @@ value = stack_pointer[-1]; SETLOCAL(oparg, value); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -214,6 +229,7 @@ value = stack_pointer[-1]; SETLOCAL(oparg, value); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -224,6 +240,7 @@ value = stack_pointer[-1]; SETLOCAL(oparg, value); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -234,6 +251,7 @@ value = stack_pointer[-1]; SETLOCAL(oparg, value); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -244,6 +262,7 @@ value = stack_pointer[-1]; SETLOCAL(oparg, value); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -254,6 +273,7 @@ value = stack_pointer[-1]; SETLOCAL(oparg, value); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -263,6 +283,7 @@ value = stack_pointer[-1]; SETLOCAL(oparg, value); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -271,6 +292,7 @@ value = stack_pointer[-1]; Py_DECREF(value); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -279,6 +301,7 @@ res = NULL; stack_pointer[0] = res; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -290,6 +313,7 @@ Py_DECREF(receiver); stack_pointer[-2] = value; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -480,6 +504,7 @@ if (res == NULL) JUMP_TO_ERROR(); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -496,6 +521,7 @@ if (res == NULL) JUMP_TO_ERROR(); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -512,6 +538,7 @@ if (res == NULL) JUMP_TO_ERROR(); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -564,6 +591,7 @@ DECREF_INPUTS_AND_REUSE_FLOAT(left, right, dres, res); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -580,6 +608,7 @@ DECREF_INPUTS_AND_REUSE_FLOAT(left, right, dres, res); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -596,6 +625,7 @@ DECREF_INPUTS_AND_REUSE_FLOAT(left, right, dres, res); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -628,6 +658,7 @@ if (res == NULL) JUMP_TO_ERROR(); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -643,6 +674,7 @@ if (res == NULL) JUMP_TO_ERROR(); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -668,6 +700,7 @@ if (res == NULL) JUMP_TO_ERROR(); stack_pointer[-3] = res; stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -693,6 +726,7 @@ Py_DECREF(container); if (err) JUMP_TO_ERROR(); stack_pointer += -4; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -728,6 +762,7 @@ Py_DECREF(list); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -766,6 +801,7 @@ Py_DECREF(str); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -801,6 +837,7 @@ Py_DECREF(tuple); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -825,6 +862,7 @@ // not found or error stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -838,6 +876,7 @@ list = stack_pointer[-2 - (oparg-1)]; if (_PyList_AppendTakeRef((PyListObject *)list, v) < 0) JUMP_TO_ERROR(); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -851,6 +890,7 @@ Py_DECREF(v); if (err) JUMP_TO_ERROR(); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -868,6 +908,7 @@ Py_DECREF(sub); if (err) JUMP_TO_ERROR(); stack_pointer += -3; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -905,6 +946,7 @@ _Py_DECREF_SPECIALIZED(sub, (destructor)PyObject_Free); Py_DECREF(list); stack_pointer += -3; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -924,6 +966,7 @@ Py_DECREF(dict); if (err) JUMP_TO_ERROR(); stack_pointer += -3; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -938,6 +981,7 @@ Py_DECREF(sub); if (err) JUMP_TO_ERROR(); stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -968,6 +1012,7 @@ if (res == NULL) JUMP_TO_ERROR(); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -979,6 +1024,7 @@ assert(frame != &entry_frame); #endif stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); _PyFrame_SetStackPointer(frame, stack_pointer); assert(EMPTY()); _Py_LeaveRecursiveCallPy(tstate); @@ -992,6 +1038,7 @@ LLTRACE_RESUME_FRAME(); stack_pointer[0] = res; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1076,6 +1123,7 @@ } stack_pointer[0] = awaitable; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1130,6 +1178,7 @@ assert(oparg == 0 || oparg == 1); gen->gi_frame_state = FRAME_SUSPENDED + oparg; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); _PyFrame_SetStackPointer(frame, stack_pointer); tstate->exc_info = gen->gi_exc_state.previous_item; gen->gi_exc_state.previous_item = NULL; @@ -1153,6 +1202,7 @@ LLTRACE_RESUME_FRAME(); stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1162,6 +1212,7 @@ _PyErr_StackItem *exc_info = tstate->exc_info; Py_XSETREF(exc_info->exc_value, exc_value == Py_None ? NULL : exc_value); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1181,6 +1232,7 @@ } stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1194,6 +1246,7 @@ } stack_pointer[0] = bc; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1217,6 +1270,7 @@ Py_DECREF(v); if (err) JUMP_TO_ERROR(); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1250,6 +1304,7 @@ Py_DECREF(seq); if (res == 0) JUMP_TO_ERROR(); stack_pointer += -1 + oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1275,6 +1330,7 @@ stack_pointer[-1] = val1; stack_pointer[0] = val0; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1299,6 +1355,7 @@ } Py_DECREF(seq); stack_pointer += -1 + oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1323,6 +1380,7 @@ } Py_DECREF(seq); stack_pointer += -1 + oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1336,6 +1394,7 @@ Py_DECREF(seq); if (res == 0) JUMP_TO_ERROR(); stack_pointer += (oparg >> 8) + (oparg & 0xFF); + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1351,6 +1410,7 @@ Py_DECREF(owner); if (err) JUMP_TO_ERROR(); stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1363,6 +1423,7 @@ Py_DECREF(owner); if (err) JUMP_TO_ERROR(); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1375,6 +1436,7 @@ Py_DECREF(v); if (err) JUMP_TO_ERROR(); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1405,6 +1467,7 @@ Py_INCREF(locals); stack_pointer[0] = locals; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1452,6 +1515,7 @@ stack_pointer[0] = res; if (oparg & 1) stack_pointer[1] = null; stack_pointer += 1 + (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1503,6 +1567,7 @@ stack_pointer[0] = res; if (oparg & 1) stack_pointer[1] = null; stack_pointer += 1 + (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1524,6 +1589,7 @@ stack_pointer[0] = res; if (oparg & 1) stack_pointer[1] = null; stack_pointer += 1 + (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1604,6 +1670,7 @@ } stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1614,6 +1681,7 @@ PyCellObject *cell = (PyCellObject *)GETLOCAL(oparg); PyCell_SetTakeRef(cell, v); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1644,6 +1712,7 @@ if (str == NULL) JUMP_TO_ERROR(); stack_pointer[-oparg] = str; stack_pointer += 1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1656,6 +1725,7 @@ if (tup == NULL) JUMP_TO_ERROR(); stack_pointer[-oparg] = tup; stack_pointer += 1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1668,6 +1738,7 @@ if (list == NULL) JUMP_TO_ERROR(); stack_pointer[-oparg] = list; stack_pointer += 1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1693,6 +1764,7 @@ assert(Py_IsNone(none_val)); Py_DECREF(iterable); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1706,6 +1778,7 @@ Py_DECREF(iterable); if (err < 0) JUMP_TO_ERROR(); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1726,6 +1799,7 @@ if (map == NULL) JUMP_TO_ERROR(); stack_pointer[-oparg*2] = map; stack_pointer += 1 - oparg*2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1772,6 +1846,7 @@ if (map == NULL) JUMP_TO_ERROR(); stack_pointer[-1 - oparg] = map; stack_pointer += -oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1792,6 +1867,7 @@ } Py_DECREF(update); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1810,6 +1886,7 @@ } Py_DECREF(update); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1826,6 +1903,7 @@ // Do not DECREF INPUTS because the function steals the references if (_PyDict_SetItem_Take2((PyDictObject *)dict, key, value) != 0) JUMP_TO_ERROR(); stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1858,6 +1936,7 @@ if (attr == NULL) JUMP_TO_ERROR(); stack_pointer[-3] = attr; stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1901,6 +1980,7 @@ stack_pointer[-3] = attr; stack_pointer[-2] = self_or_null; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1943,6 +2023,7 @@ stack_pointer[-1] = attr; if (oparg & 1) stack_pointer[0] = self_or_null; stack_pointer += (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2010,6 +2091,7 @@ stack_pointer[-1] = attr; stack_pointer[0] = null; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2055,6 +2137,7 @@ stack_pointer[-1] = attr; if (oparg & 1) stack_pointer[0] = null; stack_pointer += (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2111,6 +2194,7 @@ stack_pointer[-1] = attr; if (oparg & 1) stack_pointer[0] = null; stack_pointer += (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2155,6 +2239,7 @@ stack_pointer[-1] = attr; stack_pointer[0] = null; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2207,6 +2292,7 @@ stack_pointer[-1] = attr; stack_pointer[0] = null; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2251,6 +2337,7 @@ } Py_DECREF(owner); stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2313,6 +2400,7 @@ dict->ma_version_tag = new_version; Py_DECREF(owner); stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2329,6 +2417,7 @@ Py_XDECREF(old_value); Py_DECREF(owner); stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2352,6 +2441,7 @@ } stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2373,6 +2463,7 @@ // It's always a bool, so we don't care about oparg & 16. stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2404,6 +2495,7 @@ // It's always a bool, so we don't care about oparg & 16. stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2426,6 +2518,7 @@ // It's always a bool, so we don't care about oparg & 16. stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2442,6 +2535,7 @@ b = res ? Py_True : Py_False; stack_pointer[-2] = b; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2459,6 +2553,7 @@ b = (res ^ oparg) ? Py_True : Py_False; stack_pointer[-2] = b; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2482,6 +2577,7 @@ b = (res ^ oparg) ? Py_True : Py_False; stack_pointer[-2] = b; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2504,6 +2600,7 @@ b = (res ^ oparg) ? Py_True : Py_False; stack_pointer[-2] = b; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2584,6 +2681,7 @@ if (len_o == NULL) JUMP_TO_ERROR(); stack_pointer[0] = len_o; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2613,6 +2711,7 @@ } stack_pointer[-3] = attrs; stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2624,6 +2723,7 @@ res = match ? Py_True : Py_False; stack_pointer[0] = res; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2635,6 +2735,7 @@ res = match ? Py_True : Py_False; stack_pointer[0] = res; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2649,6 +2750,7 @@ if (values_or_none == NULL) JUMP_TO_ERROR(); stack_pointer[0] = values_or_none; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2721,6 +2823,7 @@ // Common case: no jump, leave it to the code generator stack_pointer[0] = next; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2767,6 +2870,7 @@ next = Py_NewRef(PyList_GET_ITEM(seq, it->it_index++)); stack_pointer[0] = next; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2811,6 +2915,7 @@ next = Py_NewRef(PyTuple_GET_ITEM(seq, it->it_index++)); stack_pointer[0] = next; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2853,6 +2958,7 @@ if (next == NULL) JUMP_TO_ERROR(); stack_pointer[0] = next; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2880,6 +2986,7 @@ frame->return_offset = (uint16_t)(1 + INLINE_CACHE_ENTRIES_FOR_ITER + oparg); stack_pointer[0] = (PyObject *)gen_frame; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2903,6 +3010,7 @@ stack_pointer[-1] = attr; stack_pointer[0] = self_or_null; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2944,6 +3052,7 @@ if (res == NULL) JUMP_TO_ERROR(); stack_pointer[0] = res; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2963,6 +3072,7 @@ stack_pointer[-1] = prev_exc; stack_pointer[0] = new_exc; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -3007,6 +3117,7 @@ stack_pointer[-1] = attr; stack_pointer[0] = self; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -3027,6 +3138,7 @@ stack_pointer[-1] = attr; stack_pointer[0] = self; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -3091,6 +3203,7 @@ stack_pointer[-1] = attr; stack_pointer[0] = self; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -3128,11 +3241,13 @@ // The frame has stolen all the arguments from the stack, // so there is no need to clean them up. stack_pointer += -2 - oparg; + assert(WITHIN_STACK_BOUNDS()); if (new_frame == NULL) { JUMP_TO_ERROR(); } stack_pointer[0] = (PyObject *)new_frame; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -3247,6 +3362,7 @@ if (res == NULL) JUMP_TO_ERROR(); stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -3346,6 +3462,7 @@ } stack_pointer[-2 - oparg] = (PyObject *)new_frame; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -3370,6 +3487,7 @@ } stack_pointer[-2 - oparg] = (PyObject *)new_frame; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -3394,6 +3512,7 @@ } stack_pointer[-2 - oparg] = (PyObject *)new_frame; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -3418,6 +3537,7 @@ } stack_pointer[-2 - oparg] = (PyObject *)new_frame; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -3442,6 +3562,7 @@ } stack_pointer[-2 - oparg] = (PyObject *)new_frame; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -3465,6 +3586,7 @@ } stack_pointer[-2 - oparg] = (PyObject *)new_frame; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -3475,6 +3597,7 @@ // Eventually this should be the only occurrence of this code. assert(tstate->interp->eval_frame == NULL); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); _PyFrame_SetStackPointer(frame, stack_pointer); new_frame->previous = frame; CALL_STAT_INC(inlined_py_calls); @@ -3509,6 +3632,7 @@ Py_DECREF(arg); stack_pointer[-3] = res; stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -3536,6 +3660,7 @@ if (res == NULL) JUMP_TO_ERROR(); stack_pointer[-3] = res; stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -3563,6 +3688,7 @@ if (res == NULL) JUMP_TO_ERROR(); stack_pointer[-3] = res; stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -3579,6 +3705,7 @@ JUMP_TO_ERROR(); } stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -3615,6 +3742,7 @@ if (res == NULL) JUMP_TO_ERROR(); stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -3662,6 +3790,7 @@ if (res == NULL) JUMP_TO_ERROR(); stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -3704,6 +3833,7 @@ if (res == NULL) JUMP_TO_ERROR(); stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -3745,6 +3875,7 @@ if (res == NULL) JUMP_TO_ERROR(); stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -3787,6 +3918,7 @@ Py_DECREF(arg); stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -3831,6 +3963,7 @@ Py_DECREF(callable); stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -3885,6 +4018,7 @@ if (res == NULL) JUMP_TO_ERROR(); stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -3932,6 +4066,7 @@ if (res == NULL) JUMP_TO_ERROR(); stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -3985,6 +4120,7 @@ if (res == NULL) JUMP_TO_ERROR(); stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -4032,6 +4168,7 @@ if (res == NULL) JUMP_TO_ERROR(); stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -4097,6 +4234,7 @@ } stack_pointer[-2] = func; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -4126,6 +4264,7 @@ LLTRACE_RESUME_FRAME(); stack_pointer[0] = res; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -4145,6 +4284,7 @@ if (slice == NULL) JUMP_TO_ERROR(); stack_pointer[-2 - ((oparg == 3) ? 1 : 0)] = slice; stack_pointer += -1 - ((oparg == 3) ? 1 : 0); + assert(WITHIN_STACK_BOUNDS()); break; } @@ -4193,6 +4333,7 @@ if (res == NULL) JUMP_TO_ERROR(); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -4205,6 +4346,7 @@ top = Py_NewRef(bottom); stack_pointer[0] = top; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -4222,6 +4364,7 @@ if (res == NULL) JUMP_TO_ERROR(); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -4255,6 +4398,7 @@ PyObject *flag; flag = stack_pointer[-1]; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); if (!Py_IsTrue(flag)) { UOP_STAT_INC(uopcode, miss); JUMP_TO_JUMP_TARGET(); @@ -4267,6 +4411,7 @@ PyObject *flag; flag = stack_pointer[-1]; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); if (!Py_IsFalse(flag)) { UOP_STAT_INC(uopcode, miss); JUMP_TO_JUMP_TARGET(); @@ -4279,6 +4424,7 @@ PyObject *val; val = stack_pointer[-1]; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); if (!Py_IsNone(val)) { Py_DECREF(val); if (1) { @@ -4293,6 +4439,7 @@ PyObject *val; val = stack_pointer[-1]; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); if (Py_IsNone(val)) { UOP_STAT_INC(uopcode, miss); JUMP_TO_JUMP_TARGET(); @@ -4356,6 +4503,7 @@ value = Py_NewRef(ptr); stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -4365,6 +4513,7 @@ value = ptr; stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -4388,6 +4537,7 @@ stack_pointer[0] = value; stack_pointer[1] = null; stack_pointer += 2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -4400,6 +4550,7 @@ stack_pointer[0] = value; stack_pointer[1] = null; stack_pointer += 2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -4419,6 +4570,7 @@ _PyCounterOptimizerObject *exe = (_PyCounterOptimizerObject *)opt; exe->count++; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -4532,6 +4684,7 @@ uint32_t target = (uint32_t)CURRENT_OPERAND(); frame->instr_ptr = ((_Py_CODEUNIT *)_PyFrame_GetCode(frame)->co_code_adaptive) + target; stack_pointer += -oparg; + assert(WITHIN_STACK_BOUNDS()); GOTO_UNWIND(); break; } diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 327a704467b0ba..2d23b43fe0daed 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -47,6 +47,7 @@ } stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -76,6 +77,7 @@ } stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -105,6 +107,7 @@ } stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -134,6 +137,7 @@ } stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -179,6 +183,7 @@ SKIP_OVER(1); } stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -208,6 +213,7 @@ } stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -237,6 +243,7 @@ } stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -266,6 +273,7 @@ } stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -295,6 +303,7 @@ } stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -323,6 +332,7 @@ if (res == NULL) goto pop_3_error; stack_pointer[-3] = res; stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -361,6 +371,7 @@ } stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -387,6 +398,7 @@ // not found or error stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -448,6 +460,7 @@ Py_DECREF(list); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -476,6 +489,7 @@ Py_DECREF(str); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -504,6 +518,7 @@ Py_DECREF(tuple); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -528,6 +543,7 @@ if (map == NULL) { stack_pointer += -1 - oparg; goto error; } stack_pointer[-1 - oparg] = map; stack_pointer += -oparg; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -542,6 +558,7 @@ if (list == NULL) { stack_pointer += -oparg; goto error; } stack_pointer[-oparg] = list; stack_pointer += 1 - oparg; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -562,6 +579,7 @@ if (map == NULL) { stack_pointer += -oparg*2; goto error; } stack_pointer[-oparg*2] = map; stack_pointer += 1 - oparg*2; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -588,6 +606,7 @@ } stack_pointer[-oparg] = set; stack_pointer += 1 - oparg; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -609,6 +628,7 @@ if (slice == NULL) { stack_pointer += -2 - ((oparg == 3) ? 1 : 0); goto error; } stack_pointer[-2 - ((oparg == 3) ? 1 : 0)] = slice; stack_pointer += -1 - ((oparg == 3) ? 1 : 0); + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -626,6 +646,7 @@ if (str == NULL) { stack_pointer += -oparg; goto error; } stack_pointer[-oparg] = str; stack_pointer += 1 - oparg; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -640,6 +661,7 @@ if (tup == NULL) { stack_pointer += -oparg; goto error; } stack_pointer[-oparg] = tup; stack_pointer += 1 - oparg; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -754,6 +776,7 @@ } stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -906,6 +929,7 @@ // Eventually this should be the only occurrence of this code. assert(tstate->interp->eval_frame == NULL); stack_pointer += -2 - oparg; + assert(WITHIN_STACK_BOUNDS()); _PyFrame_SetStackPointer(frame, stack_pointer); new_frame->previous = frame; CALL_STAT_INC(inlined_py_calls); @@ -979,6 +1003,7 @@ // The frame has stolen all the arguments from the stack, // so there is no need to clean them up. stack_pointer += -2 - oparg; + assert(WITHIN_STACK_BOUNDS()); if (new_frame == NULL) { goto error; } @@ -1047,6 +1072,7 @@ } stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -1095,6 +1121,7 @@ } stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -1142,6 +1169,7 @@ } stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -1189,6 +1217,7 @@ } stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -1275,6 +1304,7 @@ if (result == NULL) { stack_pointer += -3 - (oparg & 1); goto error; } stack_pointer[-3 - (oparg & 1)] = result; stack_pointer += -2 - (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -1310,6 +1340,7 @@ if (res == NULL) goto pop_2_error; stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -1353,6 +1384,7 @@ Py_DECREF(callable); stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -1443,6 +1475,7 @@ if (res == NULL) { stack_pointer += -3 - oparg; goto error; } stack_pointer[-3 - oparg] = res; stack_pointer += -2 - oparg; + assert(WITHIN_STACK_BOUNDS()); CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -1485,6 +1518,7 @@ Py_DECREF(arg); stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -1565,6 +1599,7 @@ } stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -1615,6 +1650,7 @@ } stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -1665,6 +1701,7 @@ } stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -1716,6 +1753,7 @@ } stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -1766,6 +1804,7 @@ } stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -1836,6 +1875,7 @@ // Eventually this should be the only occurrence of this code. assert(tstate->interp->eval_frame == NULL); stack_pointer += -2 - oparg; + assert(WITHIN_STACK_BOUNDS()); _PyFrame_SetStackPointer(frame, stack_pointer); new_frame->previous = frame; CALL_STAT_INC(inlined_py_calls); @@ -1890,6 +1930,7 @@ // The frame has stolen all the arguments from the stack, // so there is no need to clean them up. stack_pointer += -2 - oparg; + assert(WITHIN_STACK_BOUNDS()); if (new_frame == NULL) { goto error; } @@ -1949,6 +1990,7 @@ } stack_pointer[-3] = res; stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -1982,6 +2024,7 @@ } stack_pointer[-3] = res; stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); CHECK_EVAL_BREAKER(); DISPATCH(); } @@ -2008,6 +2051,7 @@ Py_DECREF(arg); stack_pointer[-3] = res; stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -2094,6 +2138,7 @@ stack_pointer[-3] = none; stack_pointer[-2] = value; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -2139,6 +2184,7 @@ } stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -2172,6 +2218,7 @@ } stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -2209,6 +2256,7 @@ } stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -2243,6 +2291,7 @@ } stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -2282,6 +2331,7 @@ } stack_pointer[-2] = b; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -2305,6 +2355,7 @@ b = (res ^ oparg) ? Py_True : Py_False; stack_pointer[-2] = b; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -2329,6 +2380,7 @@ b = (res ^ oparg) ? Py_True : Py_False; stack_pointer[-2] = b; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -2360,6 +2412,7 @@ top = Py_NewRef(bottom); stack_pointer[0] = top; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -2391,6 +2444,7 @@ Py_DECREF(owner); if (err) goto pop_1_error; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -2481,6 +2535,7 @@ Py_DECREF(sub); if (err) goto pop_2_error; stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -2501,6 +2556,7 @@ } Py_DECREF(update); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -2523,6 +2579,7 @@ } Py_DECREF(update); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -2547,6 +2604,7 @@ goto exception_unwind; } stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -2558,6 +2616,7 @@ value = stack_pointer[-1]; Py_DECREF(value); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -2572,6 +2631,7 @@ Py_DECREF(receiver); stack_pointer[-2] = value; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -2622,6 +2682,7 @@ goto error; } stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -2672,6 +2733,7 @@ if (res == NULL) goto pop_2_error; stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -2724,6 +2786,7 @@ } stack_pointer[0] = next; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -2818,6 +2881,7 @@ } stack_pointer[0] = next; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -2861,6 +2925,7 @@ } stack_pointer[0] = next; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -2906,6 +2971,7 @@ } stack_pointer[0] = next; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -2992,6 +3058,7 @@ } stack_pointer[0] = awaitable; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -3054,6 +3121,7 @@ if (len_o == NULL) goto error; stack_pointer[0] = len_o; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -3104,6 +3172,7 @@ if (res == NULL) goto error; stack_pointer[0] = res; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -3123,6 +3192,7 @@ if (res == NULL) goto pop_2_error; stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -3187,6 +3257,7 @@ } Py_DECREF(value); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -3207,6 +3278,7 @@ Py_DECREF(receiver); stack_pointer[-2] = value; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -3513,6 +3585,7 @@ b = res ? Py_True : Py_False; stack_pointer[-2] = b; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -3586,6 +3659,7 @@ list = stack_pointer[-2 - (oparg-1)]; if (_PyList_AppendTakeRef((PyListObject *)list, v) < 0) goto pop_1_error; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -3613,6 +3687,7 @@ assert(Py_IsNone(none_val)); Py_DECREF(iterable); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -3679,6 +3754,7 @@ stack_pointer[-1] = attr; if (oparg & 1) stack_pointer[0] = self_or_null; stack_pointer += (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -3712,6 +3788,7 @@ stack_pointer[-1] = attr; if (oparg & 1) stack_pointer[0] = null; stack_pointer += (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -3787,6 +3864,7 @@ stack_pointer[-1] = attr; if (oparg & 1) stack_pointer[0] = null; stack_pointer += (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -3829,6 +3907,7 @@ stack_pointer[-1] = attr; stack_pointer[0] = self; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -3864,6 +3943,7 @@ stack_pointer[-1] = attr; stack_pointer[0] = self; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -3910,6 +3990,7 @@ stack_pointer[-1] = attr; stack_pointer[0] = self; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -3949,6 +4030,7 @@ stack_pointer[-1] = attr; if (oparg & 1) stack_pointer[0] = null; stack_pointer += (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4089,6 +4171,7 @@ stack_pointer[-1] = attr; if (oparg & 1) stack_pointer[0] = null; stack_pointer += (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4142,6 +4225,7 @@ stack_pointer[-1] = attr; if (oparg & 1) stack_pointer[0] = null; stack_pointer += (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4158,6 +4242,7 @@ } stack_pointer[0] = bc; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4179,6 +4264,7 @@ } stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4191,6 +4277,7 @@ Py_INCREF(value); stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4207,6 +4294,7 @@ } stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4220,6 +4308,7 @@ Py_INCREF(value); stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4233,6 +4322,7 @@ GETLOCAL(oparg) = NULL; stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4252,6 +4342,7 @@ Py_INCREF(value); stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4270,6 +4361,7 @@ stack_pointer[0] = value1; stack_pointer[1] = value2; stack_pointer += 2; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4415,6 +4507,7 @@ stack_pointer[0] = res; if (oparg & 1) stack_pointer[1] = null; stack_pointer += 1 + (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4456,6 +4549,7 @@ stack_pointer[0] = res; if (oparg & 1) stack_pointer[1] = null; stack_pointer += 1 + (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4490,6 +4584,7 @@ stack_pointer[0] = res; if (oparg & 1) stack_pointer[1] = null; stack_pointer += 1 + (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4507,6 +4602,7 @@ Py_INCREF(locals); stack_pointer[0] = locals; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4543,6 +4639,7 @@ } stack_pointer[0] = v; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4568,6 +4665,7 @@ stack_pointer[-1] = attr; stack_pointer[0] = self_or_null; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4643,6 +4741,7 @@ stack_pointer[-3] = attr; if (oparg & 1) stack_pointer[-2] = null; stack_pointer += -2 + (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4671,6 +4770,7 @@ if (attr == NULL) goto pop_3_error; stack_pointer[-3] = attr; stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4712,6 +4812,7 @@ stack_pointer[-3] = attr; stack_pointer[-2] = self_or_null; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4765,6 +4866,7 @@ // Do not DECREF INPUTS because the function steals the references if (_PyDict_SetItem_Take2((PyDictObject *)dict, key, value) != 0) goto pop_2_error; stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4796,6 +4898,7 @@ } stack_pointer[-3] = attrs; stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4813,6 +4916,7 @@ if (values_or_none == NULL) goto error; stack_pointer[0] = values_or_none; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4827,6 +4931,7 @@ res = match ? Py_True : Py_False; stack_pointer[0] = res; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4841,6 +4946,7 @@ res = match ? Py_True : Py_False; stack_pointer[0] = res; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4860,6 +4966,7 @@ _PyErr_StackItem *exc_info = tstate->exc_info; Py_XSETREF(exc_info->exc_value, exc_value == Py_None ? NULL : exc_value); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4878,6 +4985,7 @@ #endif JUMPBY(oparg * flag); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4912,6 +5020,7 @@ JUMPBY(oparg * flag); } stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4946,6 +5055,7 @@ JUMPBY(oparg * flag); } stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4964,6 +5074,7 @@ #endif JUMPBY(oparg * flag); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4975,6 +5086,7 @@ value = stack_pointer[-1]; Py_DECREF(value); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -4997,6 +5109,7 @@ stack_pointer[-1] = prev_exc; stack_pointer[0] = new_exc; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -5008,6 +5121,7 @@ res = NULL; stack_pointer[0] = res; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -5164,6 +5278,7 @@ } stack_pointer[0] = res; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -5196,6 +5311,7 @@ LLTRACE_RESUME_FRAME(); stack_pointer[0] = res; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -5210,6 +5326,7 @@ assert(frame != &entry_frame); #endif stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); _PyFrame_SetStackPointer(frame, stack_pointer); assert(EMPTY()); _Py_LeaveRecursiveCallPy(tstate); @@ -5223,6 +5340,7 @@ LLTRACE_RESUME_FRAME(); stack_pointer[0] = res; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -5360,6 +5478,7 @@ Py_DECREF(v); if (err) goto pop_1_error; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -5402,6 +5521,7 @@ } stack_pointer[-2] = func; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -5417,6 +5537,7 @@ Py_DECREF(iterable); if (err < 0) goto pop_1_error; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -5456,6 +5577,7 @@ if (err) goto pop_2_error; } stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -5500,6 +5622,7 @@ Py_DECREF(owner); } stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -5531,6 +5654,7 @@ Py_DECREF(owner); } stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -5589,6 +5713,7 @@ Py_DECREF(owner); } stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -5601,6 +5726,7 @@ PyCellObject *cell = (PyCellObject *)GETLOCAL(oparg); PyCell_SetTakeRef(cell, v); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -5612,6 +5738,7 @@ value = stack_pointer[-1]; SETLOCAL(oparg, value); stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -5644,6 +5771,7 @@ SETLOCAL(oparg1, value1); SETLOCAL(oparg2, value2); stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -5658,6 +5786,7 @@ Py_DECREF(v); if (err) goto pop_1_error; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -5683,6 +5812,7 @@ Py_DECREF(v); if (err) goto pop_1_error; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -5711,6 +5841,7 @@ Py_DECREF(container); if (err) goto pop_4_error; stack_pointer += -4; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -5751,6 +5882,7 @@ if (err) goto pop_3_error; } stack_pointer += -3; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -5772,6 +5904,7 @@ Py_DECREF(dict); if (err) goto pop_3_error; stack_pointer += -3; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -5802,6 +5935,7 @@ _Py_DECREF_SPECIALIZED(sub, (destructor)PyObject_Free); Py_DECREF(list); stack_pointer += -3; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -6034,6 +6168,7 @@ Py_DECREF(seq); if (res == 0) goto pop_1_error; stack_pointer += (oparg >> 8) + (oparg & 0xFF); + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -6070,6 +6205,7 @@ if (res == 0) goto pop_1_error; } stack_pointer += -1 + oparg; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -6092,6 +6228,7 @@ } Py_DECREF(seq); stack_pointer += -1 + oparg; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -6114,6 +6251,7 @@ } Py_DECREF(seq); stack_pointer += -1 + oparg; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -6137,6 +6275,7 @@ stack_pointer[-1] = val1; stack_pointer[0] = val0; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -6181,6 +6320,7 @@ if (res == NULL) goto error; stack_pointer[0] = res; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } @@ -6203,6 +6343,7 @@ assert(oparg == 0 || oparg == 1); gen->gi_frame_state = FRAME_SUSPENDED + oparg; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); _PyFrame_SetStackPointer(frame, stack_pointer); tstate->exc_info = gen->gi_exc_state.previous_item; gen->gi_exc_state.previous_item = NULL; @@ -6226,6 +6367,7 @@ LLTRACE_RESUME_FRAME(); stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); DISPATCH(); } #undef TIER_ONE diff --git a/Python/optimizer_analysis.c b/Python/optimizer_analysis.c index 0e45bd8e31a54d..bbddbc8d1eaec3 100644 --- a/Python/optimizer_analysis.c +++ b/Python/optimizer_analysis.c @@ -301,6 +301,11 @@ remove_globals(_PyInterpreterFrame *frame, _PyUOpInstruction *buffer, #define STACK_LEVEL() ((int)(stack_pointer - ctx->frame->stack)) +#define STACK_SIZE() ((int)(ctx->frame->stack_len)) + +#define WITHIN_STACK_BOUNDS() \ + (STACK_LEVEL() >= 0 && STACK_LEVEL() <= STACK_SIZE()) + #define GETLOCAL(idx) ((ctx->frame->locals[idx])) diff --git a/Python/optimizer_cases.c.h b/Python/optimizer_cases.c.h index 7274bd2a6fc02b..c4f310dc20cbfa 100644 --- a/Python/optimizer_cases.c.h +++ b/Python/optimizer_cases.c.h @@ -22,6 +22,7 @@ } stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -30,6 +31,7 @@ value = GETLOCAL(oparg); stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -40,6 +42,7 @@ GETLOCAL(oparg) = temp; stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -51,6 +54,7 @@ value = sym_new_const(ctx, val); stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -59,11 +63,13 @@ value = stack_pointer[-1]; GETLOCAL(oparg) = value; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } case _POP_TOP: { stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -72,6 +78,7 @@ res = sym_new_null(ctx); stack_pointer[0] = res; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -80,6 +87,7 @@ value = sym_new_not_null(ctx); stack_pointer[-2] = value; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -239,6 +247,7 @@ } stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -268,6 +277,7 @@ } stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -297,6 +307,7 @@ } stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -358,6 +369,7 @@ } stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -388,6 +400,7 @@ } stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -418,6 +431,7 @@ } stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -455,6 +469,7 @@ } stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -463,6 +478,7 @@ res = sym_new_not_null(ctx); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -471,11 +487,13 @@ res = sym_new_not_null(ctx); stack_pointer[-3] = res; stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); break; } case _STORE_SLICE: { stack_pointer += -4; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -484,6 +502,7 @@ res = sym_new_not_null(ctx); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -492,6 +511,7 @@ res = sym_new_not_null(ctx); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -500,6 +520,7 @@ res = sym_new_not_null(ctx); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -508,6 +529,7 @@ res = sym_new_not_null(ctx); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -515,31 +537,37 @@ case _LIST_APPEND: { stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } case _SET_ADD: { stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } case _STORE_SUBSCR: { stack_pointer += -3; + assert(WITHIN_STACK_BOUNDS()); break; } case _STORE_SUBSCR_LIST_INT: { stack_pointer += -3; + assert(WITHIN_STACK_BOUNDS()); break; } case _STORE_SUBSCR_DICT: { stack_pointer += -3; + assert(WITHIN_STACK_BOUNDS()); break; } case _DELETE_SUBSCR: { stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -555,6 +583,7 @@ res = sym_new_not_null(ctx); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -563,6 +592,7 @@ _Py_UopsSymbol *res; retval = stack_pointer[-1]; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); ctx->frame->stack_pointer = stack_pointer; frame_pop(ctx); stack_pointer = ctx->frame->stack_pointer; @@ -581,6 +611,7 @@ } stack_pointer[0] = res; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -600,6 +631,7 @@ awaitable = sym_new_not_null(ctx); stack_pointer[0] = awaitable; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -625,6 +657,7 @@ case _POP_EXCEPT: { stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -633,6 +666,7 @@ value = sym_new_not_null(ctx); stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -641,11 +675,13 @@ bc = sym_new_not_null(ctx); stack_pointer[0] = bc; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } case _STORE_NAME: { stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -664,6 +700,7 @@ values[i] = sym_new_unknown(ctx); } stack_pointer += -1 + oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -675,6 +712,7 @@ stack_pointer[-1] = val1; stack_pointer[0] = val0; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -685,6 +723,7 @@ values[_i] = sym_new_not_null(ctx); } stack_pointer += -1 + oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -695,6 +734,7 @@ values[_i] = sym_new_not_null(ctx); } stack_pointer += -1 + oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -710,21 +750,25 @@ values[i] = sym_new_unknown(ctx); } stack_pointer += (oparg >> 8) + (oparg & 0xFF); + assert(WITHIN_STACK_BOUNDS()); break; } case _STORE_ATTR: { stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); break; } case _DELETE_ATTR: { stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } case _STORE_GLOBAL: { stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -737,6 +781,7 @@ locals = sym_new_not_null(ctx); stack_pointer[0] = locals; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -752,6 +797,7 @@ stack_pointer[0] = res; if (oparg & 1) stack_pointer[1] = null; stack_pointer += 1 + (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); break; } @@ -771,6 +817,7 @@ stack_pointer[0] = res; if (oparg & 1) stack_pointer[1] = null; stack_pointer += 1 + (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); break; } @@ -782,6 +829,7 @@ stack_pointer[0] = res; if (oparg & 1) stack_pointer[1] = null; stack_pointer += 1 + (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); break; } @@ -809,11 +857,13 @@ value = sym_new_not_null(ctx); stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } case _STORE_DEREF: { stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -826,6 +876,7 @@ str = sym_new_not_null(ctx); stack_pointer[-oparg] = str; stack_pointer += 1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -834,6 +885,7 @@ tup = sym_new_not_null(ctx); stack_pointer[-oparg] = tup; stack_pointer += 1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -842,16 +894,19 @@ list = sym_new_not_null(ctx); stack_pointer[-oparg] = list; stack_pointer += 1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } case _LIST_EXTEND: { stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } case _SET_UPDATE: { stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -862,6 +917,7 @@ map = sym_new_not_null(ctx); stack_pointer[-oparg*2] = map; stack_pointer += 1 - oparg*2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -874,21 +930,25 @@ map = sym_new_not_null(ctx); stack_pointer[-1 - oparg] = map; stack_pointer += -oparg; + assert(WITHIN_STACK_BOUNDS()); break; } case _DICT_UPDATE: { stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } case _DICT_MERGE: { stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } case _MAP_ADD: { stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -899,6 +959,7 @@ attr = sym_new_not_null(ctx); stack_pointer[-3] = attr; stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -910,6 +971,7 @@ stack_pointer[-3] = attr; stack_pointer[-2] = self_or_null; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -926,6 +988,7 @@ stack_pointer[-1] = attr; if (oparg & 1) stack_pointer[0] = self_or_null; stack_pointer += (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); break; } @@ -972,6 +1035,7 @@ stack_pointer[-1] = attr; if (oparg & 1) stack_pointer[0] = null; stack_pointer += (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1024,6 +1088,7 @@ stack_pointer[-1] = attr; if (oparg & 1) stack_pointer[0] = null; stack_pointer += (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1044,6 +1109,7 @@ stack_pointer[-1] = attr; if (oparg & 1) stack_pointer[0] = null; stack_pointer += (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1060,6 +1126,7 @@ stack_pointer[-1] = attr; if (oparg & 1) stack_pointer[0] = null; stack_pointer += (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1080,6 +1147,7 @@ stack_pointer[-1] = attr; if (oparg & 1) stack_pointer[0] = null; stack_pointer += (oparg & 1); + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1093,16 +1161,19 @@ case _STORE_ATTR_INSTANCE_VALUE: { stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); break; } case _STORE_ATTR_WITH_HINT: { stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); break; } case _STORE_ATTR_SLOT: { stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1122,6 +1193,7 @@ } stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1136,6 +1208,7 @@ res = sym_new_type(ctx, &PyBool_Type); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1150,6 +1223,7 @@ res = sym_new_type(ctx, &PyBool_Type); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1164,6 +1238,7 @@ res = sym_new_type(ctx, &PyBool_Type); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1178,6 +1253,7 @@ res = sym_new_type(ctx, &PyBool_Type); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1192,6 +1268,7 @@ res = sym_new_type(ctx, &PyBool_Type); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1200,6 +1277,7 @@ b = sym_new_not_null(ctx); stack_pointer[-2] = b; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1208,6 +1286,7 @@ b = sym_new_not_null(ctx); stack_pointer[-2] = b; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1244,6 +1323,7 @@ len_o = sym_new_not_null(ctx); stack_pointer[0] = len_o; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1252,6 +1332,7 @@ attrs = sym_new_not_null(ctx); stack_pointer[-3] = attrs; stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1260,6 +1341,7 @@ res = sym_new_not_null(ctx); stack_pointer[0] = res; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1268,6 +1350,7 @@ res = sym_new_not_null(ctx); stack_pointer[0] = res; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1276,6 +1359,7 @@ values_or_none = sym_new_not_null(ctx); stack_pointer[0] = values_or_none; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1300,6 +1384,7 @@ next = sym_new_not_null(ctx); stack_pointer[0] = next; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1320,6 +1405,7 @@ next = sym_new_not_null(ctx); stack_pointer[0] = next; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1338,6 +1424,7 @@ next = sym_new_not_null(ctx); stack_pointer[0] = next; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1359,6 +1446,7 @@ (void)iter; stack_pointer[0] = next; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1379,6 +1467,7 @@ stack_pointer[-1] = attr; stack_pointer[0] = self_or_null; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1387,6 +1476,7 @@ res = sym_new_not_null(ctx); stack_pointer[0] = res; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1398,6 +1488,7 @@ stack_pointer[-1] = prev_exc; stack_pointer[0] = new_exc; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1421,6 +1512,7 @@ stack_pointer[-1] = attr; stack_pointer[0] = self; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1436,6 +1528,7 @@ stack_pointer[-1] = attr; stack_pointer[0] = self; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1469,6 +1562,7 @@ stack_pointer[-1] = attr; stack_pointer[0] = self; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1496,6 +1590,7 @@ ctx->done = true; stack_pointer[-2 - oparg] = (_Py_UopsSymbol *)new_frame; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1526,6 +1621,7 @@ res = sym_new_not_null(ctx); stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1621,6 +1717,7 @@ } stack_pointer[-2 - oparg] = (_Py_UopsSymbol *)new_frame; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1628,6 +1725,7 @@ _Py_UOpsAbstractFrame *new_frame; new_frame = (_Py_UOpsAbstractFrame *)stack_pointer[-1]; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); ctx->frame->stack_pointer = stack_pointer; ctx->frame = new_frame; ctx->curr_frame_depth++; @@ -1664,6 +1762,7 @@ res = sym_new_not_null(ctx); stack_pointer[-3] = res; stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1672,6 +1771,7 @@ res = sym_new_not_null(ctx); stack_pointer[-3] = res; stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1680,6 +1780,7 @@ res = sym_new_not_null(ctx); stack_pointer[-3] = res; stack_pointer += -2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1687,6 +1788,7 @@ case _EXIT_INIT_CHECK: { stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1695,6 +1797,7 @@ res = sym_new_not_null(ctx); stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1703,6 +1806,7 @@ res = sym_new_not_null(ctx); stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1711,6 +1815,7 @@ res = sym_new_not_null(ctx); stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1719,6 +1824,7 @@ res = sym_new_not_null(ctx); stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1727,6 +1833,7 @@ res = sym_new_not_null(ctx); stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1735,6 +1842,7 @@ res = sym_new_not_null(ctx); stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1743,6 +1851,7 @@ res = sym_new_not_null(ctx); stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1751,6 +1860,7 @@ res = sym_new_not_null(ctx); stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1759,6 +1869,7 @@ res = sym_new_not_null(ctx); stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1767,6 +1878,7 @@ res = sym_new_not_null(ctx); stack_pointer[-2 - oparg] = res; stack_pointer += -1 - oparg; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1790,6 +1902,7 @@ func = sym_new_not_null(ctx); stack_pointer[-2] = func; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1813,6 +1926,7 @@ } stack_pointer[0] = res; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1821,6 +1935,7 @@ slice = sym_new_not_null(ctx); stack_pointer[-2 - ((oparg == 3) ? 1 : 0)] = slice; stack_pointer += -1 - ((oparg == 3) ? 1 : 0); + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1843,6 +1958,7 @@ res = sym_new_not_null(ctx); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1854,6 +1970,7 @@ top = bottom; stack_pointer[0] = top; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1881,6 +1998,7 @@ res = sym_new_unknown(ctx); stack_pointer[-2] = res; stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1917,6 +2035,7 @@ eliminate_pop_guard(this_instr, value != Py_True); } stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1929,6 +2048,7 @@ eliminate_pop_guard(this_instr, value != Py_False); } stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1945,6 +2065,7 @@ eliminate_pop_guard(this_instr, true); } stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -1961,6 +2082,7 @@ eliminate_pop_guard(this_instr, false); } stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2001,6 +2123,7 @@ value = sym_new_const(ctx, ptr); stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2010,6 +2133,7 @@ value = sym_new_const(ctx, ptr); stack_pointer[0] = value; stack_pointer += 1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2029,6 +2153,7 @@ stack_pointer[0] = value; stack_pointer[1] = null; stack_pointer += 2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2041,6 +2166,7 @@ stack_pointer[0] = value; stack_pointer[1] = null; stack_pointer += 2; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2050,6 +2176,7 @@ case _INTERNAL_INCREMENT_OPT_COUNTER: { stack_pointer += -1; + assert(WITHIN_STACK_BOUNDS()); break; } @@ -2079,6 +2206,7 @@ case _ERROR_POP_N: { stack_pointer += -oparg; + assert(WITHIN_STACK_BOUNDS()); break; } diff --git a/Tools/cases_generator/stack.py b/Tools/cases_generator/stack.py index 7f07a6805b1cb6..7325f2f188777b 100644 --- a/Tools/cases_generator/stack.py +++ b/Tools/cases_generator/stack.py @@ -199,6 +199,7 @@ def flush(self, out: CWriter, cast_type: str = "PyObject *") -> None: number = self.base_offset.to_c() if number != "0": out.emit(f"stack_pointer += {number};\n") + out.emit("assert(WITHIN_STACK_BOUNDS());\n") self.variables = [] self.base_offset.clear() self.top_offset.clear() diff --git a/Tools/jit/template.c b/Tools/jit/template.c index 813e586bd3c03d..39ce236bb60d44 100644 --- a/Tools/jit/template.c +++ b/Tools/jit/template.c @@ -80,6 +80,9 @@ do { \ #undef JUMP_TO_ERROR #define JUMP_TO_ERROR() PATCH_JUMP(_JIT_ERROR_TARGET) +#undef WITHIN_STACK_BOUNDS +#define WITHIN_STACK_BOUNDS() 1 + _Py_CODEUNIT * _JIT_ENTRY(_PyInterpreterFrame *frame, PyObject **stack_pointer, PyThreadState *tstate) {