On Thu, Apr 05, 2018 at 08:17:00AM -0500, Eric Blake wrote:
On 04/05/2018 07:47 AM, Richard W.M. Jones wrote:
> ---
> configure.ac | 8 +++++++
> plugins/python/python.c | 51 +++++++++++++++++++++++++++++++++++++++---
> tests/Makefile.am | 1 +
> tests/python-exception.py | 45 +++++++++++++++++++++++++++++++++++++
> tests/test-python-exception.sh | 42 ++++++++++++++++++++++++++++++++++
> 5 files changed, 144 insertions(+), 3 deletions(-)
>
> +/* Convert bytes/str/unicode into a string. Caller must free. */
> +static char *
> +python_to_string (PyObject *str)
> +{
> + char *r;
> +
> + if (str) {
> +#ifdef HAVE_PYUNICODE_ASUTF8
> + if (PyUnicode_Check (str)) {
> + r = PyUnicode_AsUTF8 (str);
> + r = strdup (r);
> + return r;
Any simpler to just write:
return strdup (PyUnicode_AsUTF8 (str));
instead of using the temporary variable r?
Yes I can change that. The consequence of multiple refactorings
while I was trying to work out how to convert PyObject to char *
(you'd think that would be easy ...)
> static int
> check_python_failure (const char *callback)
> {
> if (PyErr_Occurred ()) {
> - nbdkit_error ("%s: callback failed: %s", script, callback);
> - /* How to turn this into a string? XXX */
> - PyErr_Print ();
> + PyObject *type, *error, *traceback, *error_str;
> + char *error_cstr;
> +
> + /* Convert the Python exception to a string.
> + *
https://stackoverflow.com/a/1418703
> + * But forget about the traceback, it's very hard to print.
> + *
https://stackoverflow.com/q/1796510
> + */
> + PyErr_Fetch (&type, &error, &traceback);
> + PyErr_NormalizeException (&type, &error, &traceback);
> + error_str = PyObject_Str (error);
> + error_cstr = python_to_string (error_str);
> + nbdkit_error ("%s: %s: error: %s",
> + script, callback, error_cstr ? : "<unknown>");
Okay, not the first use of that gcc extension.
I guess I'll change this one too, it's not a case where we
actually want to avoid a side effect.
Thanks,
Rich.
--
Richard Jones, Virtualization Group, Red Hat
http://people.redhat.com/~rjones
Read my programming and virtualization blog:
http://rwmj.wordpress.com
Fedora Windows cross-compiler. Compile Windows programs, test, and
build Windows installers. Over 100 libraries supported.
http://fedoraproject.org/wiki/MinGW