From b446a6b9160d73ac1baa0f5d83c495d809e0d0fd Mon Sep 17 00:00:00 2001 From: Volodymyr Shymanskyy Date: Wed, 31 Mar 2021 21:50:03 +0300 Subject: [PATCH] Forward exceptions from imported function --- platforms/python/MANIFEST.in | 2 +- platforms/python/m3module.c | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/platforms/python/MANIFEST.in b/platforms/python/MANIFEST.in index 6154527..68b36bf 100644 --- a/platforms/python/MANIFEST.in +++ b/platforms/python/MANIFEST.in @@ -1,3 +1,3 @@ -graft m3/ +graft m3 include README.md include LICENSE diff --git a/platforms/python/m3module.c b/platforms/python/m3module.c index 6ad08ca..361cc0c 100644 --- a/platforms/python/m3module.c +++ b/platforms/python/m3module.c @@ -238,6 +238,8 @@ m3ApiRawFunction(metering_usegas) m3ApiSuccess(); } +static const char* trapException = "function raised exception"; + m3ApiRawFunction(CallImport) { PyObject *pFunc = (PyObject *)(_ctx->userdata); @@ -255,7 +257,7 @@ m3ApiRawFunction(CallImport) } PyObject * pRets = PyObject_CallObject(pFunc, pArgs); - if (!pRets) m3ApiTrap("python call: function raised exception"); + if (!pRets) m3ApiTrap(trapException); if (PyTuple_Check(pRets)) { if (PyTuple_GET_SIZE(pRets) != nRets) { @@ -382,7 +384,9 @@ M3_Function_call_argv(m3_function *func, PyObject *args) argv[i] = PyUnicode_AsUTF8(PyTuple_GET_ITEM(args, i)); } M3Result err = m3_CallArgv(func->f, size, argv); - if (err) { + if (err == trapException) { + return NULL; + } else if (err) { return formatError(PyExc_RuntimeError, func->r, err); } @@ -414,7 +418,9 @@ M3_Function_call(m3_function *self, PyObject *args, PyObject *kwargs) } M3Result err = m3_Call (f, nArgs, valptrs); - if (err) { + if (err == trapException) { + return NULL; + } else if (err) { return formatError(PyExc_RuntimeError, self->r, err); }