From 052290d2b378d8639598b1ca75972a83c9fc41c0 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 23 Nov 2009 18:08:42 +0000 Subject: [PATCH] fixed some error reporting issues with calling operators --- source/blender/python/intern/bpy_operator.c | 2 +- .../blender/python/intern/bpy_operator_wrap.c | 22 ++++++++----------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/source/blender/python/intern/bpy_operator.c b/source/blender/python/intern/bpy_operator.c index 409afee7d7d..c2504ed2c50 100644 --- a/source/blender/python/intern/bpy_operator.c +++ b/source/blender/python/intern/bpy_operator.c @@ -76,7 +76,7 @@ static PyObject *pyop_call( PyObject * self, PyObject * args) Py_XINCREF(context_dict); /* so we done loose it */ if(WM_operator_poll((bContext*)C, ot) == FALSE) { - PyErr_SetString( PyExc_SystemError, "_bpy.ops.call: operator poll() function failed, context is incorrect"); + PyErr_Format( PyExc_SystemError, "_bpy.ops.call: operator %.200s.poll() function failed, context is incorrect", opname); error_val= -1; } else { diff --git a/source/blender/python/intern/bpy_operator_wrap.c b/source/blender/python/intern/bpy_operator_wrap.c index 3789c5b1258..0c0d043c4be 100644 --- a/source/blender/python/intern/bpy_operator_wrap.c +++ b/source/blender/python/intern/bpy_operator_wrap.c @@ -105,7 +105,11 @@ static int PYTHON_OT_generic(int mode, bContext *C, wmOperatorType *ot, wmOperat py_class_instance = PyObject_Call(py_class, args, NULL); Py_DECREF(args); - if (py_class_instance) { /* Initializing the class worked, now run its invoke function */ + if (py_class_instance==NULL) { /* Initializing the class worked, now run its invoke function */ + PyErr_Print(); + PyErr_Clear(); + } + else { RNA_pointer_create(NULL, &RNA_Context, C, &ptr_context); if (mode==PYOP_INVOKE) { @@ -137,10 +141,6 @@ static int PYTHON_OT_generic(int mode, bContext *C, wmOperatorType *ot, wmOperat Py_DECREF(args); Py_DECREF(item); } - else { - PyErr_Print(); - PyErr_Clear(); - } if (ret == NULL) { /* covers py_class_instance failing too */ if(op) @@ -149,9 +149,8 @@ static int PYTHON_OT_generic(int mode, bContext *C, wmOperatorType *ot, wmOperat else { if (mode==PYOP_POLL) { if (PyBool_Check(ret) == 0) { - PyErr_SetString(PyExc_ValueError, "Python poll function return value "); - if(op) - BPy_errors_to_report(op->reports); + PyErr_Format(PyExc_ValueError, "Python operator '%s.poll', did not return a bool value", ot->idname); + BPy_errors_to_report(op ? op->reports:NULL); /* prints and clears if NULL given */ } else { ret_flag= ret==Py_True ? 1:0; @@ -159,11 +158,8 @@ static int PYTHON_OT_generic(int mode, bContext *C, wmOperatorType *ot, wmOperat } else if (BPY_flag_from_seq(pyop_ret_flags, ret, &ret_flag) == -1) { /* the returned value could not be converted into a flag */ - if(op) { - fprintf(stderr, "error using return value from \"%s\"\n", op->idname); // for some reason the error raised doesnt include file:line... this helps - BPy_errors_to_report(op->reports); - } - + PyErr_Format(PyExc_ValueError, "Python operator, error using return value from \"%s\"\n", ot->idname); + BPy_errors_to_report(op ? op->reports:NULL); ret_flag = OPERATOR_CANCELLED; } /* there is no need to copy the py keyword dict modified by