35 lines
996 B
OCaml
35 lines
996 B
OCaml
(* Data that should be statically allocated by the compiler (all versions) *)
|
|
|
|
external is_in_static_data : 'a -> bool = "caml_is_in_static_data"
|
|
|
|
(* Basic constant blocks should be static *)
|
|
let block1 = (1,2)
|
|
let () = assert(is_in_static_data block1)
|
|
|
|
(* as pattern shouldn't prevent it *)
|
|
let (a, b) as block2 = (1,2)
|
|
let () = assert(is_in_static_data block2)
|
|
|
|
(* Also in functions *)
|
|
let f () =
|
|
let block = (1,2) in
|
|
assert(is_in_static_data block)
|
|
|
|
let () = (f [@inlined never]) ()
|
|
|
|
(* Closed functions should be static *)
|
|
let closed_function x = x + 1 (* + is a primitive, it cannot be in the closure*)
|
|
let () = assert(is_in_static_data closed_function)
|
|
|
|
(* And functions using closed functions *)
|
|
let almost_closed_function x =
|
|
(closed_function [@inlined never]) x
|
|
let () = assert(is_in_static_data almost_closed_function)
|
|
|
|
(* Recursive constant functions should be static *)
|
|
let rec f1 a = g1 a
|
|
and g1 a = f1 a
|
|
let () =
|
|
assert(is_in_static_data f1);
|
|
assert(is_in_static_data g1)
|