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:
parent
52f8412a46
commit
9a8ebbb998
6 changed files with 207 additions and 37 deletions
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue