diff --git a/src/qpython.cpp b/src/qpython.cpp index 72c6885..4cefcad 100644 --- a/src/qpython.cpp +++ b/src/qpython.cpp @@ -186,7 +186,15 @@ QPython::call_sync(QString func, QVariant args) QVariant v; PyObject *argl = convertQVariantToPyObject(args); - assert(PyList_Check(argl)); + if (!PyList_Check(argl)) { + Py_DECREF(callable); + Py_XDECREF(argl); + emit error(QString("Not a parameter list in call to %1: %2") + .arg(func).arg(args.toString())); + priv->leave(); + return QVariant(); + } + PyObject *argt = PyList_AsTuple(argl); Py_DECREF(argl); PyObject *o = PyObject_Call(callable, argt, NULL); diff --git a/tests/test_callparam/test_callparam.qml b/tests/test_callparam/test_callparam.qml new file mode 100644 index 0000000..49ec12f --- /dev/null +++ b/tests/test_callparam/test_callparam.qml @@ -0,0 +1,27 @@ +import QtQuick 2.0 +import io.thp.pyotherside 1.0 + +Rectangle { + id: page + width: 300 + height: 300 + + Python { + Component.onCompleted: { + // We use call_sync() instead of call() in order + // to guarantee the right ordering of Python's output + // and the output of the JS engine for the error + + // This should fail with an error: + // "Not a parameter list in call to print: 123" + call_sync('print', 123); + + // This should work and print "123" on the console + call_sync('print', [123]); + } + + onError: { + console.log('Received error: ' + traceback); + } + } +}