Throw SWIG_CException from C++ wrappers automatically

Check for the pending exception after every call to a wrapper function
not marked "noexcept" and throw a C++ exception if necessary.

Add C++ version of the exception example to show how this works.

Also change SWIG_CException to use member functions for checking for and
resetting pending exceptions, this seems better than having separate
functions for it and will make it easier to customize exception handling
later by just replacing SWIG_CException class with something else.

Note that we still use a global (and not a member) function for raising
the exception, but this one is not exported at all, and needs to be a
function in order to be easily callable from other modules (see the
upcoming commit).
This commit is contained in:
Vadim Zeitlin 2021-11-25 01:43:25 +01:00
commit 9a8ebbb998
6 changed files with 207 additions and 37 deletions

View file

@ -7,38 +7,38 @@ int main() {
exception_order_A* a = exception_order_A_new();
exception_order_A_foo(a);
if (!exception_order_SWIG_PendingException_get()) {
if (!exception_order_SWIG_CException_get_pending()) {
fprintf(stderr, "foo: bad exception order\n");
} else {
exception_order_SWIG_PendingException_reset();
exception_order_SWIG_CException_reset_pending();
}
exception_order_A_bar(a);
if (!exception_order_SWIG_PendingException_get()) {
if (!exception_order_SWIG_CException_get_pending()) {
fprintf(stderr, "bar: bad exception order\n");
} else {
exception_order_SWIG_PendingException_reset();
exception_order_SWIG_CException_reset_pending();
}
exception_order_A_foobar(a);
if (!exception_order_SWIG_PendingException_get()) {
if (!exception_order_SWIG_CException_get_pending()) {
fprintf(stderr, "foobar: bad exception order\n");
} else {
exception_order_SWIG_PendingException_reset();
exception_order_SWIG_CException_reset_pending();
}
exception_order_A_barfoo(a, 1);
if (!exception_order_SWIG_PendingException_get()) {
if (!exception_order_SWIG_CException_get_pending()) {
fprintf(stderr, "barfoo(1): bad exception order\n");
} else {
exception_order_SWIG_PendingException_reset();
exception_order_SWIG_CException_reset_pending();
}
exception_order_A_barfoo(a, 2);
if (!exception_order_SWIG_PendingException_get()) {
if (!exception_order_SWIG_CException_get_pending()) {
fprintf(stderr, "barfoo(2): bad exception order\n");
} else {
exception_order_SWIG_PendingException_reset();
exception_order_SWIG_CException_reset_pending();
}
exit(0);