Commit | Line | Data |
---|---|---|
7f918cf1 CE |
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 |