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:
@@ -28,12 +28,15 @@ struct bContext;
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* For 'FILE'. */
|
||||
#include <stdio.h>
|
||||
|
||||
/* bpy_interface.c */
|
||||
void BPY_python_start(int argc, const char **argv);
|
||||
void BPY_python_end(void);
|
||||
void BPY_python_reset(struct bContext *C);
|
||||
void BPY_python_use_system_env(void);
|
||||
void BPY_python_backtrace(/* FILE */ void *file);
|
||||
void BPY_python_backtrace(FILE *file);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
|
||||
@@ -382,20 +382,6 @@ void PyC_StackSpit(void)
|
||||
PyGILState_Release(gilstate);
|
||||
}
|
||||
|
||||
void PyC_StackPrint(/* FILE */ void *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));
|
||||
}
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
|
||||
@@ -28,7 +28,6 @@ void PyC_ObSpit(const char *name, PyObject *var);
|
||||
void PyC_ObSpitStr(char *result, size_t result_len, PyObject *var);
|
||||
void PyC_LineSpit(void);
|
||||
void PyC_StackSpit(void);
|
||||
void PyC_StackPrint(/* FILE */ void *fp);
|
||||
PyObject *PyC_ExceptionBuffer(void);
|
||||
PyObject *PyC_ExceptionBuffer_Simple(void);
|
||||
PyObject *PyC_Object_GetAttrStringArgs(PyObject *o, Py_ssize_t n, ...);
|
||||
|
||||
@@ -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] */
|
||||
|
||||
Reference in New Issue
Block a user