forked from bartvdbraak/blender
attempt to have a threadsafe version of PyC_ExceptionBuffer didnt work with UI script errors, reverting r39886.
This commit is contained in:
parent
290ad64a22
commit
5a900be4d6
@ -209,6 +209,10 @@ PyObject *PyC_Object_GetAttrStringArgs(PyObject *o, Py_ssize_t n, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* returns the exception string as a new PyUnicode object, depends on external traceback module */
|
/* returns the exception string as a new PyUnicode object, depends on external traceback module */
|
||||||
|
#if 0
|
||||||
|
|
||||||
|
/* this version uses traceback module but somehow fails on UI errors */
|
||||||
|
|
||||||
PyObject *PyC_ExceptionBuffer(void)
|
PyObject *PyC_ExceptionBuffer(void)
|
||||||
{
|
{
|
||||||
PyObject *traceback_mod= NULL;
|
PyObject *traceback_mod= NULL;
|
||||||
@ -236,6 +240,78 @@ error_cleanup:
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
#else /* verbose, non-threadsafe version */
|
||||||
|
PyObject *PyC_ExceptionBuffer(void)
|
||||||
|
{
|
||||||
|
PyObject *stdout_backup = PySys_GetObject("stdout"); /* borrowed */
|
||||||
|
PyObject *stderr_backup = PySys_GetObject("stderr"); /* borrowed */
|
||||||
|
PyObject *string_io = NULL;
|
||||||
|
PyObject *string_io_buf = NULL;
|
||||||
|
PyObject *string_io_mod= NULL;
|
||||||
|
PyObject *string_io_getvalue= NULL;
|
||||||
|
|
||||||
|
PyObject *error_type, *error_value, *error_traceback;
|
||||||
|
|
||||||
|
if (!PyErr_Occurred())
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
PyErr_Fetch(&error_type, &error_value, &error_traceback);
|
||||||
|
|
||||||
|
PyErr_Clear();
|
||||||
|
|
||||||
|
/* import io
|
||||||
|
* string_io = io.StringIO()
|
||||||
|
*/
|
||||||
|
|
||||||
|
if(! (string_io_mod= PyImport_ImportModule("io")) ) {
|
||||||
|
goto error_cleanup;
|
||||||
|
}
|
||||||
|
else if (! (string_io = PyObject_CallMethod(string_io_mod, (char *)"StringIO", NULL))) {
|
||||||
|
goto error_cleanup;
|
||||||
|
}
|
||||||
|
else if (! (string_io_getvalue= PyObject_GetAttrString(string_io, "getvalue"))) {
|
||||||
|
goto error_cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
Py_INCREF(stdout_backup); // since these were borrowed we dont want them freed when replaced.
|
||||||
|
Py_INCREF(stderr_backup);
|
||||||
|
|
||||||
|
PySys_SetObject("stdout", string_io); // both of these are free'd when restoring
|
||||||
|
PySys_SetObject("stderr", string_io);
|
||||||
|
|
||||||
|
PyErr_Restore(error_type, error_value, error_traceback);
|
||||||
|
PyErr_Print(); /* print the error */
|
||||||
|
PyErr_Clear();
|
||||||
|
|
||||||
|
string_io_buf = PyObject_CallObject(string_io_getvalue, NULL);
|
||||||
|
|
||||||
|
PySys_SetObject("stdout", stdout_backup);
|
||||||
|
PySys_SetObject("stderr", stderr_backup);
|
||||||
|
|
||||||
|
Py_DECREF(stdout_backup); /* now sys owns the ref again */
|
||||||
|
Py_DECREF(stderr_backup);
|
||||||
|
|
||||||
|
Py_DECREF(string_io_mod);
|
||||||
|
Py_DECREF(string_io_getvalue);
|
||||||
|
Py_DECREF(string_io); /* free the original reference */
|
||||||
|
|
||||||
|
PyErr_Clear();
|
||||||
|
return string_io_buf;
|
||||||
|
|
||||||
|
|
||||||
|
error_cleanup:
|
||||||
|
/* could not import the module so print the error and close */
|
||||||
|
Py_XDECREF(string_io_mod);
|
||||||
|
Py_XDECREF(string_io);
|
||||||
|
|
||||||
|
PyErr_Restore(error_type, error_value, error_traceback);
|
||||||
|
PyErr_Print(); /* print the error */
|
||||||
|
PyErr_Clear();
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* string conversion, escape non-unicode chars, coerce must be set to NULL */
|
/* string conversion, escape non-unicode chars, coerce must be set to NULL */
|
||||||
const char *PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce)
|
const char *PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce)
|
||||||
|
Loading…
Reference in New Issue
Block a user