on master help sign in
Add conversion CPtr to Ptr
commite376625c9c387f4287364ec264ad10d25b491889 authorNiklas Larsson <niklas@mm.st> dateSun 13 Mar 2016, 22:47 (11 years ago) parent3c839ae
4 files changed+16−5
libs/contrib/CFFI/Memory.idr+8−4 libs/prelude/Builtins.idr+1 src/IRTS/CodegenC.hs+4−1 test/ffi008/ffi008.idr+3
libs/contrib/CFFI/Memory.idr+8−4
@@ -15,6 +15,10 @@ data CPtr = CPt Ptr Int
1515implicit toCPtr : Ptr -> CPtr
1616toCPtr p = CPt p 0
1717
18+implicit toPtr : CPtr -> Ptr
19+toPtr (CPt p 0) = p
20+toPtr (CPt p o) = prim__ptrOffset p o
21+
1822||| Import of malloc from the C standard library.
1923malloc : Int -> IO Ptr
2024malloc size = foreign FFI_C "malloc" (Int -> IO Ptr) size
@@ -77,10 +81,10 @@ update ty cp f = do val <- peek ty cp
7781
7882||| Get a pointer to a field in a composite value
7983field : Composite -> Nat -> CPtr -> CPtr
80−field arr@(ARRAY n t) i (CPt p o ) = CPt p (o + offset arr i)
81−field un@(UNION xs) i (CPt p o ) = CPt p o
82−field st@(STRUCT xs) i (CPt p o ) = CPt p (o + offset st i)
83−field ps@(PACKEDSTRUCT xs) i (CPt p o ) = CPt p (o + offset ps i)
84+field arr@(ARRAY n t) i (CPt p o) = CPt p (o + offset arr i)
85+field un@(UNION xs) i (CPt p o) = CPt p o
86+field st@(STRUCT xs) i (CPt p o) = CPt p (o + offset st i)
87+field ps@(PACKEDSTRUCT xs) i (CPt p o) = CPt p (o + offset ps i)
8488field (T t) Z p = p
8589
8690infixl 10 #
libs/prelude/Builtins.idr+1
@@ -202,6 +202,7 @@ export data CData : Type
202202-- primitives for accessing memory.
203203%extern prim__asPtr : ManagedPtr -> Ptr
204204%extern prim__sizeofPtr : Int
205+%extern prim__ptrOffset : Ptr -> Int -> Ptr
205206%extern prim__peek8 : prim__WorldType -> Ptr -> Int -> Bits8
206207%extern prim__peek16 : prim__WorldType -> Ptr -> Int -> Bits16
207208%extern prim__peek32 : prim__WorldType -> Ptr -> Int -> Bits32
src/IRTS/CodegenC.hs+4−1
@@ -663,7 +663,10 @@ doOp v (LExternal pk) [_, p, o] | pk == sUN "prim__peekSingle"
663663 = v ++ "idris_peekSingle(vm," ++ creg p ++ "," ++ creg o ++")"
664664doOp v (LExternal pk) [] | pk == sUN "prim__sizeofPtr"
665665 = v ++ "MKINT(sizeof(void*))"
666−doOp v (LExternal mpt) [p] | mpt == sUN "prim__asPtr" = v ++ "MKPTR(vm, GETMPTR("++ creg p ++"))"
666+doOp v (LExternal mpt) [p] | mpt == sUN "prim__asPtr"
667+ = v ++ "MKPTR(vm, GETMPTR("++ creg p ++"))"
668+doOp v (LExternal offs) [p, n] | offs == sUN "prim__ptrOffset"
669+ = v ++ "MKPTR(vm, GETPTR(" ++ creg p ++ ") + GETINT(" ++ creg n ++ "))"
667670doOp _ op args = error $ "doOp not implemented (" ++ show (op, args) ++ ")"
668671
669672
test/ffi008/ffi008.idr+3
@@ -30,6 +30,7 @@ test3 = STRUCT [DOUBLE, DOUBLE, I8, I64]
3030test4 : Composite
3131test4 = PACKEDSTRUCT [I8, I8, I8, I64]
3232
33+
3334main : IO ()
3435main = do
3536 printLn $ sizeOf test1 == !size1
@@ -43,3 +44,5 @@ main = do
4344 poke I32 f1 8
4445 update I32 f1 (* 2)
4546 print !(peek I32 f1)
47+ withAlloc PTR $ \p =>
48+ poke PTR p fms