Merge branch 'blender-v3.2-release'
This commit is contained in:
commit
61b65e9c9b
@ -90,6 +90,7 @@ class PythonInterpreter : public Interpreter {
|
|||||||
|
|
||||||
if (!BPY_run_string_eval(_context, NULL, str.c_str())) {
|
if (!BPY_run_string_eval(_context, NULL, str.c_str())) {
|
||||||
BPy_errors_to_report(reports);
|
BPy_errors_to_report(reports);
|
||||||
|
PyErr_Clear();
|
||||||
cerr << "\nError executing Python script from PythonInterpreter::interpretString" << endl;
|
cerr << "\nError executing Python script from PythonInterpreter::interpretString" << endl;
|
||||||
cerr << "Name: " << name << endl;
|
cerr << "Name: " << name << endl;
|
||||||
cerr << "Errors: " << endl;
|
cerr << "Errors: " << endl;
|
||||||
|
@ -892,6 +892,10 @@ PyObject *PyC_ExceptionBuffer(void)
|
|||||||
PySys_SetObject("stderr", string_io);
|
PySys_SetObject("stderr", string_io);
|
||||||
|
|
||||||
PyErr_Restore(error_type, error_value, error_traceback);
|
PyErr_Restore(error_type, error_value, error_traceback);
|
||||||
|
/* Printing clears (call #PyErr_Clear as well to ensure it's cleared). */
|
||||||
|
Py_XINCREF(error_type);
|
||||||
|
Py_XINCREF(error_value);
|
||||||
|
Py_XINCREF(error_traceback);
|
||||||
PyErr_Print(); /* print the error */
|
PyErr_Print(); /* print the error */
|
||||||
PyErr_Clear();
|
PyErr_Clear();
|
||||||
|
|
||||||
@ -907,17 +911,18 @@ PyObject *PyC_ExceptionBuffer(void)
|
|||||||
Py_DECREF(string_io_getvalue);
|
Py_DECREF(string_io_getvalue);
|
||||||
Py_DECREF(string_io); /* free the original reference */
|
Py_DECREF(string_io); /* free the original reference */
|
||||||
|
|
||||||
PyErr_Clear();
|
PyErr_Restore(error_type, error_value, error_traceback);
|
||||||
|
|
||||||
return string_io_buf;
|
return string_io_buf;
|
||||||
|
|
||||||
error_cleanup:
|
error_cleanup:
|
||||||
/* could not import the module so print the error and close */
|
/* Could not import the module so print the error and close. */
|
||||||
Py_XDECREF(string_io_mod);
|
Py_XDECREF(string_io_mod);
|
||||||
Py_XDECREF(string_io);
|
Py_XDECREF(string_io);
|
||||||
|
|
||||||
PyErr_Restore(error_type, error_value, error_traceback);
|
PyErr_Restore(error_type, error_value, error_traceback);
|
||||||
PyErr_Print(); /* print the error */
|
PyErr_Print(); /* print the error */
|
||||||
PyErr_Clear();
|
PyErr_Restore(error_type, error_value, error_traceback);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -925,19 +930,15 @@ error_cleanup:
|
|||||||
|
|
||||||
PyObject *PyC_ExceptionBuffer_Simple(void)
|
PyObject *PyC_ExceptionBuffer_Simple(void)
|
||||||
{
|
{
|
||||||
PyObject *string_io_buf = NULL;
|
|
||||||
|
|
||||||
PyObject *error_type, *error_value, *error_traceback;
|
|
||||||
|
|
||||||
if (!PyErr_Occurred()) {
|
if (!PyErr_Occurred()) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
PyErr_Fetch(&error_type, &error_value, &error_traceback);
|
PyObject *string_io_buf = NULL;
|
||||||
|
|
||||||
if (error_value == NULL) {
|
PyObject *error_type, *error_value, *error_traceback;
|
||||||
return NULL;
|
|
||||||
}
|
PyErr_Fetch(&error_type, &error_value, &error_traceback);
|
||||||
|
|
||||||
if (PyErr_GivenExceptionMatches(error_type, PyExc_SyntaxError)) {
|
if (PyErr_GivenExceptionMatches(error_type, PyExc_SyntaxError)) {
|
||||||
/* Special exception for syntax errors,
|
/* Special exception for syntax errors,
|
||||||
@ -959,7 +960,6 @@ PyObject *PyC_ExceptionBuffer_Simple(void)
|
|||||||
|
|
||||||
PyErr_Restore(error_type, error_value, error_traceback);
|
PyErr_Restore(error_type, error_value, error_traceback);
|
||||||
|
|
||||||
PyErr_Clear();
|
|
||||||
return string_io_buf;
|
return string_io_buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,6 +38,8 @@ bool BPy_errors_to_report_ex(struct ReportList *reports,
|
|||||||
* BKE_reports_print(reports);
|
* BKE_reports_print(reports);
|
||||||
* }
|
* }
|
||||||
* \endcode
|
* \endcode
|
||||||
|
*
|
||||||
|
* \note The caller is responsible for clearing the error (see #PyErr_Clear).
|
||||||
*/
|
*/
|
||||||
bool BPy_errors_to_report(struct ReportList *reports);
|
bool BPy_errors_to_report(struct ReportList *reports);
|
||||||
|
|
||||||
|
@ -128,9 +128,6 @@ static bool python_script_exec(bContext *C,
|
|||||||
Py_DECREF(filepath_dummy_py);
|
Py_DECREF(filepath_dummy_py);
|
||||||
|
|
||||||
if (PyErr_Occurred()) {
|
if (PyErr_Occurred()) {
|
||||||
if (do_jump) {
|
|
||||||
python_script_error_jump_text(text, filepath_dummy);
|
|
||||||
}
|
|
||||||
BPY_text_free_code(text);
|
BPY_text_free_code(text);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -184,6 +181,7 @@ static bool python_script_exec(bContext *C,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!py_result) {
|
if (!py_result) {
|
||||||
|
BPy_errors_to_report(reports);
|
||||||
if (text) {
|
if (text) {
|
||||||
if (do_jump) {
|
if (do_jump) {
|
||||||
/* ensure text is valid before use, the script may have freed itself */
|
/* ensure text is valid before use, the script may have freed itself */
|
||||||
@ -193,7 +191,7 @@ static bool python_script_exec(bContext *C,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
BPy_errors_to_report(reports);
|
PyErr_Clear();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Py_DECREF(py_result);
|
Py_DECREF(py_result);
|
||||||
@ -275,6 +273,7 @@ static bool bpy_run_string_impl(bContext *C,
|
|||||||
ReportList reports;
|
ReportList reports;
|
||||||
BKE_reports_init(&reports, RPT_STORE);
|
BKE_reports_init(&reports, RPT_STORE);
|
||||||
BPy_errors_to_report(&reports);
|
BPy_errors_to_report(&reports);
|
||||||
|
PyErr_Clear();
|
||||||
|
|
||||||
/* Ensure the reports are printed. */
|
/* Ensure the reports are printed. */
|
||||||
if (!BKE_reports_print_test(&reports, RPT_ERROR)) {
|
if (!BKE_reports_print_test(&reports, RPT_ERROR)) {
|
||||||
@ -336,6 +335,7 @@ static void run_string_handle_error(struct BPy_RunErrInfo *err_info)
|
|||||||
PyObject *py_err_str = err_info->use_single_line_error ? PyC_ExceptionBuffer_Simple() :
|
PyObject *py_err_str = err_info->use_single_line_error ? PyC_ExceptionBuffer_Simple() :
|
||||||
PyC_ExceptionBuffer();
|
PyC_ExceptionBuffer();
|
||||||
const char *err_str = py_err_str ? PyUnicode_AsUTF8(py_err_str) : "Unable to extract exception";
|
const char *err_str = py_err_str ? PyUnicode_AsUTF8(py_err_str) : "Unable to extract exception";
|
||||||
|
PyErr_Clear();
|
||||||
|
|
||||||
if (err_info->reports != NULL) {
|
if (err_info->reports != NULL) {
|
||||||
if (err_info->report_prefix) {
|
if (err_info->report_prefix) {
|
||||||
|
@ -4111,6 +4111,8 @@ StructRNA *pointer_type_from_py(PyObject *value, const char *error_prefix)
|
|||||||
if (PyErr_Occurred()) {
|
if (PyErr_Occurred()) {
|
||||||
PyObject *msg = PyC_ExceptionBuffer();
|
PyObject *msg = PyC_ExceptionBuffer();
|
||||||
const char *msg_char = PyUnicode_AsUTF8(msg);
|
const char *msg_char = PyUnicode_AsUTF8(msg);
|
||||||
|
PyErr_Clear();
|
||||||
|
|
||||||
PyErr_Format(
|
PyErr_Format(
|
||||||
PyExc_TypeError, "%.200s expected an RNA type, failed with: %s", error_prefix, msg_char);
|
PyExc_TypeError, "%.200s expected an RNA type, failed with: %s", error_prefix, msg_char);
|
||||||
Py_DECREF(msg);
|
Py_DECREF(msg);
|
||||||
|
@ -2051,6 +2051,7 @@ static int pyrna_py_to_prop(
|
|||||||
&itemptr, item, true, "Converting a Python list to an RNA collection") == -1) {
|
&itemptr, item, true, "Converting a Python list to an RNA collection") == -1) {
|
||||||
PyObject *msg = PyC_ExceptionBuffer();
|
PyObject *msg = PyC_ExceptionBuffer();
|
||||||
const char *msg_char = PyUnicode_AsUTF8(msg);
|
const char *msg_char = PyUnicode_AsUTF8(msg);
|
||||||
|
PyErr_Clear();
|
||||||
|
|
||||||
PyErr_Format(PyExc_TypeError,
|
PyErr_Format(PyExc_TypeError,
|
||||||
"%.200s %.200s.%.200s error converting a member of a collection "
|
"%.200s %.200s.%.200s error converting a member of a collection "
|
||||||
|
@ -165,6 +165,10 @@ finally:
|
|||||||
bool python_script_error_jump(
|
bool python_script_error_jump(
|
||||||
const char *filepath, int *r_lineno, int *r_offset, int *r_lineno_end, int *r_offset_end)
|
const char *filepath, int *r_lineno, int *r_offset, int *r_lineno_end, int *r_offset_end)
|
||||||
{
|
{
|
||||||
|
/* WARNING(@campbellbarton): The normalized exception is restored (loosing line number info).
|
||||||
|
* Ideally this would leave the exception state as it found it, but that needs to be done
|
||||||
|
* carefully with regards to reference counting, see: T97731. */
|
||||||
|
|
||||||
bool success = false;
|
bool success = false;
|
||||||
PyObject *exception, *value;
|
PyObject *exception, *value;
|
||||||
PyTracebackObject *tb;
|
PyTracebackObject *tb;
|
||||||
|
Loading…
Reference in New Issue
Block a user