From 090994a1a3cbcfaebc9ab7f934fffb3c0a5ccc07 Mon Sep 17 00:00:00 2001 From: Varun Agrawal Date: Wed, 10 Jul 2019 15:56:07 -0400 Subject: [PATCH 1/2] propagate exceptions from global functions from cpp to python --- wrap/GlobalFunction.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/wrap/GlobalFunction.cpp b/wrap/GlobalFunction.cpp index 13616d64a..02ab19657 100644 --- a/wrap/GlobalFunction.cpp +++ b/wrap/GlobalFunction.cpp @@ -143,6 +143,7 @@ void GlobalFunction::emit_cython_pxd(FileWriter& file) const { "\"("; argumentList(i).emit_cython_pxd(file, "", vector()); file.oss << ")"; + file.oss << " except +"; file.oss << "\n"; } } @@ -206,16 +207,18 @@ void GlobalFunction::emit_cython_pyx(FileWriter& file) const { /// Call corresponding cython function file.oss << argumentList(i).pyx_convertEigenTypeAndStorageOrder(" "); - string call = pyx_functionCall("", pxdName(), i); - if (!returnVals_[i].isVoid()) { - file.oss << " return_value = " << call << "\n"; - file.oss << " return True, " << returnVals_[i].pyx_casting("return_value") << "\n"; - } else { - file.oss << " " << call << "\n"; - file.oss << " return True, None\n"; - } + // catch exception which indicates the parameters passed are incorrect. file.oss << " except:\n"; file.oss << " return False, None\n\n"; + + string call = pyx_functionCall("", pxdName(), i); + if (!returnVals_[i].isVoid()) { + file.oss << " return_value = " << call << "\n"; + file.oss << " return True, " << returnVals_[i].pyx_casting("return_value") << "\n"; + } else { + file.oss << " " << call << "\n"; + file.oss << " return True, None\n"; + } } } /* ************************************************************************* */ From 86323031574316b26968bba8dc62d5929df2ffe9 Mon Sep 17 00:00:00 2001 From: Varun Agrawal Date: Wed, 10 Jul 2019 15:56:32 -0400 Subject: [PATCH 2/2] updated tests to work with new wrap code generation --- wrap/tests/expected-cython/geometry.pxd | 6 +++--- wrap/tests/expected-cython/geometry.pyx | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/wrap/tests/expected-cython/geometry.pxd b/wrap/tests/expected-cython/geometry.pxd index f2cd513e2..0d9adac5f 100644 --- a/wrap/tests/expected-cython/geometry.pxd +++ b/wrap/tests/expected-cython/geometry.pxd @@ -145,7 +145,7 @@ cdef extern from "folder/path/to/Test.h": cdef extern from "folder/path/to/Test.h" namespace "": - VectorXd pxd_aGlobalFunction "aGlobalFunction"() + VectorXd pxd_aGlobalFunction "aGlobalFunction"() except + cdef extern from "folder/path/to/Test.h" namespace "": - VectorXd pxd_overloadedGlobalFunction "overloadedGlobalFunction"(int a) - VectorXd pxd_overloadedGlobalFunction "overloadedGlobalFunction"(int a, double b) + VectorXd pxd_overloadedGlobalFunction "overloadedGlobalFunction"(int a) except + + VectorXd pxd_overloadedGlobalFunction "overloadedGlobalFunction"(int a, double b) except + diff --git a/wrap/tests/expected-cython/geometry.pyx b/wrap/tests/expected-cython/geometry.pyx index cae19d600..606fde3e3 100644 --- a/wrap/tests/expected-cython/geometry.pyx +++ b/wrap/tests/expected-cython/geometry.pyx @@ -464,11 +464,11 @@ def overloadedGlobalFunction_0(args, kwargs): try: __params = process_args(['a'], args, kwargs) a = (__params[0]) - return_value = pxd_overloadedGlobalFunction(a) - return True, ndarray_copy(return_value).squeeze() except: return False, None + return_value = pxd_overloadedGlobalFunction(a) + return True, ndarray_copy(return_value).squeeze() def overloadedGlobalFunction_1(args, kwargs): cdef list __params cdef VectorXd return_value @@ -476,8 +476,8 @@ def overloadedGlobalFunction_1(args, kwargs): __params = process_args(['a', 'b'], args, kwargs) a = (__params[0]) b = (__params[1]) - return_value = pxd_overloadedGlobalFunction(a, b) - return True, ndarray_copy(return_value).squeeze() except: return False, None + return_value = pxd_overloadedGlobalFunction(a, b) + return True, ndarray_copy(return_value).squeeze()