mirror of
https://github.com/RYDE-WORK/pybind11.git
synced 2026-02-03 22:14:33 +08:00
detail::error_string: handle call stacks that switch between C++ and Python multiple times
This commit is contained in:
parent
fbec17ce90
commit
e72d958a5d
@ -136,19 +136,29 @@ PYBIND11_NOINLINE inline std::string error_string() {
|
|||||||
|
|
||||||
PyErr_NormalizeException(&scope.type, &scope.value, &scope.trace);
|
PyErr_NormalizeException(&scope.type, &scope.value, &scope.trace);
|
||||||
|
|
||||||
|
#if PY_MAJOR_VERSION >= 3
|
||||||
|
if (scope.trace != nullptr)
|
||||||
|
PyException_SetTraceback(scope.value, scope.trace);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (scope.trace) {
|
if (scope.trace) {
|
||||||
PyFrameObject *frame = ((PyTracebackObject *) scope.trace)->tb_frame;
|
PyTracebackObject *trace = (PyTracebackObject *) scope.trace;
|
||||||
if (frame) {
|
|
||||||
errorString += "\n\nAt:\n";
|
/* Get the deepest trace possible */
|
||||||
while (frame) {
|
while (trace->tb_next)
|
||||||
int lineno = PyFrame_GetLineNumber(frame);
|
trace = trace->tb_next;
|
||||||
errorString +=
|
|
||||||
" " + handle(frame->f_code->co_filename).cast<std::string>() +
|
PyFrameObject *frame = trace->tb_frame;
|
||||||
"(" + std::to_string(lineno) + "): " +
|
errorString += "\n\nAt:\n";
|
||||||
handle(frame->f_code->co_name).cast<std::string>() + "\n";
|
while (frame) {
|
||||||
frame = frame->f_back;
|
int lineno = PyFrame_GetLineNumber(frame);
|
||||||
}
|
errorString +=
|
||||||
|
" " + handle(frame->f_code->co_filename).cast<std::string>() +
|
||||||
|
"(" + std::to_string(lineno) + "): " +
|
||||||
|
handle(frame->f_code->co_name).cast<std::string>() + "\n";
|
||||||
|
frame = frame->f_back;
|
||||||
}
|
}
|
||||||
|
trace = trace->tb_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
return errorString;
|
return errorString;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user