diff options
author | Josh Meredith <joshmeredith2008@gmail.com> | 2020-03-23 04:01:05 +1100 |
---|---|---|
committer | Josh Meredith <joshmeredith2008@gmail.com> | 2020-04-10 23:37:08 -0400 |
commit | bcf72afe16c851afae3e0723ea851946750e7b30 (patch) | |
tree | f5d852e7cb6945bb141a0c6ed180fa449bf03a67 /compiler/utils/Binary.hs | |
parent | bcafaa82a0223afd5d103e052ab9a097a676e5ea (diff) | |
download | haskell-wip/extensible-interface-files.tar.gz |
Implement extensible interface fileswip/extensible-interface-files
Diffstat (limited to 'compiler/utils/Binary.hs')
-rw-r--r-- | compiler/utils/Binary.hs | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/compiler/utils/Binary.hs b/compiler/utils/Binary.hs index 98d4e5ad56..529519df1d 100644 --- a/compiler/utils/Binary.hs +++ b/compiler/utils/Binary.hs @@ -27,6 +27,8 @@ module Binary {-type-} BinHandle, SymbolTable, Dictionary, + BinData(..), dataHandle, handleData, + openBinMem, -- closeBin, @@ -73,6 +75,7 @@ import Fingerprint import GHC.Types.Basic import GHC.Types.SrcLoc +import Control.DeepSeq import Foreign import Data.Array import Data.ByteString (ByteString) @@ -95,6 +98,44 @@ import GHC.Serialized type BinArray = ForeignPtr Word8 + + +--------------------------------------------------------------- +-- BinData +--------------------------------------------------------------- + +data BinData = BinData Int BinArray + +instance NFData BinData where + rnf (BinData sz _) = rnf sz + +instance Binary BinData where + put_ bh (BinData sz dat) = do + put_ bh sz + putPrim bh sz $ \dest -> + withForeignPtr dat $ \orig -> + copyBytes dest orig sz + -- + get bh = do + sz <- get bh + dat <- mallocForeignPtrBytes sz + getPrim bh sz $ \orig -> + withForeignPtr dat $ \dest -> + copyBytes dest orig sz + return (BinData sz dat) + +dataHandle :: BinData -> IO BinHandle +dataHandle (BinData size bin) = do + ixr <- newFastMutInt + szr <- newFastMutInt + writeFastMutInt ixr 0 + writeFastMutInt szr size + binr <- newIORef bin + return (BinMem noUserData ixr szr binr) + +handleData :: BinHandle -> IO BinData +handleData (BinMem _ ixr _ binr) = BinData <$> readFastMutInt ixr <*> readIORef binr + --------------------------------------------------------------- -- BinHandle --------------------------------------------------------------- |