on master help sign in
Add conversion CPtr to Ptr
e376625Niklas Larsson
libs/contrib/CFFI/Memory.idr+8−4
@@ -15,6 +15,10 @@ data CPtr = CPt Ptr Int
15implicit toCPtr : Ptr -> CPtr
15implicit toCPtr : Ptr -> CPtr
16toCPtr p = CPt p 0
16toCPtr p = CPt p 0
17
17
18+implicit toPtr : CPtr -> Ptr
19+toPtr (CPt p 0) = p
20+toPtr (CPt p o) = prim__ptrOffset p o
21+
18||| Import of malloc from the C standard library.
22||| Import of malloc from the C standard library.
19malloc : Int -> IO Ptr
23malloc : Int -> IO Ptr
20malloc size = foreign FFI_C "malloc" (Int -> IO Ptr) size
24malloc size = foreign FFI_C "malloc" (Int -> IO Ptr) size
@@ -77,10 +81,10 @@ update ty cp f = do val <- peek ty cp
77
81
78||| Get a pointer to a field in a composite value
82||| Get a pointer to a field in a composite value
79field : Composite -> Nat -> CPtr -> CPtr
83field : Composite -> Nat -> CPtr -> CPtr
80−field arr@(ARRAY n t) i (CPt p o ) = CPt p (o + offset arr i)
84+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
85+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)
86+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)
87+field ps@(PACKEDSTRUCT xs) i (CPt p o) = CPt p (o + offset ps i)
84field (T t) Z p = p
88field (T t) Z p = p
85
89
86infixl 10 #
90infixl 10 #
libs/prelude/Builtins.idr+1
@@ -202,6 +202,7 @@ export data CData : Type
202-- primitives for accessing memory.
202-- primitives for accessing memory.
203%extern prim__asPtr : ManagedPtr -> Ptr
203%extern prim__asPtr : ManagedPtr -> Ptr
204%extern prim__sizeofPtr : Int
204%extern prim__sizeofPtr : Int
205+%extern prim__ptrOffset : Ptr -> Int -> Ptr
205%extern prim__peek8 : prim__WorldType -> Ptr -> Int -> Bits8
206%extern prim__peek8 : prim__WorldType -> Ptr -> Int -> Bits8
206%extern prim__peek16 : prim__WorldType -> Ptr -> Int -> Bits16
207%extern prim__peek16 : prim__WorldType -> Ptr -> Int -> Bits16
207%extern prim__peek32 : prim__WorldType -> Ptr -> Int -> Bits32
208%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"
663 = v ++ "idris_peekSingle(vm," ++ creg p ++ "," ++ creg o ++")"
663 = v ++ "idris_peekSingle(vm," ++ creg p ++ "," ++ creg o ++")"
664doOp v (LExternal pk) [] | pk == sUN "prim__sizeofPtr"
664doOp v (LExternal pk) [] | pk == sUN "prim__sizeofPtr"
665 = v ++ "MKINT(sizeof(void*))"
665 = 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 ++ "))"
667doOp _ op args = error $ "doOp not implemented (" ++ show (op, args) ++ ")"
670doOp _ op args = error $ "doOp not implemented (" ++ show (op, args) ++ ")"
668
671
669
672
test/ffi008/ffi008.idr+3
@@ -30,6 +30,7 @@ test3 = STRUCT [DOUBLE, DOUBLE, I8, I64]
30test4 : Composite
30test4 : Composite
31test4 = PACKEDSTRUCT [I8, I8, I8, I64]
31test4 = PACKEDSTRUCT [I8, I8, I8, I64]
32
32
33+
33main : IO ()
34main : IO ()
34main = do
35main = do
35 printLn $ sizeOf test1 == !size1
36 printLn $ sizeOf test1 == !size1
@@ -43,3 +44,5 @@ main = do
43 poke I32 f1 8
44 poke I32 f1 8
44 update I32 f1 (* 2)
45 update I32 f1 (* 2)
45 print !(peek I32 f1)
46 print !(peek I32 f1)
47+ withAlloc PTR $ \p =>
48+ poke PTR p fms