gh-130595: Keep traceback alive for WITH_EXCEPT_START (#130562)

Keep traceback alive for WITH_EXCEPT_START
This commit is contained in:
Dino Viehland 2025-02-26 10:41:26 -08:00 committed by GitHub
parent 9e474a98af
commit 5c8e8704c3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 10 additions and 16 deletions

View file

@ -3297,13 +3297,10 @@ dummy_func(
assert(val_o && PyExceptionInstance_Check(val_o)); assert(val_o && PyExceptionInstance_Check(val_o));
exc = PyExceptionInstance_Class(val_o); exc = PyExceptionInstance_Class(val_o);
tb = PyException_GetTraceback(val_o); PyObject *original_tb = tb = PyException_GetTraceback(val_o);
if (tb == NULL) { if (tb == NULL) {
tb = Py_None; tb = Py_None;
} }
else {
Py_DECREF(tb);
}
assert(PyStackRef_LongCheck(lasti)); assert(PyStackRef_LongCheck(lasti));
(void)lasti; // Shut up compiler warning if asserts are off (void)lasti; // Shut up compiler warning if asserts are off
PyObject *stack[5] = {NULL, PyStackRef_AsPyObjectBorrow(exit_self), exc, val_o, tb}; 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, PyObject *res_o = PyObject_Vectorcall(exit_func_o, stack + 2 - has_self,
(3 + has_self) | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); (3 + has_self) | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL);
ERROR_IF(res_o == NULL, error); ERROR_IF(res_o == NULL, error);
Py_XDECREF(original_tb);
res = PyStackRef_FromPyObjectSteal(res_o); res = PyStackRef_FromPyObjectSteal(res_o);
} }

View file

@ -4426,15 +4426,10 @@
PyObject *exit_func_o = PyStackRef_AsPyObjectBorrow(exit_func); PyObject *exit_func_o = PyStackRef_AsPyObjectBorrow(exit_func);
assert(val_o && PyExceptionInstance_Check(val_o)); assert(val_o && PyExceptionInstance_Check(val_o));
exc = PyExceptionInstance_Class(val_o); exc = PyExceptionInstance_Class(val_o);
tb = PyException_GetTraceback(val_o); PyObject *original_tb = tb = PyException_GetTraceback(val_o);
if (tb == NULL) { if (tb == NULL) {
tb = Py_None; tb = Py_None;
} }
else {
_PyFrame_SetStackPointer(frame, stack_pointer);
Py_DECREF(tb);
stack_pointer = _PyFrame_GetStackPointer(frame);
}
assert(PyStackRef_LongCheck(lasti)); assert(PyStackRef_LongCheck(lasti));
(void)lasti; // Shut up compiler warning if asserts are off (void)lasti; // Shut up compiler warning if asserts are off
PyObject *stack[5] = {NULL, PyStackRef_AsPyObjectBorrow(exit_self), exc, val_o, tb}; PyObject *stack[5] = {NULL, PyStackRef_AsPyObjectBorrow(exit_self), exc, val_o, tb};
@ -4446,6 +4441,9 @@
if (res_o == NULL) { if (res_o == NULL) {
JUMP_TO_ERROR(); JUMP_TO_ERROR();
} }
_PyFrame_SetStackPointer(frame, stack_pointer);
Py_XDECREF(original_tb);
stack_pointer = _PyFrame_GetStackPointer(frame);
res = PyStackRef_FromPyObjectSteal(res_o); res = PyStackRef_FromPyObjectSteal(res_o);
stack_pointer[0] = res; stack_pointer[0] = res;
stack_pointer += 1; stack_pointer += 1;

View file

@ -11845,15 +11845,10 @@
PyObject *exit_func_o = PyStackRef_AsPyObjectBorrow(exit_func); PyObject *exit_func_o = PyStackRef_AsPyObjectBorrow(exit_func);
assert(val_o && PyExceptionInstance_Check(val_o)); assert(val_o && PyExceptionInstance_Check(val_o));
exc = PyExceptionInstance_Class(val_o); exc = PyExceptionInstance_Class(val_o);
tb = PyException_GetTraceback(val_o); PyObject *original_tb = tb = PyException_GetTraceback(val_o);
if (tb == NULL) { if (tb == NULL) {
tb = Py_None; tb = Py_None;
} }
else {
_PyFrame_SetStackPointer(frame, stack_pointer);
Py_DECREF(tb);
stack_pointer = _PyFrame_GetStackPointer(frame);
}
assert(PyStackRef_LongCheck(lasti)); assert(PyStackRef_LongCheck(lasti));
(void)lasti; // Shut up compiler warning if asserts are off (void)lasti; // Shut up compiler warning if asserts are off
PyObject *stack[5] = {NULL, PyStackRef_AsPyObjectBorrow(exit_self), exc, val_o, tb}; PyObject *stack[5] = {NULL, PyStackRef_AsPyObjectBorrow(exit_self), exc, val_o, tb};
@ -11865,6 +11860,9 @@
if (res_o == NULL) { if (res_o == NULL) {
JUMP_TO_LABEL(error); JUMP_TO_LABEL(error);
} }
_PyFrame_SetStackPointer(frame, stack_pointer);
Py_XDECREF(original_tb);
stack_pointer = _PyFrame_GetStackPointer(frame);
res = PyStackRef_FromPyObjectSteal(res_o); res = PyStackRef_FromPyObjectSteal(res_o);
stack_pointer[0] = res; stack_pointer[0] = res;
stack_pointer += 1; stack_pointer += 1;