| 1 | (* Access the current stack in the heap via a MLton.share object trace. *) |
| 2 | val rt : MLton.Thread.Runnable.t option ref = ref NONE |
| 3 | |
| 4 | fun stats () = |
| 5 | let |
| 6 | val () = MLton.share rt |
| 7 | in |
| 8 | () |
| 9 | end |
| 10 | |
| 11 | fun switcheroo () = |
| 12 | MLton.Thread.switch |
| 13 | (fn t => let |
| 14 | val () = rt := SOME (MLton.Thread.prepare (t, ())) |
| 15 | val () = stats () |
| 16 | in |
| 17 | valOf (!rt) |
| 18 | end) |
| 19 | |
| 20 | (* tuple option array *) |
| 21 | val a = Array.tabulate (100, fn i => SOME (i mod 2, i mod 3)) |
| 22 | val () = Array.update (a, 0, NONE) |
| 23 | |
| 24 | fun touch () = |
| 25 | let |
| 26 | val size = MLton.size a |
| 27 | val sum = |
| 28 | Array.foldr (fn (NONE,sum) => sum |
| 29 | | (SOME (a, b),sum) => a + b + sum) |
| 30 | 0 a |
| 31 | in |
| 32 | (size, sum) |
| 33 | end |
| 34 | |
| 35 | val (size1,sum1) = touch () |
| 36 | val () = switcheroo () |
| 37 | val (size2,sum2) = touch () |
| 38 | val _ = print (concat ["size1 >= size2 = ", Bool.toString (size1 >= size2), "\n"]) |
| 39 | val _ = print (concat ["sum1 = sum2 = ", Bool.toString (sum1 >= sum2), "\n"]) |