Don't populate the typenames array for each and every created object and don't search it when deleting every object, this is O(N) in number of classes and is completely impractical for any big library where N can easily be several thousands. Use destructor function which will correctly destroy the object instead. Also don't store each created objects in the global registry, there doesn't seem to be any point in it. And, in fact, don't bother with the typenames at all, just use another pseudo-virtual function for checking whether a class inherits from a class with the given name. There is unfortunately one problem with the new approach: it doesn't work when the same C++ type is wrapped under different names as this results in multiple specializations of SWIG_derives_from<> for this type. But this is a relatively rare situation (but which does arise in template_default2 unit test, which had to be disabled) and could be fixed in the future by completely resolving the type, including the default template parameters values, and checking if SWIG_derives_from had been already specialized for it. In the meanwhile, this regression is not a big deal compared to the advantages of the new approach.
320 lines
8.1 KiB
OpenEdge ABL
320 lines
8.1 KiB
OpenEdge ABL
/* -----------------------------------------------------------------------------
|
|
* exception.i
|
|
*
|
|
* SWIG library file providing language independent exception handling
|
|
* ----------------------------------------------------------------------------- */
|
|
|
|
#if defined(SWIGUTL)
|
|
#error "This version of exception.i should not be used"
|
|
#endif
|
|
|
|
|
|
%insert("runtime") "swigerrors.swg"
|
|
|
|
|
|
#ifdef SWIGPHP
|
|
%{
|
|
#include "zend_exceptions.h"
|
|
#define SWIG_exception(code, msg) zend_throw_exception(NULL, (char*)msg, code TSRMLS_CC)
|
|
%}
|
|
#endif
|
|
|
|
#ifdef SWIGGUILE
|
|
%{
|
|
SWIGINTERN void SWIG_exception_ (int code, const char *msg,
|
|
const char *subr) {
|
|
#define ERROR(scmerr) \
|
|
scm_error(scm_from_locale_string((char *) (scmerr)), \
|
|
(char *) subr, (char *) msg, \
|
|
SCM_EOL, SCM_BOOL_F)
|
|
#define MAP(swigerr, scmerr) \
|
|
case swigerr: \
|
|
ERROR(scmerr); \
|
|
break
|
|
switch (code) {
|
|
MAP(SWIG_MemoryError, "swig-memory-error");
|
|
MAP(SWIG_IOError, "swig-io-error");
|
|
MAP(SWIG_RuntimeError, "swig-runtime-error");
|
|
MAP(SWIG_IndexError, "swig-index-error");
|
|
MAP(SWIG_TypeError, "swig-type-error");
|
|
MAP(SWIG_DivisionByZero, "swig-division-by-zero");
|
|
MAP(SWIG_OverflowError, "swig-overflow-error");
|
|
MAP(SWIG_SyntaxError, "swig-syntax-error");
|
|
MAP(SWIG_ValueError, "swig-value-error");
|
|
MAP(SWIG_SystemError, "swig-system-error");
|
|
default:
|
|
ERROR("swig-error");
|
|
}
|
|
#undef ERROR
|
|
#undef MAP
|
|
}
|
|
|
|
#define SWIG_exception(a,b) SWIG_exception_(a, b, FUNC_NAME)
|
|
%}
|
|
#endif
|
|
|
|
#ifdef SWIGMZSCHEME
|
|
|
|
%{
|
|
SWIGINTERN void SWIG_exception_ (int code, const char *msg) {
|
|
#define ERROR(errname) \
|
|
scheme_signal_error(errname " (%s)", msg);
|
|
#define MAP(swigerr, errname) \
|
|
case swigerr: \
|
|
ERROR(errname); \
|
|
break
|
|
switch (code) {
|
|
MAP(SWIG_MemoryError, "swig-memory-error");
|
|
MAP(SWIG_IOError, "swig-io-error");
|
|
MAP(SWIG_RuntimeError, "swig-runtime-error");
|
|
MAP(SWIG_IndexError, "swig-index-error");
|
|
MAP(SWIG_TypeError, "swig-type-error");
|
|
MAP(SWIG_DivisionByZero, "swig-division-by-zero");
|
|
MAP(SWIG_OverflowError, "swig-overflow-error");
|
|
MAP(SWIG_SyntaxError, "swig-syntax-error");
|
|
MAP(SWIG_ValueError, "swig-value-error");
|
|
MAP(SWIG_SystemError, "swig-system-error");
|
|
default:
|
|
ERROR("swig-error");
|
|
}
|
|
#undef ERROR
|
|
#undef MAP
|
|
}
|
|
|
|
#define SWIG_exception(a,b) SWIG_exception_(a, b)
|
|
%}
|
|
#endif
|
|
|
|
#ifdef SWIGJAVA
|
|
%{
|
|
SWIGINTERN void SWIG_JavaException(JNIEnv *jenv, int code, const char *msg) {
|
|
SWIG_JavaExceptionCodes exception_code = SWIG_JavaUnknownError;
|
|
switch(code) {
|
|
case SWIG_MemoryError:
|
|
exception_code = SWIG_JavaOutOfMemoryError;
|
|
break;
|
|
case SWIG_IOError:
|
|
exception_code = SWIG_JavaIOException;
|
|
break;
|
|
case SWIG_SystemError:
|
|
case SWIG_RuntimeError:
|
|
exception_code = SWIG_JavaRuntimeException;
|
|
break;
|
|
case SWIG_OverflowError:
|
|
case SWIG_IndexError:
|
|
exception_code = SWIG_JavaIndexOutOfBoundsException;
|
|
break;
|
|
case SWIG_DivisionByZero:
|
|
exception_code = SWIG_JavaArithmeticException;
|
|
break;
|
|
case SWIG_SyntaxError:
|
|
case SWIG_ValueError:
|
|
case SWIG_TypeError:
|
|
exception_code = SWIG_JavaIllegalArgumentException;
|
|
break;
|
|
case SWIG_UnknownError:
|
|
default:
|
|
exception_code = SWIG_JavaUnknownError;
|
|
break;
|
|
}
|
|
SWIG_JavaThrowException(jenv, exception_code, msg);
|
|
}
|
|
%}
|
|
|
|
#define SWIG_exception(code, msg)\
|
|
{ SWIG_JavaException(jenv, code, msg); return $null; }
|
|
#endif // SWIGJAVA
|
|
|
|
#ifdef SWIGOCAML
|
|
%{
|
|
#define OCAML_MSG_BUF_LEN 1024
|
|
SWIGINTERN void SWIG_exception_(int code, const char *msg) {
|
|
char msg_buf[OCAML_MSG_BUF_LEN];
|
|
sprintf( msg_buf, "Exception(%d): %s\n", code, msg );
|
|
failwith( msg_buf );
|
|
}
|
|
#define SWIG_exception(a,b) SWIG_exception_((a),(b))
|
|
%}
|
|
#endif
|
|
|
|
|
|
#ifdef SWIGCHICKEN
|
|
%{
|
|
SWIGINTERN void SWIG_exception_(int code, const char *msg) {
|
|
C_word *a;
|
|
C_word scmmsg;
|
|
C_word list;
|
|
|
|
a = C_alloc (C_SIZEOF_STRING (strlen (msg)) + C_SIZEOF_LIST(2));
|
|
scmmsg = C_string2 (&a, (char *) msg);
|
|
list = C_list(&a, 2, C_fix(code), scmmsg);
|
|
SWIG_ThrowException(list);
|
|
}
|
|
#define SWIG_exception(a,b) SWIG_exception_((a),(b))
|
|
%}
|
|
#endif
|
|
|
|
#ifdef SWIGCSHARP
|
|
%{
|
|
SWIGINTERN void SWIG_CSharpException(int code, const char *msg) {
|
|
if (code == SWIG_ValueError) {
|
|
SWIG_CSharpExceptionArgumentCodes exception_code = SWIG_CSharpArgumentOutOfRangeException;
|
|
SWIG_CSharpSetPendingExceptionArgument(exception_code, msg, 0);
|
|
} else {
|
|
SWIG_CSharpExceptionCodes exception_code = SWIG_CSharpApplicationException;
|
|
switch(code) {
|
|
case SWIG_MemoryError:
|
|
exception_code = SWIG_CSharpOutOfMemoryException;
|
|
break;
|
|
case SWIG_IndexError:
|
|
exception_code = SWIG_CSharpIndexOutOfRangeException;
|
|
break;
|
|
case SWIG_DivisionByZero:
|
|
exception_code = SWIG_CSharpDivideByZeroException;
|
|
break;
|
|
case SWIG_IOError:
|
|
exception_code = SWIG_CSharpIOException;
|
|
break;
|
|
case SWIG_OverflowError:
|
|
exception_code = SWIG_CSharpOverflowException;
|
|
break;
|
|
case SWIG_RuntimeError:
|
|
case SWIG_TypeError:
|
|
case SWIG_SyntaxError:
|
|
case SWIG_SystemError:
|
|
case SWIG_UnknownError:
|
|
default:
|
|
exception_code = SWIG_CSharpApplicationException;
|
|
break;
|
|
}
|
|
SWIG_CSharpSetPendingException(exception_code, msg);
|
|
}
|
|
}
|
|
%}
|
|
|
|
#define SWIG_exception(code, msg)\
|
|
{ SWIG_CSharpException(code, msg); return $null; }
|
|
#endif // SWIGCSHARP
|
|
|
|
#ifdef SWIGLUA
|
|
|
|
%{
|
|
#define SWIG_exception(a,b)\
|
|
{ lua_pushfstring(L,"%s:%s",#a,b);SWIG_fail; }
|
|
%}
|
|
|
|
#endif // SWIGLUA
|
|
|
|
#ifdef SWIGC
|
|
|
|
%inline %{
|
|
struct SWIG_CException {
|
|
SWIG_CException(int code) {
|
|
SWIG_exc.code = code;
|
|
}
|
|
};
|
|
%}
|
|
|
|
#define SWIG_exception(code, msg)\
|
|
SwigObj *_ex = SWIG_create_object(new SWIG_CException(code), "SWIG_CException"); \
|
|
SWIG_CThrowException(_ex, msg);
|
|
|
|
#endif // SWIGC
|
|
|
|
#ifdef SWIGD
|
|
%{
|
|
SWIGINTERN void SWIG_DThrowException(int code, const char *msg) {
|
|
SWIG_DExceptionCodes exception_code;
|
|
switch(code) {
|
|
case SWIG_IndexError:
|
|
exception_code = SWIG_DNoSuchElementException;
|
|
break;
|
|
case SWIG_IOError:
|
|
exception_code = SWIG_DIOException;
|
|
break;
|
|
case SWIG_ValueError:
|
|
exception_code = SWIG_DIllegalArgumentException;
|
|
break;
|
|
case SWIG_DivisionByZero:
|
|
case SWIG_MemoryError:
|
|
case SWIG_OverflowError:
|
|
case SWIG_RuntimeError:
|
|
case SWIG_TypeError:
|
|
case SWIG_SyntaxError:
|
|
case SWIG_SystemError:
|
|
case SWIG_UnknownError:
|
|
default:
|
|
exception_code = SWIG_DException;
|
|
break;
|
|
}
|
|
SWIG_DSetPendingException(exception_code, msg);
|
|
}
|
|
%}
|
|
|
|
#define SWIG_exception(code, msg)\
|
|
{ SWIG_DThrowException(code, msg); return $null; }
|
|
#endif // SWIGD
|
|
|
|
#ifdef __cplusplus
|
|
/*
|
|
You can use the SWIG_CATCH_STDEXCEPT macro with the %exception
|
|
directive as follows:
|
|
|
|
%exception {
|
|
try {
|
|
$action
|
|
}
|
|
catch (my_except& e) {
|
|
...
|
|
}
|
|
SWIG_CATCH_STDEXCEPT // catch std::exception
|
|
catch (...) {
|
|
SWIG_exception(SWIG_UnknownError, "Unknown exception");
|
|
}
|
|
}
|
|
*/
|
|
%{
|
|
#include <stdexcept>
|
|
%}
|
|
%define SWIG_CATCH_STDEXCEPT
|
|
/* catching std::exception */
|
|
catch (std::invalid_argument& e) {
|
|
SWIG_exception(SWIG_ValueError, e.what() );
|
|
} catch (std::domain_error& e) {
|
|
SWIG_exception(SWIG_ValueError, e.what() );
|
|
} catch (std::overflow_error& e) {
|
|
SWIG_exception(SWIG_OverflowError, e.what() );
|
|
} catch (std::out_of_range& e) {
|
|
SWIG_exception(SWIG_IndexError, e.what() );
|
|
} catch (std::length_error& e) {
|
|
SWIG_exception(SWIG_IndexError, e.what() );
|
|
} catch (std::runtime_error& e) {
|
|
SWIG_exception(SWIG_RuntimeError, e.what() );
|
|
} catch (std::exception& e) {
|
|
SWIG_exception(SWIG_SystemError, e.what() );
|
|
}
|
|
%enddef
|
|
%define SWIG_CATCH_UNKNOWN
|
|
catch (std::exception& e) {
|
|
SWIG_exception(SWIG_SystemError, e.what() );
|
|
}
|
|
catch (...) {
|
|
SWIG_exception(SWIG_UnknownError, "unknown exception");
|
|
}
|
|
%enddef
|
|
|
|
/* rethrow the unknown exception */
|
|
|
|
#if defined(SWIGCSHARP) || defined(SWIGD)
|
|
%typemap(throws,noblock=1, canthrow=1) (...) {
|
|
SWIG_exception(SWIG_RuntimeError,"unknown exception");
|
|
}
|
|
#else
|
|
%typemap(throws,noblock=1) (...) {
|
|
SWIG_exception(SWIG_RuntimeError,"unknown exception");
|
|
}
|
|
#endif
|
|
|
|
#endif /* __cplusplus */
|
|
|
|
/* exception.i ends here */
|