swig/Examples/test-suite/csharp_exceptions.i
William S Fulton 3bfe544083 more c# exception tests
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@6957 626c5289-ae23-0410-ae9c-e8d60b6d4f22
2005-02-15 22:29:44 +00:00

157 lines
4.1 KiB
OpenEdge ABL

%module csharp_exceptions
%include "exception.i"
%inline %{
class Ex {
const char *message;
public:
Ex(const char *msg) : message(msg) {}
const char *what() { return message; }
};
%}
%exception ThrowByValue() {
try {
$action
} catch(Ex e) {
SWIG_exception(SWIG_DivisionByZero, e.what());
}
}
%exception ThrowByReference() {
try {
$action
} catch(Ex &e) {
SWIG_exception(SWIG_DivisionByZero, e.what());
}
}
%csnothrowexception NoThrowException() {
try {
$action
} catch(Ex e) {
// swallowed
}
}
%inline %{
// %exception tests
void ThrowByValue() { throw Ex("ThrowByValue"); }
void ThrowByReference() { throw Ex("ThrowByReference"); }
// %csnothrowexception
void NoThrowException() { throw Ex("NoThrowException"); }
// exception specifications
void ExceptionSpecificationValue() throw(Ex) { throw Ex("ExceptionSpecificationValue"); }
void ExceptionSpecificationReference() throw(Ex&) { throw Ex("ExceptionSpecificationReference"); }
void ExceptionSpecificationString() throw(const char *) { throw "ExceptionSpecificationString"; }
void ExceptionSpecificationInteger() throw(int) { throw 20; }
%}
// test exceptions in the default typemaps
// null reference exceptions
%inline %{
void NullReference(Ex& e) {}
void NullValue(Ex e) {}
%}
// enums
%inline %{
enum TestEnum {TestEnumItem};
void ExceptionSpecificationEnumValue() throw(TestEnum) { throw TestEnumItem; }
void ExceptionSpecificationEnumReference() throw(TestEnum&) { throw TestEnumItem; }
%}
// std::string
%include "std_string.i"
%inline %{
void ExceptionSpecificationStdStringValue() throw(std::string) { throw std::string("ExceptionSpecificationStdStringValue"); }
void ExceptionSpecificationStdStringReference() throw(const std::string&) { throw std::string("ExceptionSpecificationStdStringReference"); }
void NullStdStringValue(std::string s) {}
void NullStdStringReference(std::string &s) {}
%}
// Memory leak check (The C++ exception stack was never unwound in the original approach to throwing exceptions from unmanaged code)
%exception MemoryLeakCheck() {
Counter destructor_should_be_called;
try {
$action
} catch(Ex e) {
SWIG_exception(SWIG_DivisionByZero, e.what());
}
}
%inline %{
struct Counter {
static int count;
Counter() { count++; }
~Counter() { count--; }
};
int Counter::count = 0;
void MemoryLeakCheck() {
throw Ex("testing memory leaks when throwing exceptions");
}
%}
// test exception pending in the csconstruct typemap
%inline %{
struct constructor {
constructor(std::string s) {}
constructor() throw(int) { throw 10; }
};
%}
// test exception pending in the csout typemaps
%typemap(out, canthrow=1) unsigned short ushorttest %{
$result = $1;
if ($result == 100) {
SWIG_CSharpSetPendingException(SWIG_CSharpIndexOutOfRangeException, "don't like 100");
return $null;
}
%}
%inline %{
unsigned short ushorttest() { return 100; }
%}
// test exception pending in the csvarout/csvarin typemaps and canthrow attribute in unmanaged code typemaps
%typemap(check, canthrow=1) int numberin, int InOutStruct::staticnumberin %{
if ($1 < 0) {
SWIG_CSharpSetPendingException(SWIG_CSharpIndexOutOfRangeException, "too small");
return $null;
}
%}
%typemap(out, canthrow=1) int numberout, int InOutStruct::staticnumberout %{
$result = $1;
if ($result > 10) {
SWIG_CSharpSetPendingException(SWIG_CSharpIndexOutOfRangeException, "too big");
return $null;
}
%}
%inline %{
int numberin;
int numberout;
struct InOutStruct {
int numberin;
int numberout;
static int staticnumberin;
static int staticnumberout;
};
int InOutStruct::staticnumberin;
int InOutStruct::staticnumberout;
%}
// test SWIG_exception macro - it must return from unmanaged code without executing any further unmanaged code
%typemap(check, canthrow=1) int macrotest %{
if ($1 < 0) {
SWIG_exception(SWIG_IndexError, "testing SWIG_exception macro");
return $null;
}
%}
%inline %{
bool exception_macro_run_flag = false;
void exceptionmacrotest(int macrotest) {
exception_macro_run_flag = true;
}
%}