on develop help sign in
Don't use newCString/peekCString to copy C strings
0afc206Robert J. Macomber
reflex-dom/src-android/Reflex/Dom/Android/MainWidget.hsc+7−2
@@ -11,10 +11,12 @@ import Data.Aeson
11import Data.ByteString (ByteString)
11import Data.ByteString (ByteString)
12import qualified Data.ByteString as BS
12import qualified Data.ByteString as BS
13import qualified Data.ByteString.Lazy as LBS
13import qualified Data.ByteString.Lazy as LBS
14+import qualified Data.ByteString.Unsafe as BSU
14import Data.IORef
15import Data.IORef
15import Data.Monoid
16import Data.Monoid
16import Foreign.C.String
17import Foreign.C.String
17import Foreign.Marshal.Utils
18import Foreign.Marshal.Utils
19+import Foreign.Marshal.Array
18import Foreign.Ptr
20import Foreign.Ptr
19import Foreign.Storable
21import Foreign.Storable
20import Language.Javascript.JSaddle (JSM)
22import Language.Javascript.JSaddle (JSM)
@@ -80,9 +82,12 @@ foreign import ccall "wrapper" wrapIO :: IO () -> IO (FunPtr (IO ()))
80foreign import ccall "wrapper" wrapCStringIO :: (CString -> IO ()) -> IO (FunPtr (CString -> IO ()))
82foreign import ccall "wrapper" wrapCStringIO :: (CString -> IO ()) -> IO (FunPtr (CString -> IO ()))
81foreign import ccall "wrapper" wrapCStringIOCString :: (CString -> IO CString) -> IO (FunPtr (CString -> IO CString))
83foreign import ccall "wrapper" wrapCStringIOCString :: (CString -> IO CString) -> IO (FunPtr (CString -> IO CString))
82
84
83−--TODO: Get rid of the extra copy step
84newCStringFromByteString :: ByteString -> IO CString
85newCStringFromByteString :: ByteString -> IO CString
85−newCStringFromByteString bs = BS.useAsCString bs $ newCString <=< peekCString
86+newCStringFromByteString bs = BSU.unsafeUseAsCStringLen bs $ \(src, len) -> do
87+ dest <- mallocArray0 len
88+ copyArray dest src len
89+ poke (advancePtr dest len) 0
90+ return dest
86
91
87jsaddleCallbacksToPtrs :: JSaddleCallbacks -> IO JSaddleCallbacksPtrs
92jsaddleCallbacksToPtrs :: JSaddleCallbacks -> IO JSaddleCallbacksPtrs
88jsaddleCallbacksToPtrs jc = JSaddleCallbacksPtrs
93jsaddleCallbacksToPtrs jc = JSaddleCallbacksPtrs