Fix exception handling when %catches is used in C#
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@11583 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
d74b680a79
commit
4516c1d3f3
8 changed files with 163 additions and 23 deletions
|
|
@ -1,6 +1,9 @@
|
||||||
Version 1.3.40 (in progress)
|
Version 1.3.40 (in progress)
|
||||||
============================
|
============================
|
||||||
|
|
||||||
|
2009-08-16: wsfulton
|
||||||
|
[C#] Fix exception handling when %catches is used, reported by Juan Manuel Alvarez.
|
||||||
|
|
||||||
2009-08-15: wsfulton
|
2009-08-15: wsfulton
|
||||||
Fix %template seg fault on some cases of overloading the templated method.
|
Fix %template seg fault on some cases of overloading the templated method.
|
||||||
Bug reported by Jan Kupec.
|
Bug reported by Jan Kupec.
|
||||||
|
|
@ -128,8 +131,8 @@ Version 1.3.40 (in progress)
|
||||||
Fix -Wallkw option as reported by Solomon Gibbs.
|
Fix -Wallkw option as reported by Solomon Gibbs.
|
||||||
|
|
||||||
2009-07-02: wsfulton
|
2009-07-02: wsfulton
|
||||||
Fix syntax error when a nested struct contains a comment containing a * followed eventually by a /.
|
Fix syntax error when a nested struct contains a comment containing a * followed
|
||||||
Regression from 1.3.37, reported by Solomon Gibbs.
|
eventually by a /. Regression from 1.3.37, reported by Solomon Gibbs.
|
||||||
|
|
||||||
2009-07-01: vmiklos
|
2009-07-01: vmiklos
|
||||||
[PHP] Unknown properties are no longer ignored in proxy
|
[PHP] Unknown properties are no longer ignored in proxy
|
||||||
|
|
|
||||||
33
Examples/test-suite/catches.i
Normal file
33
Examples/test-suite/catches.i
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
%module catches
|
||||||
|
|
||||||
|
%{
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#pragma warning(disable: 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
|
||||||
|
#endif
|
||||||
|
%}
|
||||||
|
|
||||||
|
%include <exception.i> // for throws(...) typemap
|
||||||
|
|
||||||
|
%catches(int, const char *, const ThreeException&) test_catches(int i);
|
||||||
|
%catches(int, ...) test_exception_specification(int i); // override the exception specification
|
||||||
|
%catches(...) test_catches_all(int i);
|
||||||
|
|
||||||
|
%inline %{
|
||||||
|
struct ThreeException {};
|
||||||
|
void test_catches(int i) {
|
||||||
|
if (i == 1) {
|
||||||
|
throw int(1);
|
||||||
|
} else if (i == 2) {
|
||||||
|
throw (const char *)"two";
|
||||||
|
} else if (i == 3) {
|
||||||
|
throw ThreeException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void test_exception_specification(int i) throw(int, const char *, const ThreeException&) {
|
||||||
|
test_catches(i);
|
||||||
|
}
|
||||||
|
void test_catches_all(int i) {
|
||||||
|
test_catches(i);
|
||||||
|
}
|
||||||
|
%}
|
||||||
|
|
||||||
|
|
@ -117,6 +117,7 @@ CPP_TEST_CASES += \
|
||||||
arrays_scope \
|
arrays_scope \
|
||||||
bloody_hell \
|
bloody_hell \
|
||||||
bools \
|
bools \
|
||||||
|
catches \
|
||||||
cast_operator \
|
cast_operator \
|
||||||
casts \
|
casts \
|
||||||
char_strings \
|
char_strings \
|
||||||
|
|
|
||||||
66
Examples/test-suite/csharp/catches_runme.cs
Normal file
66
Examples/test-suite/csharp/catches_runme.cs
Normal file
|
|
@ -0,0 +1,66 @@
|
||||||
|
using System;
|
||||||
|
using catchesNamespace;
|
||||||
|
|
||||||
|
public class runme {
|
||||||
|
static void Main() {
|
||||||
|
// test_catches()
|
||||||
|
try {
|
||||||
|
catches.test_catches(1);
|
||||||
|
throw new Exception("missed exception");
|
||||||
|
} catch (ApplicationException e) {
|
||||||
|
if (e.Message != "C++ int exception thrown, value: 1")
|
||||||
|
throw new ApplicationException("bad exception order: " + e.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
catches.test_catches(2);
|
||||||
|
throw new Exception("missed exception");
|
||||||
|
} catch (ApplicationException e) {
|
||||||
|
if (e.Message != "two")
|
||||||
|
throw new ApplicationException("bad exception order: " + e.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
catches.test_catches(3);
|
||||||
|
throw new Exception("missed exception");
|
||||||
|
} catch (ApplicationException e) {
|
||||||
|
if (e.Message != "C++ ThreeException const & exception thrown")
|
||||||
|
throw new ApplicationException("bad exception order: " + e.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
// test_exception_specification()
|
||||||
|
try {
|
||||||
|
catches.test_exception_specification(1);
|
||||||
|
throw new Exception("missed exception");
|
||||||
|
} catch (ApplicationException e) {
|
||||||
|
if (e.Message != "C++ int exception thrown, value: 1")
|
||||||
|
throw new ApplicationException("bad exception order: " + e.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
catches.test_exception_specification(2);
|
||||||
|
throw new Exception("missed exception");
|
||||||
|
} catch (ApplicationException e) {
|
||||||
|
if (e.Message != "unknown exception")
|
||||||
|
throw new ApplicationException("bad exception order: " + e.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
catches.test_exception_specification(3);
|
||||||
|
throw new Exception("missed exception");
|
||||||
|
} catch (ApplicationException e) {
|
||||||
|
if (e.Message != "unknown exception")
|
||||||
|
throw new ApplicationException("bad exception order: " + e.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
// test_catches_all()
|
||||||
|
try {
|
||||||
|
catches.test_catches_all(1);
|
||||||
|
throw new Exception("missed exception");
|
||||||
|
} catch (ApplicationException e) {
|
||||||
|
if (e.Message != "unknown exception")
|
||||||
|
throw new ApplicationException("bad exception order: " + e.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
48
Examples/test-suite/csharp/exception_order_runme.cs
Normal file
48
Examples/test-suite/csharp/exception_order_runme.cs
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
using System;
|
||||||
|
using exception_orderNamespace;
|
||||||
|
|
||||||
|
public class runme {
|
||||||
|
static void Main() {
|
||||||
|
A a = new A();
|
||||||
|
|
||||||
|
try {
|
||||||
|
a.foo();
|
||||||
|
throw new Exception("missed exception");
|
||||||
|
} catch (ApplicationException e) {
|
||||||
|
if (e.Message != "C++ E1 exception thrown")
|
||||||
|
throw new ApplicationException("bad exception order: " + e.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
a.bar();
|
||||||
|
throw new Exception("missed exception");
|
||||||
|
} catch (ApplicationException e) {
|
||||||
|
if (e.Message != "C++ E2 exception thrown")
|
||||||
|
throw new ApplicationException("bad exception order: " + e.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
a.foobar();
|
||||||
|
throw new Exception("missed exception");
|
||||||
|
} catch (ApplicationException e) {
|
||||||
|
if (e.Message != "postcatch unknown")
|
||||||
|
throw new ApplicationException("bad exception order: " + e.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
a.barfoo(1);
|
||||||
|
throw new Exception("missed exception");
|
||||||
|
} catch (ApplicationException e) {
|
||||||
|
if (e.Message != "C++ E1 exception thrown")
|
||||||
|
throw new ApplicationException("bad exception order: " + e.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
a.barfoo(2);
|
||||||
|
throw new Exception("missed exception");
|
||||||
|
} catch (ApplicationException e) {
|
||||||
|
if (e.Message != "C++ E2 * exception thrown")
|
||||||
|
throw new ApplicationException("bad exception order: " + e.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -262,9 +262,15 @@ SWIGINTERN void SWIG_CSharpException(int code, const char *msg) {
|
||||||
|
|
||||||
/* rethrow the unknown exception */
|
/* rethrow the unknown exception */
|
||||||
|
|
||||||
|
#ifdef SWIGCSHARP
|
||||||
|
%typemap(throws,noblock=1, canthrow=1) (...) {
|
||||||
|
SWIG_exception(SWIG_RuntimeError,"unknown exception");
|
||||||
|
}
|
||||||
|
#else
|
||||||
%typemap(throws,noblock=1) (...) {
|
%typemap(throws,noblock=1) (...) {
|
||||||
SWIG_exception(SWIG_RuntimeError,"unknown exception");
|
SWIG_exception(SWIG_RuntimeError,"unknown exception");
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -527,8 +527,7 @@ class Allocate:public Dispatcher {
|
||||||
}
|
}
|
||||||
ParmList *throws = Getattr(n, "throws");
|
ParmList *throws = Getattr(n, "throws");
|
||||||
if (throws) {
|
if (throws) {
|
||||||
/* if there is no an explicit catchlist,
|
/* if there is no explicit catchlist, we catch everything in the throws list */
|
||||||
we catch everything in the throwlist */
|
|
||||||
if (!catchlist) {
|
if (!catchlist) {
|
||||||
Setattr(n, "catchlist", throws);
|
Setattr(n, "catchlist", throws);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -898,9 +898,9 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get any C# exception classes in the throws typemap
|
// Look for usage of throws typemap and the canthrow flag
|
||||||
ParmList *throw_parm_list = NULL;
|
ParmList *throw_parm_list = NULL;
|
||||||
if ((throw_parm_list = Getattr(n, "throws"))) {
|
if ((throw_parm_list = Getattr(n, "catchlist"))) {
|
||||||
Swig_typemap_attach_parms("throws", throw_parm_list, f);
|
Swig_typemap_attach_parms("throws", throw_parm_list, f);
|
||||||
for (p = throw_parm_list; p; p = nextSibling(p)) {
|
for (p = throw_parm_list; p; p = nextSibling(p)) {
|
||||||
if ((tm = Getattr(p, "tmap:throws"))) {
|
if ((tm = Getattr(p, "tmap:throws"))) {
|
||||||
|
|
@ -3063,13 +3063,6 @@ public:
|
||||||
return tm;
|
return tm;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
|
||||||
* addThrows()
|
|
||||||
// TODO: remove
|
|
||||||
* ----------------------------------------------------------------------------- */
|
|
||||||
void addThrows(Node *, const String *, Node *) {
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
/* -----------------------------------------------------------------------------
|
||||||
* canThrow()
|
* canThrow()
|
||||||
* Determine whether the code in the typemap can throw a C# exception.
|
* Determine whether the code in the typemap can throw a C# exception.
|
||||||
|
|
@ -3417,10 +3410,6 @@ public:
|
||||||
|
|
||||||
Printf(arg, "j%s", ln);
|
Printf(arg, "j%s", ln);
|
||||||
|
|
||||||
/* Add various typemap's 'throws' clauses */
|
|
||||||
addThrows(n, "tmap:directorin", p);
|
|
||||||
addThrows(n, "tmap:out", p);
|
|
||||||
|
|
||||||
/* And add to the upcall args */
|
/* And add to the upcall args */
|
||||||
if (gencomma > 0)
|
if (gencomma > 0)
|
||||||
Printf(jupcall_args, ", ");
|
Printf(jupcall_args, ", ");
|
||||||
|
|
@ -3549,9 +3538,8 @@ public:
|
||||||
Printf(declaration, " virtual %s", target);
|
Printf(declaration, " virtual %s", target);
|
||||||
Delete(target);
|
Delete(target);
|
||||||
|
|
||||||
// Get any Java exception classes in the throws typemap
|
// Add any exception specifications to the methods in the director class
|
||||||
ParmList *throw_parm_list = NULL;
|
ParmList *throw_parm_list = NULL;
|
||||||
|
|
||||||
if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) {
|
if ((throw_parm_list = Getattr(n, "throws")) || Getattr(n, "throw")) {
|
||||||
int gencomma = 0;
|
int gencomma = 0;
|
||||||
|
|
||||||
|
|
@ -3562,13 +3550,10 @@ public:
|
||||||
Swig_typemap_attach_parms("throws", throw_parm_list, 0);
|
Swig_typemap_attach_parms("throws", throw_parm_list, 0);
|
||||||
for (p = throw_parm_list; p; p = nextSibling(p)) {
|
for (p = throw_parm_list; p; p = nextSibling(p)) {
|
||||||
if ((tm = Getattr(p, "tmap:throws"))) {
|
if ((tm = Getattr(p, "tmap:throws"))) {
|
||||||
addThrows(n, "tmap:throws", p);
|
|
||||||
|
|
||||||
if (gencomma++) {
|
if (gencomma++) {
|
||||||
Append(w->def, ", ");
|
Append(w->def, ", ");
|
||||||
Append(declaration, ", ");
|
Append(declaration, ", ");
|
||||||
}
|
}
|
||||||
|
|
||||||
Printf(w->def, "%s", SwigType_str(Getattr(p, "type"), 0));
|
Printf(w->def, "%s", SwigType_str(Getattr(p, "type"), 0));
|
||||||
Printf(declaration, "%s", SwigType_str(Getattr(p, "type"), 0));
|
Printf(declaration, "%s", SwigType_str(Getattr(p, "type"), 0));
|
||||||
}
|
}
|
||||||
|
|
@ -3621,7 +3606,6 @@ public:
|
||||||
|
|
||||||
/* Copy jresult into c_result... */
|
/* Copy jresult into c_result... */
|
||||||
if ((tm = Swig_typemap_lookup("directorout", tp, result_str, w))) {
|
if ((tm = Swig_typemap_lookup("directorout", tp, result_str, w))) {
|
||||||
addThrows(n, "tmap:directorout", tp);
|
|
||||||
Replaceall(tm, "$input", jresult_str);
|
Replaceall(tm, "$input", jresult_str);
|
||||||
Replaceall(tm, "$result", result_str);
|
Replaceall(tm, "$result", result_str);
|
||||||
Printf(w->code, "%s\n", tm);
|
Printf(w->code, "%s\n", tm);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue