(* TEST *) type t = Leaf of int | Branch of t * t type floatref = { mutable f : float } let a = { f = 0.0 } let rec allocate_lots m = function | 0 -> Leaf m | n -> Branch (allocate_lots m (n-1), allocate_lots (m+1) (n-1)) let measure f = let a = Gc.minor_words () in f (); let c = Gc.minor_words () in c -. a let () = let n = measure (fun () -> a.f <- Gc.minor_words ()) in (* Gc.minor_words should not allocate, although bytecode generally boxes the floats *) assert (n < 10.); if Sys.backend_type = Sys.Native then assert (n = 0.); let n = measure (fun () -> Sys.opaque_identity (allocate_lots 42 10)) in (* This should allocate > 3k words (varying slightly by unboxing) *) assert (n > 3000.); print_endline "ok"