1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
(* TEST *)
type t =
| A of string * float
| B of string * float
let () =
assert (Obj.dup (Obj.repr (A ("hello", 10.))) = Obj.repr (A ("hello", 10.)));
assert (Obj.with_tag 1 (Obj.repr (A ("hello", 10.))) = Obj.repr (B ("hello", 10.)))
let () =
assert (Obj.tag (Obj.with_tag 42 (Obj.repr [| |])) = 42)
(* check optimisations *)
let raw_allocs f =
let before = Gc.minor_words () in
f ();
let after = Gc.minor_words () in
int_of_float (after -. before)
let allocs =
let overhead = raw_allocs (fun () -> ()) in
fun f -> raw_allocs f - overhead
let () = if false then (
assert (allocs (fun () -> Obj.with_tag 1 (Obj.repr (A ("hello", 10.)))) = 0);
assert (allocs (fun () -> Obj.with_tag 1 (Obj.repr (ref 10))) = 2))
let () =
print_endline "ok"
|