Merge branch 'ZackerySpytz-OCaml-exception-improvements'
* ZackerySpytz-OCaml-exception-improvements: [OCaml] Some exception improvements
This commit is contained in:
commit
6ec798f7ff
12 changed files with 264 additions and 41 deletions
|
|
@ -127,7 +127,44 @@ CAMLextern int64 Int64_val(caml_value_t v);
|
|||
#define SWIG_GetModule(clientdata) SWIG_Ocaml_GetModule(clientdata)
|
||||
#define SWIG_SetModule(clientdata, pointer) SWIG_Ocaml_SetModule(pointer)
|
||||
|
||||
#define SWIG_contract_assert(expr, msg) if(!(expr)) {caml_failwith(msg);} else
|
||||
typedef enum {
|
||||
SWIG_OCamlArithmeticException,
|
||||
SWIG_OCamlDirectorPureVirtual,
|
||||
SWIG_OCamlOutOfMemoryError,
|
||||
SWIG_OCamlOverflowException,
|
||||
SWIG_OCamlIllegalArgumentException,
|
||||
SWIG_OCamlIndexOutOfBoundsException,
|
||||
SWIG_OCamlRuntimeException,
|
||||
SWIG_OCamlSystemException,
|
||||
SWIG_OCamlUnknownError
|
||||
} SWIG_OCamlExceptionCodes;
|
||||
|
||||
SWIGINTERN void SWIG_OCamlThrowException(SWIG_OCamlExceptionCodes code, const char *msg) {
|
||||
CAMLparam0();
|
||||
SWIG_CAMLlocal1(str);
|
||||
|
||||
switch (code) {
|
||||
case SWIG_OCamlIllegalArgumentException:
|
||||
caml_invalid_argument(msg);
|
||||
break;
|
||||
case SWIG_OCamlSystemException:
|
||||
str = caml_copy_string(msg);
|
||||
caml_raise_sys_error(str);
|
||||
break;
|
||||
case SWIG_OCamlArithmeticException:
|
||||
case SWIG_OCamlIndexOutOfBoundsException:
|
||||
case SWIG_OCamlOutOfMemoryError:
|
||||
case SWIG_OCamlOverflowException:
|
||||
case SWIG_OCamlRuntimeException:
|
||||
case SWIG_OCamlUnknownError:
|
||||
default:
|
||||
caml_failwith(msg);
|
||||
break;
|
||||
}
|
||||
CAMLreturn0;
|
||||
}
|
||||
|
||||
#define SWIG_contract_assert(expr, msg) if(!(expr)) {SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, msg);}
|
||||
|
||||
SWIGINTERN int
|
||||
SWIG_GetPtr(void *source, void **result, swig_type_info *type, swig_type_info *result_type);
|
||||
|
|
|
|||
23
Lib/ocaml/std_except.i
Normal file
23
Lib/ocaml/std_except.i
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
%{
|
||||
#include <typeinfo>
|
||||
#include <stdexcept>
|
||||
%}
|
||||
|
||||
namespace std
|
||||
{
|
||||
%ignore exception;
|
||||
struct exception {};
|
||||
}
|
||||
|
||||
%typemap(throws) std::bad_cast "SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, $1.what());"
|
||||
%typemap(throws) std::bad_exception "SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, $1.what());"
|
||||
%typemap(throws) std::domain_error "SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, $1.what());"
|
||||
%typemap(throws) std::exception "SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, $1.what());"
|
||||
%typemap(throws) std::invalid_argument "SWIG_OCamlThrowException(SWIG_OCamlIllegalArgumentException, $1.what());"
|
||||
%typemap(throws) std::length_error "SWIG_OCamlThrowException(SWIG_OCamlIndexOutOfBoundsException, $1.what());"
|
||||
%typemap(throws) std::logic_error "SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, $1.what());"
|
||||
%typemap(throws) std::out_of_range "SWIG_OCamlThrowException(SWIG_OCamlIndexOutOfBoundsException, $1.what());"
|
||||
%typemap(throws) std::overflow_error "SWIG_OCamlThrowException(SWIG_OCamlArithmeticException, $1.what());"
|
||||
%typemap(throws) std::range_error "SWIG_OCamlThrowException(SWIG_OCamlIndexOutOfBoundsException, $1.what());"
|
||||
%typemap(throws) std::runtime_error "SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, $1.what());"
|
||||
%typemap(throws) std::underflow_error "SWIG_OCamlThrowException(SWIG_OCamlArithmeticException, $1.what());"
|
||||
|
|
@ -163,19 +163,16 @@
|
|||
unsigned int,
|
||||
unsigned long,
|
||||
unsigned short {
|
||||
SWIG_exception($1,"Thrown exception from C++ (int)");
|
||||
char error_msg[256];
|
||||
sprintf(error_msg, "C++ $1_type exception thrown, value: %d", $1);
|
||||
SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, error_msg);
|
||||
}
|
||||
|
||||
%typemap(throws) SWIGTYPE CLASS {
|
||||
$&1_ltype temp = new $1_ltype($1);
|
||||
SWIG_exception((int)temp,"Thrown exception from C++ (object)");
|
||||
}
|
||||
|
||||
%typemap(throws) SWIGTYPE {
|
||||
%typemap(throws) SWIGTYPE, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE *, SWIGTYPE [], SWIGTYPE [ANY] {
|
||||
(void)$1;
|
||||
SWIG_exception(0,"Thrown exception from C++ (unknown)");
|
||||
SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, "C++ $1_type exception thrown");
|
||||
}
|
||||
|
||||
%typemap(throws) char * {
|
||||
SWIG_exception(0,$1);
|
||||
SWIG_OCamlThrowException(SWIG_OCamlRuntimeException, $1);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue