1 (* Copyright (C
) 2003-2008 Henry Cejtin
, Matthew Fluet
, Suresh
2 * Jagannathan
, and Stephen Weeks
.
4 * MLton is released under a BSD
-style license
.
5 * See the file MLton
-LICENSE for details
.
8 structure MLtonFFI
: MLTON_FFI
=
11 val register
= MLtonThread
.register
14 fun makeGet
get (p
,i
) = get (MLtonPointer
.getPointer (p
, i
), 0)
15 fun makeSet
set (p
,i
,x
) = set (MLtonPointer
.getPointer (p
, i
), 0, x
)
16 fun make (get
,set
) = (makeGet get
, makeSet set
)
18 val (getCPointer
, setCPointer
) =
19 make (MLtonPointer
.getCPointer
, MLtonPointer
.setCPointer
)
20 val (getInt8
, setInt8
) =
21 make (MLtonPointer
.getInt8
, MLtonPointer
.setInt8
)
22 val (getInt16
, setInt16
) =
23 make (MLtonPointer
.getInt16
, MLtonPointer
.setInt16
)
24 val (getInt32
, setInt32
) =
25 make (MLtonPointer
.getInt32
, MLtonPointer
.setInt32
)
26 val (getInt64
, setInt64
) =
27 make (MLtonPointer
.getInt64
, MLtonPointer
.setInt64
)
28 val getObjptr
= fn (p
,i
) => makeGet MLtonPointer
.getObjptr (p
,i
)
29 val setObjptr
= fn (p
,i
,x
) => makeSet MLtonPointer
.setObjptr (p
,i
,x
)
30 val (getReal32
, setReal32
) =
31 make (MLtonPointer
.getReal32
, MLtonPointer
.setReal32
)
32 val (getReal64
, setReal64
) =
33 make (MLtonPointer
.getReal64
, MLtonPointer
.setReal64
)
34 val (getWord8
, setWord8
) =
35 make (MLtonPointer
.getWord8
, MLtonPointer
.setWord8
)
36 val (getWord16
, setWord16
) =
37 make (MLtonPointer
.getWord16
, MLtonPointer
.setWord16
)
38 val (getWord32
, setWord32
) =
39 make (MLtonPointer
.getWord32
, MLtonPointer
.setWord32
)
40 val (getWord64
, setWord64
) =
41 make (MLtonPointer
.getWord64
, MLtonPointer
.setWord64
)
44 (* To the C
-world
, chars are unsigned integers
. *)
45 val getChar8
= fn (p
, i
) => Primitive
.Char8
.idFromWord8 (getWord8 (p
, i
))
47 val getChar16
= fn (p
, i
) => Primitive
.Char16
.idFromWord16 (getWord16 (p
, i
))
48 val getChar32
= fn (p
, i
) => Primitive
.Char32
.idFromWord32 (getWord32 (p
, i
))
51 val setChar8
= fn (p
, i
, x
) => setWord8 (p
, i
, Primitive
.Char8
.idToWord8 x
)
53 val setChar16
= fn (p
, i
, x
) => setWord16 (p
, i
, Primitive
.Char16
.idToWord16 x
)
54 val setChar32
= fn (p
, i
, x
) => setWord32 (p
, i
, Primitive
.Char32
.idToWord32 x
)
57 (* To the C
-world
, booleans are
32-bit integers
. *)
58 fun intToBool (i
: Int32
.int): bool = i
<> 0
59 val getBool
= fn (p
, i
) => intToBool(getInt32 (p
, i
))
60 fun boolToInt (b
: bool): Int32
.int = if b
then 1 else 0
61 val setBool
= fn (p
, i
, x
) => setInt32 (p
, i
, boolToInt x
)