on develop help sign in
Don't use newCString/peekCString to copy C strings

That uses the foreign encoding and so can mangle them.

commit0afc206f76534d783b830f6fbfd8b6a24d8da135 authorRobert J. Macomber <robertm@dilithium> dateSat 20 Jan 2018, 17:08 (9 years ago) parentd3b2a6e
1 file changed+7−2
reflex-dom/src-android/Reflex/Dom/Android/MainWidget.hsc+7−2
reflex-dom/src-android/Reflex/Dom/Android/MainWidget.hsc+7−2
@@ -11,10 +11,12 @@ import Data.Aeson
1111import Data.ByteString (ByteString)
1212import qualified Data.ByteString as BS
1313import qualified Data.ByteString.Lazy as LBS
14+import qualified Data.ByteString.Unsafe as BSU
1415import Data.IORef
1516import Data.Monoid
1617import Foreign.C.String
1718import Foreign.Marshal.Utils
19+import Foreign.Marshal.Array
1820import Foreign.Ptr
1921import Foreign.Storable
2022import Language.Javascript.JSaddle (JSM)
@@ -80,9 +82,12 @@ foreign import ccall "wrapper" wrapIO :: IO () -> IO (FunPtr (IO ()))
8082foreign import ccall "wrapper" wrapCStringIO :: (CString -> IO ()) -> IO (FunPtr (CString -> IO ()))
8183foreign import ccall "wrapper" wrapCStringIOCString :: (CString -> IO CString) -> IO (FunPtr (CString -> IO CString))
8284
83−--TODO: Get rid of the extra copy step
8485newCStringFromByteString :: 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
8691
8792jsaddleCallbacksToPtrs :: JSaddleCallbacks -> IO JSaddleCallbacksPtrs
8893jsaddleCallbacksToPtrs jc = JSaddleCallbacksPtrs