@@ -12,10 +12,10 @@ import Control.Monad (void)
1212import Data.Char (isLower )
1313import Data.List (sort )
1414import Data.Proxy (Proxy (.. ))
15- import Data.Word (Word8 )
15+ import Data.Word (Word8 , Word16 )
1616import Foreign.Storable (peek )
1717import Foreign.ForeignPtr (newForeignPtr_ , withForeignPtr )
18- import GHC.Ptr (plusPtr , Ptr )
18+ import GHC.Ptr (plusPtr , Ptr ( .. ) )
1919import Streamly.Internal.Data.MutByteArray (Unbox , sizeOf )
2020import Streamly.Internal.Data.MutArray (MutArray )
2121import Test.QuickCheck (chooseInt , listOf )
@@ -248,6 +248,24 @@ testUnsafeFromForeignPtr = do
248248 performMajorGC
249249 A. unsafeFromForeignPtr fptr len `shouldReturn` arr
250250
251+ testFromCString# :: IO ()
252+ testFromCString# = do
253+ arr0 <- MA. unsafeGetSlice 10 50 <$> MA. fromList ([0 .. 99 ] :: [Word8 ])
254+ let arr = A. unsafeFreeze arr0
255+ A. unsafePinnedAsPtr (arr <> A. fromList [0 ]) $ \ (Ptr addr# ) _ -> do
256+ arr1 <- A. fromCString# addr#
257+ performGCSweep 4 100000
258+ arr1 `shouldBe` arr
259+
260+ testFromW16CString# :: IO ()
261+ testFromW16CString# = do
262+ arr0 <- MA. unsafeGetSlice 10 50 <$> MA. fromList ([0 .. 99 ] :: [Word16 ])
263+ let arr = A. unsafeFreeze arr0
264+ A. unsafePinnedAsPtr (arr <> A. fromList [0 ]) $ \ (Ptr addr# ) _ -> do
265+ arr1 <- A. fromW16CString# addr#
266+ performGCSweep 4 100000
267+ arr1 `shouldBe` arr
268+
251269reallocMA :: Property
252270reallocMA =
253271 let len = 10000
@@ -283,6 +301,8 @@ main =
283301 it " testUnsafeAsForeignPtr" testUnsafeAsForeignPtr
284302 it " testForeignPtrConversionId" testForeignPtrConversionId
285303 it " testUnsafeFromForeignPtr" testUnsafeFromForeignPtr
304+ it " testFromCString#" testFromCString#
305+ it " testFromW16CString#" testFromW16CString#
286306 describe " unsafeSlice" $ do
287307 it " partial" $ unsafeSlice 2 4 [1 .. 10 ]
288308 it " none" $ unsafeSlice 10 0 [1 .. 10 ]
0 commit comments