on master help sign in
Use 4 bytes for encoding header length instead of 2 bytes
commit763460b1b64c456b3328a5b92cfd87edb46b662e authorAdithya Kumar <adithya@composewell.com> dateWed 27 Sep 2023, 00:21 (3 years ago) parent3d1fd98
1 file changed+8−6
core/src/Streamly/Internal/Data/Serialize/TH/RecHeader.hs+8−6
core/src/Streamly/Internal/Data/Serialize/TH/RecHeader.hs+8−6
@@ -22,7 +22,7 @@ module Streamly.Internal.Data.Serialize.TH.RecHeader
2222
2323import Control.Monad (void)
2424import Data.List (foldl')
25−import Data.Word (Word16, Word32, Word8)
25+import Data.Word (Word32, Word8)
2626import Data.Maybe (fromJust)
2727import Language.Haskell.TH
2828import Streamly.Internal.Data.Serialize.Type (Serialize(..))
@@ -164,8 +164,10 @@ sizeOfHeader (SimpleDataCon _ fields) =
164164 where
165165
166166 sizeForFinalOff = 4
167− sizeForHeaderLength = 2 -- Max header length is (255 * (255 + 1) + 1) and
168− -- hence 2 bytes is enough to store it.
167+ sizeForHeaderLength = 4 -- Max header length is (255 * (255 + 1) + 1) and
168+ -- hence 2 bytes is enough to store it. But we still
169+ -- use 4 bytes as using 2 bytes introduces
170+ -- regression.
169171 sizeForNumFields = 1 -- At max 255 fields in the record constructor
170172 sizeForFieldLen = 1 -- At max 255 letters in the key
171173
@@ -239,7 +241,7 @@ mkSerializeExpr initialOffset (con@(SimpleDataCon cname fields)) = do
239241 serialize
240242 ($(varE initialOffset) + 4)
241243 $(varE _arr)
242− ($(litIntegral hlen) :: Word16)
244+ ($(litIntegral hlen) :: Word32)
243245 $(varP (makeI 0)) <- $(serializeW8List afterHLen _arr hval)
244246 let $(openConstructor cname (length fields)) = $(varE _val)
245247 finalOff <- $(mkSerializeExprFields 'serializeWithSize fields)
@@ -385,11 +387,11 @@ mkDeserializeExpr :: Name -> Name -> Name -> SimpleDataCon -> Q Exp
385387mkDeserializeExpr initialOff endOff deserializeWithKeys con = do
386388 hOff <- newName "hOff"
387389 let sizeForFinalOff = 4 -- Word32
388− sizeForHeaderLength = 2 -- Word16
390+ sizeForHeaderLength = 4 -- Word32
389391 sizePreData = sizeForFinalOff + sizeForHeaderLength + hlen
390392 [|do (hlenOff, encLen :: Word32) <-
391393 deserialize $(varE initialOff) $(varE _arr) $(varE endOff)
392− ($(varP hOff), hlen1 :: Word16) <-
394+ ($(varP hOff), hlen1 :: Word32) <-
393395 deserialize hlenOff $(varE _arr) $(varE endOff)
394396 if (hlen1 == $(litIntegral hlen)) && $(xorCmp hval hOff _arr)
395397 then do