diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-11-10-02-11-23.gh-issue-99298.NeArAJ.rst b/Misc/NEWS.d/next/Core and Builtins/2022-11-10-02-11-23.gh-issue-99298.NeArAJ.rst new file mode 100644 index 00000000000000..8908bfaa8e25f6 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-11-10-02-11-23.gh-issue-99298.NeArAJ.rst @@ -0,0 +1,2 @@ +Fix an issue that could potentially cause incorrect error handling for some +bytecode instructions. diff --git a/Python/ceval.c b/Python/ceval.c index c0d9c68de04b0c..b4ebf0c3d50e50 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2158,6 +2158,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int PyObject *container = SECOND(); next_instr--; if (_Py_Specialize_BinarySubscr(container, sub, next_instr) < 0) { + next_instr++; goto error; } DISPATCH_SAME_OPARG(); @@ -2323,6 +2324,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int PyObject *container = SECOND(); next_instr--; if (_Py_Specialize_StoreSubscr(container, sub, next_instr) < 0) { + next_instr++; goto error; } DISPATCH_SAME_OPARG(); @@ -3056,6 +3058,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int PyObject *name = GETITEM(names, oparg>>1); next_instr--; if (_Py_Specialize_LoadGlobal(GLOBALS(), BUILTINS(), next_instr, name) < 0) { + next_instr++; goto error; } DISPATCH_SAME_OPARG(); @@ -3481,6 +3484,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int PyObject *name = GETITEM(names, oparg); next_instr--; if (_Py_Specialize_LoadAttr(owner, next_instr, name) < 0) { + next_instr++; goto error; } DISPATCH_SAME_OPARG(); @@ -3590,6 +3594,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int PyObject *name = GETITEM(names, oparg); next_instr--; if (_Py_Specialize_StoreAttr(owner, next_instr, name) < 0) { + next_instr++; goto error; } DISPATCH_SAME_OPARG(); @@ -4527,6 +4532,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int PyObject *name = GETITEM(names, oparg); next_instr--; if (_Py_Specialize_LoadMethod(owner, next_instr, name) < 0) { + next_instr++; goto error; } DISPATCH_SAME_OPARG(); @@ -4801,6 +4807,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int int err = _Py_Specialize_Precall(callable, next_instr, nargs, call_shape.kwnames, oparg); if (err < 0) { + next_instr++; goto error; } DISPATCH_SAME_OPARG(); @@ -4822,6 +4829,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int int err = _Py_Specialize_Call(callable, next_instr, nargs, call_shape.kwnames); if (err < 0) { + next_instr++; goto error; } DISPATCH_SAME_OPARG(); @@ -5184,9 +5192,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int PyObject *list = SECOND(); DEOPT_IF(!PyList_Check(list), PRECALL); STAT_INC(PRECALL, hit); - // PRECALL + CALL + POP_TOP - JUMPBY(INLINE_CACHE_ENTRIES_PRECALL + 1 + INLINE_CACHE_ENTRIES_CALL + 1); - assert(_Py_OPCODE(next_instr[-1]) == POP_TOP); PyObject *arg = POP(); if (_PyList_AppendTakeRef((PyListObject *)list, arg) < 0) { goto error; @@ -5194,6 +5199,9 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int STACK_SHRINK(2); Py_DECREF(list); Py_DECREF(callable); + // PRECALL + CALL + POP_TOP + JUMPBY(INLINE_CACHE_ENTRIES_PRECALL + 1 + INLINE_CACHE_ENTRIES_CALL + 1); + assert(_Py_OPCODE(next_instr[-1]) == POP_TOP); DISPATCH(); }