The OCaml module's exception handling code was poorly designed, gave confusing exception messages, and was vulnerable to buffer overflows. The OCaml module's SWIG_exception_() was adding a useless newline to the end of the exception message. In some cases, the integer value of f.e. SWIG_TypeError was being added to the exception message. The unneeded else in the OCaml module's SWIG_contract_assert() macro was causing -Wmisleading-indentation warnings. The OCaml module's exception handling code now mirrors that of the Java module. Add Lib/ocaml/std_except.i. Add multiple runtime tests.
46 lines
1.2 KiB
OCaml
46 lines
1.2 KiB
OCaml
open Swig
|
|
open Director_exception
|
|
|
|
exception MyException of string * string
|
|
|
|
let director_exception_MyFoo ob meth args =
|
|
match meth with
|
|
"ping" -> raise (Failure "MyFoo::ping() EXCEPTION")
|
|
| _ -> (invoke ob) meth args
|
|
|
|
let director_exception_MyFoo2 ob meth args =
|
|
match meth with
|
|
"ping" -> (C_bool true)
|
|
| _ -> (invoke ob) meth args
|
|
|
|
let director_exception_MyFoo3 ob meth args =
|
|
match meth with
|
|
"ping" -> raise (MyException ("foo", "bar"))
|
|
| _ -> (invoke ob) meth args
|
|
|
|
(* Check that Failure is raised by MyFoo.ping() (via MyFoo.pong()). *)
|
|
let a =
|
|
new_derived_object
|
|
new_Foo (director_exception_MyFoo) '()
|
|
let a = _launder(a)
|
|
try
|
|
let _ = a -> pong () in assert false
|
|
with Failure s -> assert(s = "MyFoo::ping() EXCEPTION")
|
|
|
|
let a =
|
|
new_derived_object
|
|
new_Foo (director_exception_MyFoo2) '()
|
|
let a = _launder(a)
|
|
try
|
|
let _ = a -> pong () in assert false
|
|
with Failure s -> assert(s = "No appropriate conversion found.")
|
|
|
|
let a =
|
|
new_derived_object
|
|
new_Foo (director_exception_MyFoo3) '()
|
|
let a = _launder(a)
|
|
try
|
|
let _ = a -> pong () in assert false
|
|
with MyException (s1, s2) ->
|
|
assert (s1 = "foo");
|
|
assert (s2 = "bar");
|