From 5bfe0452622388d14b039bc8fb7662f0b259dd46 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 7 Mar 2018 11:05:08 -0500 Subject: [PATCH] Fix throwing of exceptions from Python to JS --- src/python2js.cpp | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/python2js.cpp b/src/python2js.cpp index f282a37a3..673bcf88e 100644 --- a/src/python2js.cpp +++ b/src/python2js.cpp @@ -10,7 +10,8 @@ val pythonExcToJs() { PyObject *type; PyObject *value; PyObject *traceback; - + bool no_traceback = false; + PyErr_Fetch(&type, &value, &traceback); PyErr_NormalizeException(&type, &value, &traceback); @@ -20,15 +21,27 @@ val pythonExcToJs() { if (tbmod == NULL) { excval = val("Couldn't get traceback module"); } else { - PyObject *format_exception = PyObject_GetAttrString(tbmod, "format_exception"); + PyObject *format_exception; + if (traceback == NULL || traceback == Py_None) { + no_traceback = true; + format_exception = PyObject_GetAttrString(tbmod, "format_exception_only"); + } else { + format_exception = PyObject_GetAttrString(tbmod, "format_exception"); + } if (format_exception == NULL) { excval = val("Couldn't get format_exception function"); } else { - PyObject *pylines = PyObject_CallFunctionObjArgs - (format_exception, type, value, traceback, NULL); - PyErr_Print(); + PyObject *pylines; + if (no_traceback) { + pylines = PyObject_CallFunctionObjArgs + (format_exception, type, value, NULL); + } else { + pylines = PyObject_CallFunctionObjArgs + (format_exception, type, value, traceback, NULL); + } if (pylines == NULL) { excval = val("Error calling traceback.format_exception"); + PyErr_Print(); } else { PyObject *newline = PyUnicode_FromString("\n"); PyObject *pystr = PyUnicode_Join(newline, pylines); @@ -42,12 +55,13 @@ val pythonExcToJs() { Py_DECREF(tbmod); } - val Error = val::global("Error"); - val exc = Error.new_(excval); + val exc = val::global("Error").new_(excval); Py_DECREF(type); Py_DECREF(value); - Py_DECREF(traceback); + Py_XDECREF(traceback); + + PyErr_Clear(); return exc; }