python: Fix error handling for callbacks.

This commit is contained in:
Martin Ling 2014-11-11 21:04:44 +00:00 committed by Uwe Hermann
parent f0c0dab5a9
commit 75fb30365e
1 changed files with 53 additions and 3 deletions

View File

@ -173,15 +173,29 @@ typedef guint pyg_flags_type;
Py_XDECREF(arglist); Py_XDECREF(arglist);
Py_XDECREF(revents_obj); Py_XDECREF(revents_obj);
if (PyErr_Occurred() || !PyBool_Check(result)) bool completed = !PyErr_Occurred();
throw sigrok::Error(SR_ERR);
bool retval = (result == Py_True); if (!completed)
PyErr_Print();
bool valid_result = (completed && PyBool_Check(result));
if (completed && !valid_result)
{
PyErr_SetString(PyExc_TypeError,
"EventSource callback did not return a boolean");
PyErr_Print();
}
bool retval = (valid_result && result == Py_True);
Py_XDECREF(result); Py_XDECREF(result);
PyGILState_Release(gstate); PyGILState_Release(gstate);
if (!valid_result)
throw sigrok::Error(SR_ERR);
return retval; return retval;
}; };
@ -212,9 +226,27 @@ typedef guint pyg_flags_type;
Py_XDECREF(arglist); Py_XDECREF(arglist);
Py_XDECREF(log_obj); Py_XDECREF(log_obj);
Py_XDECREF(string_obj); Py_XDECREF(string_obj);
bool completed = !PyErr_Occurred();
if (!completed)
PyErr_Print();
bool valid_result = (completed && result == Py_None);
Py_XDECREF(result); Py_XDECREF(result);
if (completed && !valid_result)
{
PyErr_SetString(PyExc_TypeError,
"Log callback did not return None");
PyErr_Print();
}
PyGILState_Release(gstate); PyGILState_Release(gstate);
if (!valid_result)
throw sigrok::Error(SR_ERR);
}; };
Py_XINCREF($input); Py_XINCREF($input);
@ -248,9 +280,27 @@ typedef guint pyg_flags_type;
Py_XDECREF(arglist); Py_XDECREF(arglist);
Py_XDECREF(device_obj); Py_XDECREF(device_obj);
Py_XDECREF(packet_obj); Py_XDECREF(packet_obj);
bool completed = !PyErr_Occurred();
if (!completed)
PyErr_Print();
bool valid_result = (completed && result == Py_None);
Py_XDECREF(result); Py_XDECREF(result);
if (completed && !valid_result)
{
PyErr_SetString(PyExc_TypeError,
"Datafeed callback did not return None");
PyErr_Print();
}
PyGILState_Release(gstate); PyGILState_Release(gstate);
if (!valid_result)
throw sigrok::Error(SR_ERR);
}; };
Py_XINCREF($input); Py_XINCREF($input);