Import Upstream version 20180207
[hcoop/debian/mlton.git] / regression / library / libm1.sml
CommitLineData
7f918cf1
CE
1val () = print "libm1 starting up\n"
2val () = OS.Process.atExit (fn () => print "libm1 exits\n")
3
4type p = MLton.Pointer.t
5
6type 'a s = (unit -> 'a) * ('a -> unit)
7val (_, setSI) = _symbol "libm1smlSymPrivate" alloc private : p s;
8val (_, setSB) = _symbol "libm1smlSymPublic" alloc public : p s;
9val (_, setCI) = _symbol "libm1cSymPrivate" private : p s;
10val (_, setCB) = _symbol "libm1cSymPublic" public : p s;
11
12type i = (unit -> p)
13type e = i -> unit
14val () = _export "libm1smlFnPrivate" private : e;
15 (fn () => _address "libm1smlSymPrivate" private : p;)
16val () = _export "libm1smlFnPublic" public : e;
17 (fn () => _address "libm1smlSymPublic" public : p;)
18val getCI = _import "libm1cFnPrivate" private : i;
19val getCB = _import "libm1cFnPublic" public : i;
20
21(* Store our idea of what the function pointers are in symbols *)
22val () = setSI (_address "libm1smlFnPrivate" private : p;)
23val () = setSB (_address "libm1smlFnPublic" public : p;)
24val () = setCI (_address "libm1cFnPrivate" private : p;)
25val () = setCB (_address "libm1cFnPublic" public : p;)
26
27(* Have C confirm that it sees the same function pointers we do.
28 * C will check the values of the variables against it's own pointers.
29 * C also checks SML functions return his idea of pointers to our exports.
30 *)
31val () = _import "libm1confirmC" private : unit -> unit; ()
32
33(* Confirm that C functions return pointers to address as we expect. *)
34fun check (s, b) = if b then () else print (s ^ " pointers don't match!\n")
35val () = check ("libm1cFnPrivate", getCI () = _address "libm1cSymPrivate" private : p;)
36val () = check ("libm1cFnPublic", getCB () = _address "libm1cSymPublic" public : p;)
37
38val () = print "m1 pointer test complete.\n"