Cleanup: Pass 'FILE *' instead of 'void *' for BPY_python_backtrace

This was committed as a temporary workaround in 82150f5641
as release builds were failing (only debug builds worked).

This adds `stdio.h` to the header which is now split into a file that
contains more specialized functionality.

Also move function body inside BPY_python_backtrace,
removing PyC_StackPrint as we have PyC_StackSpit() for
similar functionality that can be called from a debugger.
This commit is contained in:
Campbell Barton
2020-08-17 17:21:11 +10:00
parent f8c0d63cdb
commit 397cec6a4d
4 changed files with 16 additions and 18 deletions

View File

@@ -25,6 +25,7 @@
*/
#include <Python.h>
#include <frameobject.h>
#include "MEM_guardedalloc.h"
@@ -439,10 +440,19 @@ static void python_script_error_jump_text(struct Text *text)
}
}
void BPY_python_backtrace(/* FILE */ void *fp)
void BPY_python_backtrace(FILE *fp)
{
fputs("\n# Python backtrace\n", fp);
PyC_StackPrint(fp);
PyThreadState *tstate = PyGILState_GetThisThreadState();
if (tstate != NULL && tstate->frame != NULL) {
PyFrameObject *frame = tstate->frame;
do {
const int line = PyCode_Addr2Line(frame->f_code, frame->f_lasti);
const char *filename = _PyUnicode_AsString(frame->f_code->co_filename);
const char *funcname = _PyUnicode_AsString(frame->f_code->co_name);
fprintf(fp, " File \"%s\", line %d in %s\n", filename, line, funcname);
} while ((frame = frame->f_back));
}
}
/* super annoying, undo _PyModule_Clear(), bug [#23871] */