Import Upstream version 20180207
[hcoop/debian/mlton.git] / basis-library / mlton / ffi.sml
1 (* Copyright (C) 2003-2008 Henry Cejtin, Matthew Fluet, Suresh
2 * Jagannathan, and Stephen Weeks.
3 *
4 * MLton is released under a BSD-style license.
5 * See the file MLton-LICENSE for details.
6 *)
7
8 structure MLtonFFI: MLTON_FFI =
9 struct
10
11 val register = MLtonThread.register
12
13 local
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)
17 in
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)
42 end
43
44 (* To the C-world, chars are unsigned integers. *)
45 val getChar8 = fn (p, i) => Primitive.Char8.idFromWord8 (getWord8 (p, i))
46 (*
47 val getChar16 = fn (p, i) => Primitive.Char16.idFromWord16 (getWord16 (p, i))
48 val getChar32 = fn (p, i) => Primitive.Char32.idFromWord32 (getWord32 (p, i))
49 *)
50
51 val setChar8 = fn (p, i, x) => setWord8 (p, i, Primitive.Char8.idToWord8 x)
52 (*
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)
55 *)
56
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)
62
63 end