1 val () = print
"libm1 starting up\n"
2 val () = OS
.Process
.atExit (fn () => print
"libm1 exits\n")
4 type p
= MLton
.Pointer
.t
6 type 'a s
= (unit
-> 'a
) * ('a
-> unit
)
7 val (_
, setSI
) = _symbol
"libm1smlSymPrivate" alloc private
: p s
;
8 val (_
, setSB
) = _symbol
"libm1smlSymPublic" alloc public
: p s
;
9 val (_
, setCI
) = _symbol
"libm1cSymPrivate" private
: p s
;
10 val (_
, setCB
) = _symbol
"libm1cSymPublic" public
: p s
;
14 val () = _export
"libm1smlFnPrivate" private
: e
;
15 (fn () => _address
"libm1smlSymPrivate" private
: p
;)
16 val () = _export
"libm1smlFnPublic" public
: e
;
17 (fn () => _address
"libm1smlSymPublic" public
: p
;)
18 val getCI
= _import
"libm1cFnPrivate" private
: i
;
19 val getCB
= _import
"libm1cFnPublic" public
: i
;
21 (* Store our idea
of what the function pointers are
in symbols
*)
22 val () = setSI (_address
"libm1smlFnPrivate" private
: p
;)
23 val () = setSB (_address
"libm1smlFnPublic" public
: p
;)
24 val () = setCI (_address
"libm1cFnPrivate" private
: p
;)
25 val () = setCB (_address
"libm1cFnPublic" public
: p
;)
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
.
31 val () = _import
"libm1confirmC" private
: unit
-> unit
; ()
33 (* Confirm that C functions return pointers to address
as we expect
. *)
34 fun check (s
, b
) = if b
then () else print (s ^
" pointers don't match!\n")
35 val () = check ("libm1cFnPrivate", getCI () = _address
"libm1cSymPrivate" private
: p
;)
36 val () = check ("libm1cFnPublic", getCB () = _address
"libm1cSymPublic" public
: p
;)
38 val () = print
"m1 pointer test complete.\n"