Commit 24f5f368 authored by Ben Gamari's avatar Ben Gamari Committed by Ben Gamari
Browse files

Binary: Use ByteString's copy in getBS

It's unclear how much of an effect on runtime this will have, but if
nothing else the code generation may be a tad better since the system's
`memcpy` will be used.

Test Plan: Validate

Reviewers: simonmar, austin

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D2401
parent ffe46605
......@@ -70,7 +70,7 @@ import SrcLoc
import Foreign
import Data.Array
import Data.ByteString (ByteString)
import qualified Data.ByteString.Internal as BS
import qualified Data.ByteString as BS
import qualified Data.ByteString.Unsafe as BS
import Data.IORef
import Data.Char ( ord, chr )
......@@ -664,7 +664,7 @@ getDictionary bh = do
-- The Symbol Table
---------------------------------------------------------
-- On disk, the symbol table is an array of IfaceExtName, when
-- On disk, the symbol table is an array of IfExtName, when
-- reading it in we turn it into a SymbolTable.
type SymbolTable = Array Int Name
......@@ -692,25 +692,18 @@ putBS bh bs =
go (n+1)
go 0
{- -- possible faster version, not quite there yet:
getBS bh@BinMem{} = do
(I# l) <- get bh
arr <- readIORef (arr_r bh)
off <- readFastMutInt (off_r bh)
return $! (mkFastSubBytesBA# arr off l)
-}
getBS :: BinHandle -> IO ByteString
getBS bh = do
l <- get bh
fp <- mallocForeignPtrBytes l
withForeignPtr fp $ \ptr -> do
let go n | n == l = return $ BS.fromForeignPtr fp 0 l
| otherwise = do
b <- getByte bh
pokeElemOff ptr n b
go (n+1)
--
go 0
l <- get bh :: IO Int
arr <- readIORef (_arr_r bh)
sz <- readFastMutInt (_sz_r bh)
off <- readFastMutInt (_off_r bh)
when (off + l > sz) $
ioError (mkIOError eofErrorType "Data.Binary.getBS" Nothing Nothing)
writeFastMutInt (_off_r bh) (off+l)
withForeignPtr arr $ \ptr -> do
bs <- BS.unsafePackCStringLen (castPtr $ ptr `plusPtr` off, fromIntegral l)
return $! BS.copy bs
instance Binary ByteString where
put_ bh f = putBS bh f
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment