@@ -32,6 +32,7 @@ module Streamly.Data.Serialize
33#include "assert.hs"
33#include "assert.hs"
35+import Data.Int (Int64)
35import Data.Word (Word8)
36import Data.Word (Word8)
36import Streamly.Internal.Data.Array.Type (Array(..))
37import Streamly.Internal.Data.Array.Type (Array(..))
37import Streamly.Internal.Data.Serialize (Serialize(..), Size(..))
38import Streamly.Internal.Data.Serialize (Serialize(..), Size(..))
@@ -62,9 +63,12 @@ encodeAs ps a =
62 case size :: Size a of
63 case size :: Size a of
63 ConstSize sz -> sz
64 ConstSize sz -> sz
64 VarSize f -> f a
65 VarSize f -> f a
66+ -- We encode the length of the encoding as a header hence the 8 extra
67+ -- bytes to encode Int64
65− mbarr <- Unbox.newBytesAs ps len
68+ mbarr <- Unbox.newBytesAs ps (8 + len)
66− nextOff <- serialize 0 mbarr a
69+ off1 <- serialize 0 mbarr (fromIntegral len :: Int64)
70+ off2 <- serialize off1 mbarr a
67− assertM(nextOff == len)
71+ assertM(off2 == len + off1)
68 pure $ Array mbarr 0 len
72 pure $ Array mbarr 0 len
70{-# INLINE encode #-}
74{-# INLINE encode #-}
@@ -82,7 +86,9 @@ pinnedEncode = encodeAs Pinned
82{-# INLINE decode #-}
86{-# INLINE decode #-}
83decode :: Serialize a => Array Word8 -> a
87decode :: Serialize a => Array Word8 -> a
84decode arr@(Array {..}) = unsafeInlineIO $ do
88decode arr@(Array {..}) = unsafeInlineIO $ do
85− let len = Array.length arr
89+ let lenArr = Array.length arr
90+ (off1, lenEncoding :: Int64) <- deserialize 0 arrContents
86− (nextOff, val) <- deserialize 0 arrContents
91+ (off2, val) <- deserialize off1 arrContents
87− assertM(nextOff == len)
92+ assertM(fromIntegral lenEncoding + off1 == off2)
93+ assertM(lenArr == off2)