Backport from sid to buster
[hcoop/debian/mlton.git] / regression / mlton.share.sml
CommitLineData
7f918cf1
CE
1(* sharing on a non-object *)
2val () = MLton.share 13
3
4(* tuple option array *)
5val a = Array.tabulate (100, fn i => SOME (i mod 2, i mod 3))
6val () = Array.update (a, 0, NONE)
7
8fun msg () =
9 (print (concat ["size of a is ", Int.toString (MLton.size a), "\n"])
10 ; Array.appi (fn (i, z) =>
11 print (concat [Int.toString i, " => ",
12 case z of
13 NONE => "NONE"
14 | SOME (a, b) =>
15 concat ["(", Int.toString a, ", ",
16 Int.toString b, ")"],
17 "\n"])) a)
18
19val () = msg ()
20val () = MLton.share a
21val () = msg ()
22
23(* tuple option array with pre-existing sharing *)
24val a = Array.tabulate (100, fn i =>
25 if i mod 2 = 0
26 then SOME (1, 1)
27 else SOME (i mod 3, i mod 3))
28val () = Array.update (a, 0, NONE)
29fun msg () =
30 (print (concat ["size of a is ", Int.toString (MLton.size a), "\n"])
31 ; Array.appi (fn (i, z) =>
32 print (concat [Int.toString i, " => ",
33 case z of
34 NONE => "NONE"
35 | SOME (a, b) =>
36 concat ["(", Int.toString a, ", ",
37 Int.toString b, ")"],
38 "\n"])) a)
39val () = msg ()
40val () = MLton.share a
41val () = msg ()
42
43(* tuple option ref array *)
44
45val a = Array.tabulate (100, fn i => ref (SOME (i mod 2, i mod 3)))
46val () = Array.sub (a, 0) := NONE
47
48fun msg () =
49 (print (concat ["size of a is ", Int.toString (MLton.size a), "\n"])
50 ; Array.appi (fn (i, z) =>
51 print (concat [Int.toString i, " => ",
52 case !z of
53 NONE => "NONE"
54 | SOME (a, b) =>
55 concat ["(", Int.toString a, ", ",
56 Int.toString b, ")"],
57 "\n"])) a)
58
59val () = msg ()
60val () = MLton.share a
61val () = msg ()
62val () = Array.appi (fn (i, r) =>
63 r := (if i = 0 then NONE else (SOME (i mod 2, i mod 3)))) a
64val () = msg ()
65
66(* big tuple option array *)
67val a = Array.tabulate (100000, fn i => SOME (i mod 2, i mod 3))
68val () = Array.update (a, 0, NONE)
69
70fun msg () =
71 print (concat ["size of a is ", Int.toString (MLton.size a), "\n",
72 case Array.sub (a, 1) of
73 NONE => "NONE"
74 | SOME (a, b) =>
75 concat ["(", Int.toString a, ", ", Int.toString b, ")"],
76 "\n"])
77
78val () = msg ()
79val () = MLton.share a
80val () = msg ()
81
82(* non-sharing of vectors *)
83datatype t = A | B
84val v1 = Vector.fromList [A, B, A, B, A, B, A, B, A, B, A, B]
85val v2 = Vector.fromList [A, B, A, B, A, B, A, B, A, B, A, A]
86
87val a = Array.tabulate (4, fn i =>
88 if i mod 2 = 0
89 then v1
90 else v2)
91
92val () = MLton.share a
93
94val () =
95 if Array.sub (a, 2) = Array.sub (a, 3)
96 then raise Fail "bug"
97 else ()
98
99(* sharing of vectors *)
100val a =
101 Array.tabulate (10, fn i =>
102 if i mod 2 = 0
103 then "abcdef"
104 else concat ["abc", "def"])
105
106fun p () = print (concat ["size is ", Int.toString (MLton.size a), "\n"])
107
108val () = p ()
109
110val () = MLton.share a
111
112val () = p ()
113
114val s0 = Array.sub (a, 0)
115
116val s1 = Array.sub (a, 1)
117
118val () = print (concat [s0, " ", s1, "\n"])
119
120(* sharing of vectors in a tuple *)
121
122val t = ("abcdef", concat ["abc", "def"])
123
124fun p () = print (concat ["size is ", Int.toString (MLton.size t), "\n"])
125
126val () = p ()
127
128val () = MLton.share t
129
130val () = p ()
131
132val (s1, s2) = t
133
134val () = print (concat [s1, " ", s2, "\n"])
135
136(* non-sharing of similar looking strings of different lengths. *)
137val a =
138 Array.tabulate (10, fn i =>
139 if 0 = i mod 2
140 then "a"
141 else concat ["a", "\000"])
142
143val () = MLton.share a
144
145val s0 = Array.sub (a, 0)
146val s1 = Array.sub (a, 1)
147
148val () =
149 print (concat [Int.toString (size s0), " ",
150 Int.toString (size s1), "\n"])
151