1 val () = print
"libm5 starting up\n"
2 val () = OS
.Process
.atExit
3 (fn () => (_import
"m4_close" public
: unit
-> unit
; ()
4 ; print
"libm5 exits\n"))
7 val () = _import
"m4_open" external
: int * string vector
-> unit
;
8 (1, Vector.fromList
["libm4"])
10 type p
= MLton
.Pointer
.t
11 type 'a s
= (unit
-> 'a
) * ('a
-> unit
)
12 val (_
, setSI
) = _symbol
"libm5smlSymPrivate" alloc private
: p s
;
13 val (_
, setSB
) = _symbol
"libm5smlSymPublic" alloc public
: p s
;
14 val (_
, setCI
) = _symbol
"libm5cSymPrivate" private
: p s
;
15 val (_
, setCB
) = _symbol
"libm5cSymPublic" public
: p s
;
19 val () = _export
"libm5smlFnPrivate" private
: e
;
20 (fn () => _address
"libm5smlSymPrivate" private
: p
;)
21 val () = _export
"libm5smlFnPublic" public
: e
;
22 (fn () => _address
"libm5smlSymPublic" public
: p
;)
23 val getCI
= _import
"libm5cFnPrivate" private
: i
;
24 val getCB
= _import
"libm5cFnPublic" public
: i
;
26 (* Store our idea
of what the function pointers are
in symbols
*)
27 val () = setSI (_address
"libm5smlFnPrivate" private
: p
;)
28 val () = setSB (_address
"libm5smlFnPublic" public
: p
;)
29 val () = setCI (_address
"libm5cFnPrivate" private
: p
;)
30 val () = setCB (_address
"libm5cFnPublic" public
: p
;)
32 (* Have C confirm that it sees the same function pointers we
do.
33 * C will check the values
of the variables against it
's own pointers
.
34 * C also checks SML functions return his idea
of pointers to our exports
.
36 val () = _import
"libm5confirmC" private
: unit
-> unit
; ()
38 (* Confirm that C functions return pointers to address
as we expect
. *)
39 fun check (s
, b
) = if b
then () else print (s ^
" pointers don't match!\n")
40 val () = check ("libm5cFnPrivate", getCI () = _address
"libm5cSymPrivate" private
: p
;)
41 val () = check ("libm5cFnPublic", getCB () = _address
"libm5cSymPublic" public
: p
;)
43 (* Test symbols
in libm3
*)
44 val (SB
, _
) = _symbol
"libm3smlSymPublic" external
: p s
;
45 val (CB
, _
) = _symbol
"libm3cSymPublic" external
: p s
;
46 val getSB
= _import
"libm3smlFnPublic" external
: i
;
47 val getCB
= _import
"libm3cFnPublic" external
: i
;
49 (* Check function pointers
*)
50 val () = check ("libm3smlFnPublic", SB () = _address
"libm3smlFnPublic" external
: p
;)
51 val () = check ("libm3cFnPublic", CB () = _address
"libm3cFnPublic" external
: p
;)
52 (* Check symbol pointers
*)
53 val () = check ("libm3smlSymPublic", getSB () = _address
"libm3smlSymPublic" external
: p
;)
54 val () = check ("libm3cSymPublic", getCB () = _address
"libm3cSymPublic" external
: p
;)
56 (* Test symbols
in libm4
*)
57 val (SB
, _
) = _symbol
"libm4smlSymPublic" external
: p s
;
58 val (CB
, _
) = _symbol
"libm4cSymPublic" external
: p s
;
59 val getSB
= _import
"libm4smlFnPublic" external
: i
;
60 val getCB
= _import
"libm4cFnPublic" external
: i
;
62 (* Check function pointers
*)
63 val () = check ("libm4smlFnPublic", SB () = _address
"libm4smlFnPublic" external
: p
;)
64 val () = check ("libm4cFnPublic", CB () = _address
"libm4cFnPublic" external
: p
;)
65 (* Check symbol pointers
*)
66 val () = check ("libm4smlSymPublic", getSB () = _address
"libm4smlSymPublic" external
: p
;)
67 val () = check ("libm4cSymPublic", getCB () = _address
"libm4cSymPublic" external
: p
;)
69 val () = print
"m5 pointer test complete.\n"