summaryrefslogtreecommitdiff
path: root/testsuite/tests/misc/gc_mark_stack_overflow.ml
blob: 81b7dd8f1eb88698db2f0d3fa0cc0f8e02f0ab80 (plain)
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
31
32
33
34
35
36
(* TEST *)

let clear_elements a m =
  for i = 1 to m do
    let n = ((i * 34872841) lsr 13) land 0xffff in
    a.(n) <- [];
  done

let populate_elements a m =
  let nums = Array.init (1 lsl 16) (fun i -> ref i) in
  for i = 1 to m do
    let n = ((i * 34872841) lsr 13) land 0xffff in
    a.(n) <- nums.(i land 0xffff) :: a.(n);
  done

let make_arr () =
  let a = Array.init (1 lsl 16) (fun _ -> []) in
  populate_elements a 100_000;
  a

let arr = make_arr ()

let calc_sum a =
  let sum_lst xs = List.fold_left (fun acc r -> acc + !r) 0 xs in
  Array.fold_left (fun acc xs -> acc + (sum_lst xs)) 0 a

let () =
  for i = 1 to 3 do
    clear_elements arr 1000;
    populate_elements arr 100;
    Gc.full_major ();
    populate_elements arr 20_000;
    ignore (Sys.opaque_identity (calc_sum arr))
  done;

  print_endline "OK"