File: libm1.sml

package info (click to toggle)
mlton 20130715-3
  • links: PTS
  • area: main
  • in suites: stretch
  • size: 60,900 kB
  • ctags: 69,386
  • sloc: xml: 34,418; ansic: 17,399; lisp: 2,879; makefile: 1,605; sh: 1,254; pascal: 256; python: 143; asm: 97
file content (38 lines) | stat: -rw-r--r-- 1,729 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
val () = print "libm1 starting up\n"
val () = OS.Process.atExit (fn () => print "libm1 exits\n")

type p = MLton.Pointer.t

type 'a s = (unit -> 'a) * ('a -> unit)
val (_, setSI) = _symbol "libm1smlSymPrivate" alloc private : p s;
val (_, setSB) = _symbol "libm1smlSymPublic"  alloc public  : p s;
val (_, setCI) = _symbol "libm1cSymPrivate" private : p s;
val (_, setCB) = _symbol "libm1cSymPublic"  public  : p s;

type i = (unit -> p)
type e = i -> unit
val () = _export "libm1smlFnPrivate" private : e;
         (fn () => _address "libm1smlSymPrivate" private : p;)
val () = _export "libm1smlFnPublic" public : e;
         (fn () => _address "libm1smlSymPublic" public : p;)
val getCI = _import "libm1cFnPrivate" private : i;
val getCB = _import "libm1cFnPublic" public : i;

(* Store our idea of what the function pointers are in symbols *)
val () = setSI (_address "libm1smlFnPrivate" private : p;)
val () = setSB (_address "libm1smlFnPublic"  public  : p;)
val () = setCI (_address "libm1cFnPrivate"   private : p;)
val () = setCB (_address "libm1cFnPublic"    public  : p;)

(* Have C confirm that it sees the same function pointers we do.
 * C will check the values of the variables against it's own pointers.
 * C also checks SML functions return his idea of pointers to our exports.
 *)
val () = _import "libm1confirmC" private : unit -> unit; ()

(* Confirm that C functions return pointers to address as we expect. *)
fun check (s, b) = if b then () else print (s ^ " pointers don't match!\n")
val () = check ("libm1cFnPrivate", getCI () = _address "libm1cSymPrivate" private : p;)
val () = check ("libm1cFnPublic",  getCB () = _address "libm1cSymPublic"  public  : p;)

val () = print "m1 pointer test complete.\n"