mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
gh-130595: Keep traceback alive for WITH_EXCEPT_START (#130562)
Keep traceback alive for WITH_EXCEPT_START
This commit is contained in:
parent
9e474a98af
commit
5c8e8704c3
3 changed files with 10 additions and 16 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
10
Python/executor_cases.c.h
generated
10
Python/executor_cases.c.h
generated
|
@ -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;
|
||||||
|
|
10
Python/generated_cases.c.h
generated
10
Python/generated_cases.c.h
generated
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue