swig/Examples/test-suite/ocaml/director_exception_runme.ml
Zackery Spytz e5b8b5a164 [OCaml] Some exception improvements
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.
2019-02-07 16:25:10 -07:00

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");