on master help sign in
Use 4 bytes for encoding header length instead of 2 bytes
763460bAdithya Kumar
core/src/Streamly/Internal/Data/Serialize/TH/RecHeader.hs+8−6
@@ -22,7 +22,7 @@ module Streamly.Internal.Data.Serialize.TH.RecHeader
22
22
23import Control.Monad (void)
23import Control.Monad (void)
24import Data.List (foldl')
24import Data.List (foldl')
25−import Data.Word (Word16, Word32, Word8)
25+import Data.Word (Word32, Word8)
26import Data.Maybe (fromJust)
26import Data.Maybe (fromJust)
27import Language.Haskell.TH
27import Language.Haskell.TH
28import Streamly.Internal.Data.Serialize.Type (Serialize(..))
28import Streamly.Internal.Data.Serialize.Type (Serialize(..))
@@ -164,8 +164,10 @@ sizeOfHeader (SimpleDataCon _ fields) =
164 where
164 where
165
165
166 sizeForFinalOff = 4
166 sizeForFinalOff = 4
167− sizeForHeaderLength = 2 -- Max header length is (255 * (255 + 1) + 1) and
167+ sizeForHeaderLength = 4 -- Max header length is (255 * (255 + 1) + 1) and
168− -- hence 2 bytes is enough to store it.
168+ -- hence 2 bytes is enough to store it. But we still
169+ -- use 4 bytes as using 2 bytes introduces
170+ -- regression.
169 sizeForNumFields = 1 -- At max 255 fields in the record constructor
171 sizeForNumFields = 1 -- At max 255 fields in the record constructor
170 sizeForFieldLen = 1 -- At max 255 letters in the key
172 sizeForFieldLen = 1 -- At max 255 letters in the key
171
173
@@ -239,7 +241,7 @@ mkSerializeExpr initialOffset (con@(SimpleDataCon cname fields)) = do
239 serialize
241 serialize
240 ($(varE initialOffset) + 4)
242 ($(varE initialOffset) + 4)
241 $(varE _arr)
243 $(varE _arr)
242− ($(litIntegral hlen) :: Word16)
244+ ($(litIntegral hlen) :: Word32)
243 $(varP (makeI 0)) <- $(serializeW8List afterHLen _arr hval)
245 $(varP (makeI 0)) <- $(serializeW8List afterHLen _arr hval)
244 let $(openConstructor cname (length fields)) = $(varE _val)
246 let $(openConstructor cname (length fields)) = $(varE _val)
245 finalOff <- $(mkSerializeExprFields 'serializeWithSize fields)
247 finalOff <- $(mkSerializeExprFields 'serializeWithSize fields)
@@ -385,11 +387,11 @@ mkDeserializeExpr :: Name -> Name -> Name -> SimpleDataCon -> Q Exp
385mkDeserializeExpr initialOff endOff deserializeWithKeys con = do
387mkDeserializeExpr initialOff endOff deserializeWithKeys con = do
386 hOff <- newName "hOff"
388 hOff <- newName "hOff"
387 let sizeForFinalOff = 4 -- Word32
389 let sizeForFinalOff = 4 -- Word32
388− sizeForHeaderLength = 2 -- Word16
390+ sizeForHeaderLength = 4 -- Word32
389 sizePreData = sizeForFinalOff + sizeForHeaderLength + hlen
391 sizePreData = sizeForFinalOff + sizeForHeaderLength + hlen
390 [|do (hlenOff, encLen :: Word32) <-
392 [|do (hlenOff, encLen :: Word32) <-
391 deserialize $(varE initialOff) $(varE _arr) $(varE endOff)
393 deserialize $(varE initialOff) $(varE _arr) $(varE endOff)
392− ($(varP hOff), hlen1 :: Word16) <-
394+ ($(varP hOff), hlen1 :: Word32) <-
393 deserialize hlenOff $(varE _arr) $(varE endOff)
395 deserialize hlenOff $(varE _arr) $(varE endOff)
394 if (hlen1 == $(litIntegral hlen)) && $(xorCmp hval hOff _arr)
396 if (hlen1 == $(litIntegral hlen)) && $(xorCmp hval hOff _arr)
395 then do
397 then do