https://github.com/python/cpython/commit/5c8e8704c39110da15956b0678303aff7dffb3be commit: 5c8e8704c39110da15956b0678303aff7dffb3be branch: main author: Dino Viehland <dinoviehl...@meta.com> committer: DinoV <dinoviehl...@gmail.com> date: 2025-02-26T10:41:26-08:00 summary:
gh-130595: Keep traceback alive for WITH_EXCEPT_START (#130562) Keep traceback alive for WITH_EXCEPT_START files: M Python/bytecodes.c M Python/executor_cases.c.h M Python/generated_cases.c.h diff --git a/Python/bytecodes.c b/Python/bytecodes.c index 6f91b10b8b8a9b..9f1309580a630c 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -3297,13 +3297,10 @@ dummy_func( assert(val_o && PyExceptionInstance_Check(val_o)); exc = PyExceptionInstance_Class(val_o); - tb = PyException_GetTraceback(val_o); + PyObject *original_tb = tb = PyException_GetTraceback(val_o); if (tb == NULL) { tb = Py_None; } - else { - Py_DECREF(tb); - } assert(PyStackRef_LongCheck(lasti)); (void)lasti; // Shut up compiler warning if asserts are off PyObject *stack[5] = {NULL, PyStackRef_AsPyObjectBorrow(exit_self), exc, val_o, tb}; @@ -3311,6 +3308,7 @@ dummy_func( PyObject *res_o = PyObject_Vectorcall(exit_func_o, stack + 2 - has_self, (3 + has_self) | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); ERROR_IF(res_o == NULL, error); + Py_XDECREF(original_tb); res = PyStackRef_FromPyObjectSteal(res_o); } diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 9520bc854dc831..5468fc41629452 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -4426,15 +4426,10 @@ PyObject *exit_func_o = PyStackRef_AsPyObjectBorrow(exit_func); assert(val_o && PyExceptionInstance_Check(val_o)); exc = PyExceptionInstance_Class(val_o); - tb = PyException_GetTraceback(val_o); + PyObject *original_tb = tb = PyException_GetTraceback(val_o); if (tb == NULL) { tb = Py_None; } - else { - _PyFrame_SetStackPointer(frame, stack_pointer); - Py_DECREF(tb); - stack_pointer = _PyFrame_GetStackPointer(frame); - } assert(PyStackRef_LongCheck(lasti)); (void)lasti; // Shut up compiler warning if asserts are off PyObject *stack[5] = {NULL, PyStackRef_AsPyObjectBorrow(exit_self), exc, val_o, tb}; @@ -4446,6 +4441,9 @@ if (res_o == NULL) { JUMP_TO_ERROR(); } + _PyFrame_SetStackPointer(frame, stack_pointer); + Py_XDECREF(original_tb); + stack_pointer = _PyFrame_GetStackPointer(frame); res = PyStackRef_FromPyObjectSteal(res_o); stack_pointer[0] = res; stack_pointer += 1; diff --git a/Python/generated_cases.c.h b/Python/generated_cases.c.h index 377be6fb6d6390..311faf340fc3ab 100644 --- a/Python/generated_cases.c.h +++ b/Python/generated_cases.c.h @@ -11845,15 +11845,10 @@ PyObject *exit_func_o = PyStackRef_AsPyObjectBorrow(exit_func); assert(val_o && PyExceptionInstance_Check(val_o)); exc = PyExceptionInstance_Class(val_o); - tb = PyException_GetTraceback(val_o); + PyObject *original_tb = tb = PyException_GetTraceback(val_o); if (tb == NULL) { tb = Py_None; } - else { - _PyFrame_SetStackPointer(frame, stack_pointer); - Py_DECREF(tb); - stack_pointer = _PyFrame_GetStackPointer(frame); - } assert(PyStackRef_LongCheck(lasti)); (void)lasti; // Shut up compiler warning if asserts are off PyObject *stack[5] = {NULL, PyStackRef_AsPyObjectBorrow(exit_self), exc, val_o, tb}; @@ -11865,6 +11860,9 @@ if (res_o == NULL) { JUMP_TO_LABEL(error); } + _PyFrame_SetStackPointer(frame, stack_pointer); + Py_XDECREF(original_tb); + stack_pointer = _PyFrame_GetStackPointer(frame); res = PyStackRef_FromPyObjectSteal(res_o); stack_pointer[0] = res; stack_pointer += 1; _______________________________________________ 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