| 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 |