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