on master help sign in
Rename serialize/deserialize/size of Serialize class
commit13581bfec116019b93eb07e5d88b2e075886c7df authorHarendra Kumar <harendra@composewell.com> dateSat 25 Nov 2023, 23:50 (3 years ago) parent1efeed4
10 files changed+190−187
benchmark/Streamly/Benchmark/Data/Serialize.hs+3−3 core/src/Streamly/Data/MutByteArray.hs+3−3 core/src/Streamly/Internal/Data/Array.hs+4−3 core/src/Streamly/Internal/Data/MutByteArray.hs+59−58 core/src/Streamly/Internal/Data/Serialize/TH.hs+16−16 core/src/Streamly/Internal/Data/Serialize/TH/Bottom.hs+17−17 core/src/Streamly/Internal/Data/Serialize/TH/RecHeader.hs+23−23 core/src/Streamly/Internal/Data/Serialize/Type.hs+58−57 test/Streamly/Test/Data/Serialize.hs+4−4 test/Streamly/Test/Data/Unbox.hs+3−3
benchmark/Streamly/Benchmark/Data/Serialize.hs+3−3
@@ -49,8 +49,8 @@ import Streamly.Benchmark.Data.Serialize.RecNonCompatible
4949#else
5050#define SERIALIZE_CLASS Serialize
5151#define DERIVE_CLASS(typ) $(deriveSerialize [d|instance Serialize typ|])
52−#define SERIALIZE_OP serialize
53−#define DESERIALIZE_OP deserialize
52+#define SERIALIZE_OP serializeAt
53+#define DESERIALIZE_OP deserializeAt
5454#endif
5555
5656-------------------------------------------------------------------------------
@@ -288,7 +288,7 @@ getSize :: forall a. SERIALIZE_CLASS a => a -> Int
288288#ifdef USE_UNBOX
289289getSize _ = sizeOf (Proxy :: Proxy a)
290290#else
291−getSize = size 0
291+getSize = addSizeTo 0
292292#endif
293293
294294-------------------------------------------------------------------------------
core/src/Streamly/Data/MutByteArray.hs+3−3
@@ -75,9 +75,9 @@ module Streamly.Data.MutByteArray
7575 -- Deriving Serialize
7676 , SerializeConfig
7777 , serializeConfig
78− , inlineSize
79− , inlineSerialize
80− , inlineDeserialize
78+ , inlineAddSizeTo
79+ , inlineSerializeAt
80+ , inlineDeserializeAt
8181
8282 , deriveSerialize
8383 , deriveSerializeWith
core/src/Streamly/Internal/Data/Array.hs+4−3
@@ -561,9 +561,9 @@ streamFold f arr = f (A.read arr)
561561encodeAs :: forall a. Serialize a => PinnedState -> a -> Array Word8
562562encodeAs ps a =
563563 unsafeInlineIO $ do
564− let len = Serialize.size 0 a
564+ let len = Serialize.addSizeTo 0 a
565565 mbarr <- MBA.newBytesAs ps len
566− off <- Serialize.serialize 0 mbarr a
566+ off <- Serialize.serializeAt 0 mbarr a
567567 assertM(len == off)
568568 pure $ Array mbarr 0 off
569569
@@ -584,6 +584,7 @@ pinnedSerialize = encodeAs Pinned
584584deserialize :: Serialize a => Array Word8 -> a
585585deserialize arr@(Array {..}) = unsafeInlineIO $ do
586586 let lenArr = length arr
587− (off, val) <- Serialize.deserialize arrStart arrContents (arrStart + lenArr)
587+ (off, val) <-
588+ Serialize.deserializeAt arrStart arrContents (arrStart + lenArr)
588589 assertM(off == arrStart + lenArr)
589590 pure val
core/src/Streamly/Internal/Data/MutByteArray.hs+59−58
@@ -88,73 +88,73 @@ import Streamly.Internal.Data.Unbox.TH
8888-- $(Serialize.deriveSerialize ''Maybe)
8989instance Serialize a => Serialize (Maybe a) where
9090
91− {-# INLINE size #-}
92− size acc x =
91+ {-# INLINE addSizeTo #-}
92+ addSizeTo acc x =
9393 case x of
9494 Nothing -> (acc + 1)
95− Just field0 -> (size (acc + 1)) field0
95+ Just field0 -> (addSizeTo (acc + 1)) field0
9696
97− {-# INLINE deserialize #-}
98− deserialize initialOffset arr endOffset = do
99− (i0, tag) <- ((deserialize initialOffset) arr) endOffset
97+ {-# INLINE deserializeAt #-}
98+ deserializeAt initialOffset arr endOffset = do
99+ (i0, tag) <- ((deserializeAt initialOffset) arr) endOffset
100100 case tag :: Word8 of
101101 0 -> pure (i0, Nothing)
102− 1 -> do (i1, a0) <- ((deserialize i0) arr) endOffset
102+ 1 -> do (i1, a0) <- ((deserializeAt i0) arr) endOffset
103103 pure (i1, Just a0)
104104 _ -> error "Found invalid tag while peeking (Maybe a)"
105105
106− {-# INLINE serialize #-}
107− serialize initialOffset arr val =
106+ {-# INLINE serializeAt #-}
107+ serializeAt initialOffset arr val =
108108 case val of
109109 Nothing -> do
110− i0 <- ((serialize initialOffset) arr) (0 :: Word8)
110+ i0 <- ((serializeAt initialOffset) arr) (0 :: Word8)
111111 pure i0
112112 Just field0 -> do
113− i0 <- ((serialize initialOffset) arr) (1 :: Word8)
114− i1 <- ((serialize i0) arr) field0
113+ i0 <- ((serializeAt initialOffset) arr) (1 :: Word8)
114+ i1 <- ((serializeAt i0) arr) field0
115115 pure i1
116116
117117-- $(Serialize.deriveSerialize ''Either)
118118instance (Serialize a, Serialize b) => Serialize (Either a b) where
119119
120− {-# INLINE size #-}
121− size acc x =
120+ {-# INLINE addSizeTo #-}
121+ addSizeTo acc x =
122122 case x of
123− Left field0 -> (size (acc + 1)) field0
124− Right field0 -> (size (acc + 1)) field0
123+ Left field0 -> (addSizeTo (acc + 1)) field0
124+ Right field0 -> (addSizeTo (acc + 1)) field0
125125
126− {-# INLINE deserialize #-}
127− deserialize initialOffset arr endOffset = do
128− (i0, tag) <- ((deserialize initialOffset) arr) endOffset
126+ {-# INLINE deserializeAt #-}
127+ deserializeAt initialOffset arr endOffset = do
128+ (i0, tag) <- ((deserializeAt initialOffset) arr) endOffset
129129 case tag :: Word8 of
130− 0 -> do (i1, a0) <- ((deserialize i0) arr) endOffset
130+ 0 -> do (i1, a0) <- ((deserializeAt i0) arr) endOffset
131131 pure (i1, Left a0)
132− 1 -> do (i1, a0) <- ((deserialize i0) arr) endOffset
132+ 1 -> do (i1, a0) <- ((deserializeAt i0) arr) endOffset
133133 pure (i1, Right a0)
134134 _ -> error "Found invalid tag while peeking (Either a b)"
135135
136− {-# INLINE serialize #-}
137− serialize initialOffset arr val =
136+ {-# INLINE serializeAt #-}
137+ serializeAt initialOffset arr val =
138138 case val of
139139 Left field0 -> do
140− i0 <- ((serialize initialOffset) arr) (0 :: Word8)
141− i1 <- ((serialize i0) arr) field0
140+ i0 <- ((serializeAt initialOffset) arr) (0 :: Word8)
141+ i1 <- ((serializeAt i0) arr) field0
142142 pure i1
143143 Right field0 -> do
144− i0 <- ((serialize initialOffset) arr) (1 :: Word8)
145− i1 <- ((serialize i0) arr) field0
144+ i0 <- ((serializeAt initialOffset) arr) (1 :: Word8)
145+ i1 <- ((serializeAt i0) arr) field0
146146 pure i1
147147
148148instance Serialize (Proxy a) where
149149
150− {-# INLINE size #-}
151− size acc _ = (acc + 1)
150+ {-# INLINE addSizeTo #-}
151+ addSizeTo acc _ = (acc + 1)
152152
153− {-# INLINE deserialize #-}
154− deserialize initialOffset _ _ = pure ((initialOffset + 1), Proxy)
153+ {-# INLINE deserializeAt #-}
154+ deserializeAt initialOffset _ _ = pure ((initialOffset + 1), Proxy)
155155
156− {-# INLINE serialize #-}
157− serialize initialOffset _ _ = pure (initialOffset + 1)
156+ {-# INLINE serializeAt #-}
157+ serializeAt initialOffset _ _ = pure (initialOffset + 1)
158158
159159--------------------------------------------------------------------------------
160160-- Integer
@@ -168,39 +168,39 @@ data LiftedInteger
168168-- $(Serialize.deriveSerialize ''LiftedInteger)
169169instance Serialize LiftedInteger where
170170
171− {-# INLINE size #-}
172− size acc x =
171+ {-# INLINE addSizeTo #-}
172+ addSizeTo acc x =
173173 case x of
174− LIS field0 -> (size (acc + 1)) field0
175− LIP field0 -> (size (acc + 1)) field0
176− LIN field0 -> (size (acc + 1)) field0
174+ LIS field0 -> (addSizeTo (acc + 1)) field0
175+ LIP field0 -> (addSizeTo (acc + 1)) field0
176+ LIN field0 -> (addSizeTo (acc + 1)) field0
177177
178− {-# INLINE deserialize #-}
179− deserialize initialOffset arr endOffset = do
180− (i0, tag) <- ((deserialize initialOffset) arr) endOffset
178+ {-# INLINE deserializeAt #-}
179+ deserializeAt initialOffset arr endOffset = do
180+ (i0, tag) <- ((deserializeAt initialOffset) arr) endOffset
181181 case tag :: Word8 of
182− 0 -> do (i1, a0) <- ((deserialize i0) arr) endOffset
182+ 0 -> do (i1, a0) <- ((deserializeAt i0) arr) endOffset
183183 pure (i1, LIS a0)
184− 1 -> do (i1, a0) <- ((deserialize i0) arr) endOffset
184+ 1 -> do (i1, a0) <- ((deserializeAt i0) arr) endOffset
185185 pure (i1, LIP a0)
186− 2 -> do (i1, a0) <- ((deserialize i0) arr) endOffset
186+ 2 -> do (i1, a0) <- ((deserializeAt i0) arr) endOffset
187187 pure (i1, LIN a0)
188188 _ -> error "Found invalid tag while peeking (LiftedInteger)"
189189
190− {-# INLINE serialize #-}
191− serialize initialOffset arr val =
190+ {-# INLINE serializeAt #-}
191+ serializeAt initialOffset arr val =
192192 case val of
193193 LIS field0 -> do
194− i0 <- ((serialize initialOffset) arr) (0 :: Word8)
195− i1 <- ((serialize i0) arr) field0
194+ i0 <- ((serializeAt initialOffset) arr) (0 :: Word8)
195+ i1 <- ((serializeAt i0) arr) field0
196196 pure i1
197197 LIP field0 -> do
198− i0 <- ((serialize initialOffset) arr) (1 :: Word8)
199− i1 <- ((serialize i0) arr) field0
198+ i0 <- ((serializeAt initialOffset) arr) (1 :: Word8)
199+ i1 <- ((serializeAt i0) arr) field0
200200 pure i1
201201 LIN field0 -> do
202− i0 <- ((serialize initialOffset) arr) (2 :: Word8)
203− i1 <- ((serialize i0) arr) field0
202+ i0 <- ((serializeAt initialOffset) arr) (2 :: Word8)
203+ i1 <- ((serializeAt i0) arr) field0
204204 pure i1
205205
206206#if __GLASGOW_HASKELL__ >= 900
@@ -240,11 +240,12 @@ unliftInteger (LIN (Array (MutByteArray x) _ _)) =
240240#endif
241241
242242instance Serialize Integer where
243− {-# INLINE size #-}
244− size i a = size i (liftInteger a)
243+ {-# INLINE addSizeTo #-}
244+ addSizeTo i a = addSizeTo i (liftInteger a)
245245
246− {-# INLINE deserialize #-}
247− deserialize off arr end = fmap unliftInteger <$> deserialize off arr end
246+ {-# INLINE deserializeAt #-}
247+ deserializeAt off arr end =
248+ fmap unliftInteger <$> deserializeAt off arr end
248249
249− {-# INLINE serialize #-}
250− serialize off arr val = serialize off arr (liftInteger val)
250+ {-# INLINE serializeAt #-}
251+ serializeAt off arr val = serializeAt off arr (liftInteger val)
core/src/Streamly/Internal/Data/Serialize/TH.hs+16−16
@@ -50,7 +50,7 @@ import Streamly.Internal.Data.Serialize.TH.RecHeader
5050--------------------------------------------------------------------------------
5151
5252exprGetSize :: Q Exp -> (Int, Type) -> Q Exp
53−exprGetSize acc (i, _) = [|size $(acc) $(varE (mkFieldName i))|]
53+exprGetSize acc (i, _) = [|addSizeTo $(acc) $(varE (mkFieldName i))|]
5454
5555getTagSize :: Int -> Int
5656getTagSize numConstructors
@@ -170,9 +170,9 @@ mkSizeDec (SerializeConfig {..}) headTy cons = do
170170 pure
171171 ( maybe
172172 []
173− (\x -> [PragmaD (InlineP 'size x FunLike AllPhases)])
173+ (\x -> [PragmaD (InlineP 'addSizeTo x FunLike AllPhases)])
174174 cfgInlineSize
175− ++ [FunD 'size [Clause [] (NormalB sizeOfMethod) []]]
175+ ++ [FunD 'addSizeTo [Clause [] (NormalB sizeOfMethod) []]]
176176 )
177177
178178--------------------------------------------------------------------------------
@@ -192,7 +192,7 @@ mkDeserializeExpr True False headTy tyOfTy =
192192 conLen <- newName "conLen"
193193 off1 <- newName "off1"
194194 [|do ($(varP off1), $(varP conLen) :: Word8) <-
195− deserialize
195+ deserializeAt
196196 $(varE _initialOffset)
197197 $(varE _arr)
198198 $(varE _endOffset)
@@ -212,7 +212,7 @@ mkDeserializeExpr True False headTy tyOfTy =
212212 [|($(litIntegral lenCname) == $(varE conLen))
213213 && $(xorCmp tag off _arr)|]
214214 [|let $(varP (makeI 0)) = $(varE off) + $(litIntegral lenCname)
215− in $(mkDeserializeExprOne 'deserialize con)|]
215+ in $(mkDeserializeExprOne 'deserializeAt con)|]
216216
217217mkDeserializeExpr False False headTy tyOfTy =
218218 case tyOfTy of
@@ -223,7 +223,7 @@ mkDeserializeExpr False False headTy tyOfTy =
223223 TheType con ->
224224 letE
225225 [valD (varP (mkName "i0")) (normalB (varE _initialOffset)) []]
226− (mkDeserializeExprOne 'deserialize con)
226+ (mkDeserializeExprOne 'deserializeAt con)
227227 -- Sum type
228228 MultiType cons -> do
229229 let lenCons = length cons
@@ -231,7 +231,7 @@ mkDeserializeExpr False False headTy tyOfTy =
231231 doE
232232 [ bindS
233233 (tupP [varP (mkName "i0"), varP _tag])
234− [|deserialize $(varE _initialOffset) $(varE _arr) $(varE _endOffset)|]
234+ [|deserializeAt $(varE _initialOffset) $(varE _arr) $(varE _endOffset)|]
235235 , noBindS
236236 (caseE
237237 (sigE (varE _tag) (conT tagType))
@@ -241,7 +241,7 @@ mkDeserializeExpr False False headTy tyOfTy =
241241 peekMatch (i, con) =
242242 match
243243 (litP (IntegerL i))
244− (normalB (mkDeserializeExprOne 'deserialize con)) []
244+ (normalB (mkDeserializeExprOne 'deserializeAt con)) []
245245 peekErr =
246246 match
247247 wildP
@@ -279,11 +279,11 @@ mkDeserializeDec (SerializeConfig {..}) headTy cons = do
279279 pure
280280 ( maybe
281281 []
282− (\x -> [PragmaD (InlineP 'deserialize x FunLike AllPhases)])
282+ (\x -> [PragmaD (InlineP 'deserializeAt x FunLike AllPhases)])
283283 cfgInlineDeserialize
284284 ++
285285 [ FunD
286− 'deserialize
286+ 'deserializeAt
287287 [ Clause
288288 (if isUnitType cons && not cfgConstructorTagAsString
289289 then [VarP _initialOffset, WildP, WildP]
@@ -300,7 +300,7 @@ mkDeserializeDec (SerializeConfig {..}) headTy cons = do
300300
301301mkSerializeExprTag :: Name -> Int -> Q Exp
302302mkSerializeExprTag tagType tagVal =
303− [|serialize
303+ [|serializeAt
304304 $(varE _initialOffset)
305305 $(varE _arr)
306306 $((sigE (litE (IntegerL (fromIntegral tagVal))) (conT tagType)))|]
@@ -335,7 +335,7 @@ mkSerializeExpr True False tyOfTy =
335335 (doE [ bindS
336336 (varP (mkName "i0"))
337337 (serializeW8List _initialOffset _arr conEnc)
338− , noBindS (mkSerializeExprFields 'serialize fields)
338+ , noBindS (mkSerializeExprFields 'serializeAt fields)
339339 ])
340340
341341mkSerializeExpr False False tyOfTy =
@@ -351,7 +351,7 @@ mkSerializeExpr False False tyOfTy =
351351 [ matchConstructor
352352 cname
353353 (length fields)
354− (mkSerializeExprFields 'serialize fields)
354+ (mkSerializeExprFields 'serializeAt fields)
355355 ])
356356 -- Sum type
357357 (MultiType cons) -> do
@@ -368,7 +368,7 @@ mkSerializeExpr False False tyOfTy =
368368 (mkSerializeExprTag tagType tagVal)
369369 , noBindS
370370 (mkSerializeExprFields
371− 'serialize
371+ 'serializeAt
372372 fields)
373373 ]))
374374 (zip [0 ..] cons))
@@ -388,11 +388,11 @@ mkSerializeDec (SerializeConfig {..}) headTy cons = do
388388 pure
389389 ( maybe
390390 []
391− (\x -> [PragmaD (InlineP 'serialize x FunLike AllPhases)])
391+ (\x -> [PragmaD (InlineP 'serializeAt x FunLike AllPhases)])
392392 cfgInlineSerialize
393393 ++
394394 [FunD
395− 'serialize
395+ 'serializeAt
396396 [ Clause
397397 (if isUnitType cons && not cfgConstructorTagAsString
398398 then [VarP _initialOffset, WildP, WildP]
core/src/Streamly/Internal/Data/Serialize/TH/Bottom.hs+17−17
@@ -13,9 +13,9 @@ module Streamly.Internal.Data.Serialize.TH.Bottom
1313 -- ** Config
1414 SerializeConfig(..)
1515 , serializeConfig
16− , inlineSize
17− , inlineSerialize
18− , inlineDeserialize
16+ , inlineAddSizeTo
17+ , inlineSerializeAt
18+ , inlineDeserializeAt
1919 , encodeConstrNames
2020 , encodeRecordFields
2121
@@ -84,7 +84,7 @@ import Streamly.Internal.Data.Unbox.TH (DataCon(..))
8484-- 'serializeConfig' and config setter functions to generate desired Config. For
8585-- example:
8686--
87−-- >>> (inlineSize (Just Inline)) . (inlineSerialize (Just Inlinable)) serializeConfig
87+-- >>> (inlineAddSizeTo (Just Inline)) . (inlineSerializeAt (Just Inlinable)) serializeConfig
8888--
8989data SerializeConfig =
9090 SerializeConfig
@@ -95,11 +95,11 @@ data SerializeConfig =
9595 , cfgRecordSyntaxWithHeader :: Bool
9696 }
9797
98−-- | How should we inline the 'size' function? The default in 'serializeConfig'
99−-- is 'Nothing' which means left to the compiler. Forcing inline on @size@
98+-- | How should we inline the 'addSizeTo' function? The default in 'serializeConfig'
99+-- is 'Nothing' which means left to the compiler. Forcing inline on @addSizeTo@
100100-- function actually worsens some benchmarks and improves none.
101−inlineSize :: Maybe Inline -> SerializeConfig -> SerializeConfig
102−inlineSize v cfg = cfg {cfgInlineSize = v}
101+inlineAddSizeTo :: Maybe Inline -> SerializeConfig -> SerializeConfig
102+inlineAddSizeTo v cfg = cfg {cfgInlineSize = v}
103103
104104-- XXX Should we make the default Inlinable instead?
105105
@@ -108,15 +108,15 @@ inlineSize v cfg = cfg {cfgInlineSize = v}
108108-- the code and increase in compilation times when there are big functions and
109109-- too many nesting levels so you can change it accordingly. A 'Nothing' value
110110-- leaves the decision to the compiler.
111−inlineSerialize :: Maybe Inline -> SerializeConfig -> SerializeConfig
112−inlineSerialize v cfg = cfg {cfgInlineSerialize = v}
111+inlineSerializeAt :: Maybe Inline -> SerializeConfig -> SerializeConfig
112+inlineSerializeAt v cfg = cfg {cfgInlineSerialize = v}
113113
114114-- XXX Should we make the default Inlinable instead?
115115
116116-- | How should we inline the 'deserialize' function? See guidelines in
117−-- 'inlineSerialize'.
118−inlineDeserialize :: Maybe Inline -> SerializeConfig -> SerializeConfig
119−inlineDeserialize v cfg = cfg {cfgInlineDeserialize = v}
117+-- 'inlineSerializeAt'.
118+inlineDeserializeAt :: Maybe Inline -> SerializeConfig -> SerializeConfig
119+inlineDeserializeAt v cfg = cfg {cfgInlineDeserialize = v}
120120
121121-- | __Experimental__
122122--
@@ -184,9 +184,9 @@ encodeRecordFields v cfg = cfg {cfgRecordSyntaxWithHeader = v}
184184
185185-- | The default configuration settings are:
186186--
187−-- * 'inlineSize' 'Nothing'
188−-- * 'inlineSerialize' (Just Inline)
189−-- * 'inlineDeserialize' (Just Inline)
187+-- * 'inlineAddSizeTo' 'Nothing'
188+-- * 'inlineSerializeAt' (Just Inline)
189+-- * 'inlineDeserializeAt' (Just Inline)
190190--
191191serializeConfig :: SerializeConfig
192192serializeConfig =
@@ -425,7 +425,7 @@ serializeW8List off arr w8List = do
425425 makeBind i =
426426 bindS
427427 (varP (makeN (i + 1)))
428− [|$(varE 'serialize)
428+ [|$(varE 'serializeAt)
429429 $(varE (makeN i))
430430 $(varE arr)
431431 ($(litIntegral (w8List !! i)) :: Word8)|]
core/src/Streamly/Internal/Data/Serialize/TH/RecHeader.hs+23−23
@@ -103,36 +103,36 @@ newtype CompactList a =
103103-- the list is 255.
104104instance forall a. Serialize a => Serialize (CompactList a) where
105105
106− -- {-# INLINE size #-}
107− size acc (CompactList xs) =
108− foldl' size (acc + (Unbox.sizeOf (Proxy :: Proxy Word8))) xs
106+ -- {-# INLINE addSizeTo #-}
107+ addSizeTo acc (CompactList xs) =
108+ foldl' addSizeTo (acc + (Unbox.sizeOf (Proxy :: Proxy Word8))) xs
109109
110110 -- Inlining this causes large compilation times for tests
111− {-# INLINABLE deserialize #-}
112− deserialize off arr sz = do
113− (off1, len8) <- deserialize off arr sz :: IO (Int, Word8)
111+ {-# INLINABLE deserializeAt #-}
112+ deserializeAt off arr sz = do
113+ (off1, len8) <- deserializeAt off arr sz :: IO (Int, Word8)
114114 let len = w8_int len8
115115 peekList f o i | i >= 3 = do
116116 -- Unfold the loop three times
117− (o1, x1) <- deserialize o arr sz
118− (o2, x2) <- deserialize o1 arr sz
119− (o3, x3) <- deserialize o2 arr sz
117+ (o1, x1) <- deserializeAt o arr sz
118+ (o2, x2) <- deserializeAt o1 arr sz
119+ (o3, x3) <- deserializeAt o2 arr sz
120120 peekList (f . (\xs -> x1:x2:x3:xs)) o3 (i - 3)
121121 peekList f o 0 = pure (o, f [])
122122 peekList f o i = do
123− (o1, x) <- deserialize o arr sz
123+ (o1, x) <- deserializeAt o arr sz
124124 peekList (f . (x:)) o1 (i - 1)
125125 (nextOff, lst) <- peekList id off1 len
126126 pure (nextOff, CompactList lst)
127127
128128 -- Inlining this causes large compilation times for tests
129− {-# INLINABLE serialize #-}
130− serialize off arr (CompactList val) = do
131− void $ serialize off arr (int_w8 (length val) :: Word8)
129+ {-# INLINABLE serializeAt #-}
130+ serializeAt off arr (CompactList val) = do
131+ void $ serializeAt off arr (int_w8 (length val) :: Word8)
132132 let off1 = off + Unbox.sizeOf (Proxy :: Proxy Word8)
133133 let pokeList o [] = pure o
134134 pokeList o (x:xs) = do
135− o1 <- serialize o arr x
135+ o1 <- serializeAt o arr x
136136 pokeList o1 xs
137137 pokeList off1 val
138138
@@ -154,7 +154,7 @@ isMaybeType _ = False
154154-- We add 4 here because we use 'serializeWithSize' for serializing.
155155exprGetSize :: Q Exp -> (Int, Type) -> Q Exp
156156exprGetSize acc (i, _) =
157− [|size $(acc) $(varE (mkFieldName i)) + 4|]
157+ [|addSizeTo $(acc) $(varE (mkFieldName i)) + 4|]
158158
159159sizeOfHeader :: SimpleDataCon -> Int
160160sizeOfHeader (SimpleDataCon _ fields) =
@@ -227,7 +227,7 @@ headerValue (SimpleDataCon _ fields) =
227227{-# INLINE serializeWithSize #-}
228228serializeWithSize :: Serialize a => Int -> MutByteArray -> a -> IO Int
229229serializeWithSize off arr val = do
230− off1 <- serialize (off + 4) arr val
230+ off1 <- serializeAt (off + 4) arr val
231231 Unbox.pokeAt off arr (int_w32 (off1 - off - 4) :: Word32)
232232 pure off1
233233
@@ -238,7 +238,7 @@ mkRecSerializeExpr initialOffset (con@(SimpleDataCon cname fields)) = do
238238 -- We first compare the header length encoded and the current header
239239 -- length. Only if the header lengths match, we compare the headers.
240240 [|do $(varP afterHLen) <-
241− serialize
241+ serializeAt
242242 ($(varE initialOffset) + 4)
243243 $(varE _arr)
244244 ($(litIntegral hlen) :: Word32)
@@ -264,7 +264,7 @@ mkRecSerializeExpr initialOffset (con@(SimpleDataCon cname fields)) = do
264264{-# INLINE deserializeWithSize #-}
265265deserializeWithSize ::
266266 Serialize a => Int -> MutByteArray -> Int -> IO (Int, a)
267−deserializeWithSize off arr endOff = deserialize (off + 4) arr endOff
267+deserializeWithSize off arr endOff = deserializeAt (off + 4) arr endOff
268268
269269conUpdateFuncDec :: Name -> [Field] -> Q [Dec]
270270conUpdateFuncDec funcName fields = do
@@ -282,7 +282,7 @@ conUpdateFuncDec funcName fields = do
282282 wildP
283283 (normalB
284284 [|do (valOff, valLen :: Word32) <-
285− deserialize
285+ deserializeAt
286286 $(varE curOff)
287287 $(varE arr)
288288 $(varE endOff)
@@ -317,7 +317,7 @@ conUpdateFuncDec funcName fields = do
317317 (litP fnameLit)
318318 (normalB
319319 [|do (valOff, valLen :: Word32) <-
320− deserialize
320+ deserializeAt
321321 $(varE currOff)
322322 $(varE arr)
323323 $(varE endOff)
@@ -345,7 +345,7 @@ mkDeserializeKeysDec funcName updateFunc (SimpleDataCon cname fields) = do
345345 errorUnsupported "The datatype should use record syntax."
346346 method <-
347347 [|do (dataOff, hlist :: CompactList (CompactList Word8)) <-
348− deserialize $(varE hOff) $(varE arr) $(varE endOff)
348+ deserializeAt $(varE hOff) $(varE arr) $(varE endOff)
349349 let keys = wListToString . unCompactList <$> unCompactList hlist
350350 ($(varP kvEncoded), _) <-
351351 foldlM
@@ -390,9 +390,9 @@ mkRecDeserializeExpr initialOff endOff deserializeWithKeys con = do
390390 sizeForHeaderLength = 4 -- Word32
391391 sizePreData = sizeForFinalOff + sizeForHeaderLength + hlen
392392 [|do (hlenOff, encLen :: Word32) <-
393− deserialize $(varE initialOff) $(varE _arr) $(varE endOff)
393+ deserializeAt $(varE initialOff) $(varE _arr) $(varE endOff)
394394 ($(varP hOff), hlen1 :: Word32) <-
395− deserialize hlenOff $(varE _arr) $(varE endOff)
395+ deserializeAt hlenOff $(varE _arr) $(varE endOff)
396396 if (hlen1 == $(litIntegral hlen)) && $(xorCmp hval hOff _arr)
397397 then do
398398 let $(varP (makeI 0)) =
core/src/Streamly/Internal/Data/Serialize/Type.hs+58−57
@@ -58,14 +58,14 @@ import GHC.Exts
5858-- particular constructor. For variable length data types the length is encoded
5959-- along with the data.
6060--
61−-- The 'deserialize' operation reads bytes from the mutable byte array and
61+-- The 'deserializeAt' operation reads bytes from the mutable byte array and
6262-- builds a Haskell data type from these bytes, the number of bytes it reads
63−-- depends on the type and the encoded value it is reading. 'serialize'
63+-- depends on the type and the encoded value it is reading. 'serializeAt'
6464-- operation converts a Haskell data type to its binary representation which
65−-- must consist of as many bytes as returned by the @size@ operation on that
65+-- must consist of as many bytes as added by the @addSizeTo@ operation for that
6666-- value and then stores these bytes into the mutable byte array. The
67−-- programmer is expected to use the @size@ operation and allocate an array of
68−-- sufficient length before calling 'serialize'.
67+-- programmer is expected to use the @addSizeTo@ operation and allocate an
68+-- array of sufficient length before calling 'serializeAt'.
6969--
7070-- IMPORTANT: The serialized data's byte ordering remains the same as the host
7171-- machine's byte order. Therefore, it can not be deserialized from host
@@ -98,15 +98,15 @@ import GHC.Exts
9898--
9999-- >>> :{
100100-- instance Serialize Object where
101−-- size acc obj = size (size acc (_obj1 obj)) (_obj2 obj)
102−-- deserialize i arr len = do
101+-- addSizeTo acc obj = addSizeTo (addSizeTo acc (_obj1 obj)) (_obj2 obj)
102+-- deserializeAt i arr len = do
103103-- -- Check the array bounds before reading
104−-- (i1, x0) <- deserialize i arr len
105−-- (i2, x1) <- deserialize i1 arr len
104+-- (i1, x0) <- deserializeAt i arr len
105+-- (i2, x1) <- deserializeAt i1 arr len
106106-- pure (i2, Object x0 x1)
107−-- serialize i arr (Object x0 x1) = do
108−-- i1 <- serialize i arr x0
109−-- i2 <- serialize i1 arr x1
107+-- serializeAt i arr (Object x0 x1) = do
108+-- i1 <- serializeAt i arr x0
109+-- i2 <- serializeAt i1 arr x1
110110-- pure i2
111111-- :}
112112--
@@ -117,30 +117,30 @@ class Serialize a where
117117 -- It is of the form @Int -> a -> Int@ because you can have tail-recursive
118118 -- traversal of the structures.
119119
120− -- | @size accum value@ returns @accum@ incremented by the size of the
120+ -- | @addSizeTo accum value@ returns @accum@ incremented by the size of the
121121 -- serialized representation of @value@ in bytes. Size cannot be zero. It
122122 -- should be at least 1 byte.
123− size :: Int -> a -> Int
123+ addSizeTo :: Int -> a -> Int
124124
125125 -- We can implement the following functions without returning the `Int`
126126 -- offset but that may require traversing the Haskell structure again to get
127127 -- the size. Therefore, this is a performance optimization.
128128
129− -- | @deserialize byte-offset array arrayLen@ deserializes a value from the
129+ -- | @deserializeAt byte-offset array arrayLen@ deserializes a value from the
130130 -- given byte-offset in the array. Returns a tuple consisting of the next
131131 -- byte-offset and the deserialized value.
132132 --
133133 -- Throws an exception if the operation would exceed the supplied arrayLen.
134− deserialize :: Int -> MutByteArray -> Int -> IO (Int, a)
134+ deserializeAt :: Int -> MutByteArray -> Int -> IO (Int, a)
135135
136− -- | @serialize byte-offset array value@ writes the serialized
136+ -- | @serializeAt byte-offset array value@ writes the serialized
137137 -- representation of the @value@ in the array at the given byte-offset.
138138 -- Returns the next byte-offset.
139139 --
140140 -- This is an unsafe operation, the programmer must ensure that the array
141141 -- has enough space available to serialize the value as determined by the
142− -- @size@ operation.
143− serialize :: Int -> MutByteArray -> a -> IO Int
142+ -- @addSizeTo@ operation.
143+ serializeAt :: Int -> MutByteArray -> a -> IO Int
144144
145145--------------------------------------------------------------------------------
146146-- Instances
@@ -191,7 +191,7 @@ deserializeUnsafe off arr sz =
191191 if (next <= sz)
192192 then Unbox.peekAt off arr >>= \val -> pure (next, val)
193193 else error
194− $ "deserialize: accessing array at offset = "
194+ $ "deserializeAt: accessing array at offset = "
195195 ++ show (next - 1)
196196 ++ " max valid offset = " ++ show (sz - 1)
197197
@@ -201,19 +201,19 @@ serializeUnsafe off arr val =
201201 let next = off + Unbox.sizeOf (Proxy :: Proxy a)
202202 in do
203203#ifdef DEBUG
204− checkBounds "serialize" next arr
204+ checkBounds "serializeAt" next arr
205205#endif
206206 Unbox.pokeAt off arr val
207207 pure next
208208
209209#define DERIVE_SERIALIZE_FROM_UNBOX(_type) \
210210instance Serialize _type where \
211−; {-# INLINE size #-} \
212−; size acc _ = acc + Unbox.sizeOf (Proxy :: Proxy _type) \
213−; {-# INLINE deserialize #-} \
214−; deserialize off arr end = deserializeUnsafe off arr end :: IO (Int, _type) \
215−; {-# INLINE serialize #-} \
216−; serialize = \
211+; {-# INLINE addSizeTo #-} \
212+; addSizeTo acc _ = acc + Unbox.sizeOf (Proxy :: Proxy _type) \
213+; {-# INLINE deserializeAt #-} \
214+; deserializeAt off arr end = deserializeUnsafe off arr end :: IO (Int, _type) \
215+; {-# INLINE serializeAt #-} \
216+; serializeAt = \
217217 serializeUnsafe :: Int -> MutByteArray -> _type -> IO Int
218218
219219DERIVE_SERIALIZE_FROM_UNBOX(())
@@ -237,68 +237,69 @@ DERIVE_SERIALIZE_FROM_UNBOX((FunPtr a))
237237
238238instance forall a. Serialize a => Serialize [a] where
239239
240− -- {-# INLINE size #-}
241− size acc xs = foldl' size (acc + (Unbox.sizeOf (Proxy :: Proxy Int))) xs
240+ -- {-# INLINE addSizeTo #-}
241+ addSizeTo acc xs =
242+ foldl' addSizeTo (acc + (Unbox.sizeOf (Proxy :: Proxy Int))) xs
242243
243244 -- Inlining this causes large compilation times for tests
244− {-# INLINABLE deserialize #-}
245− deserialize off arr sz = do
246− (off1, len64) <- deserialize off arr sz :: IO (Int, Int64)
245+ {-# INLINABLE deserializeAt #-}
246+ deserializeAt off arr sz = do
247+ (off1, len64) <- deserializeAt off arr sz :: IO (Int, Int64)
247248 let len = (fromIntegral :: Int64 -> Int) len64
248249 peekList f o i | i >= 3 = do
249250 -- Unfold the loop three times
250− (o1, x1) <- deserialize o arr sz
251− (o2, x2) <- deserialize o1 arr sz
252− (o3, x3) <- deserialize o2 arr sz
251+ (o1, x1) <- deserializeAt o arr sz
252+ (o2, x2) <- deserializeAt o1 arr sz
253+ (o3, x3) <- deserializeAt o2 arr sz
253254 peekList (f . (\xs -> x1:x2:x3:xs)) o3 (i - 3)
254255 peekList f o 0 = pure (o, f [])
255256 peekList f o i = do
256− (o1, x) <- deserialize o arr sz
257+ (o1, x) <- deserializeAt o arr sz
257258 peekList (f . (x:)) o1 (i - 1)
258259 peekList id off1 len
259260
260261 -- Inlining this causes large compilation times for tests
261− {-# INLINABLE serialize #-}
262− serialize off arr val = do
262+ {-# INLINABLE serializeAt #-}
263+ serializeAt off arr val = do
263264 let off1 = off + Unbox.sizeOf (Proxy :: Proxy Int64)
264265 let pokeList acc o [] =
265266 Unbox.pokeAt off arr (acc :: Int64) >> pure o
266267 pokeList acc o (x:xs) = do
267− o1 <- serialize o arr x
268+ o1 <- serializeAt o arr x
268269 pokeList (acc + 1) o1 xs
269270 pokeList 0 off1 val
270271
271272instance Serialize (Array a) where
272− {-# INLINE size #-}
273− size i (Array {..}) = i + (arrEnd - arrStart) + 8
273+ {-# INLINE addSizeTo #-}
274+ addSizeTo i (Array {..}) = i + (arrEnd - arrStart) + 8
274275
275− {-# INLINE deserialize #-}
276− deserialize off arr end = do
277− (off1, byteLen) <- deserialize off arr end :: IO (Int, Int)
276+ {-# INLINE deserializeAt #-}
277+ deserializeAt off arr end = do
278+ (off1, byteLen) <- deserializeAt off arr end :: IO (Int, Int)
278279 let off2 = off1 + byteLen
279280 let slice = MutArray.MutArray arr off1 off2 off2
280281 newArr <- MutArray.clone slice
281282 pure (off2, Array.unsafeFreeze newArr)
282283
283− {-# INLINE serialize #-}
284− serialize off arr (Array {..}) = do
284+ {-# INLINE serializeAt #-}
285+ serializeAt off arr (Array {..}) = do
285286 let arrLen = arrEnd - arrStart
286− off1 <- serialize off arr arrLen
287+ off1 <- serializeAt off arr arrLen
287288 MBA.putSliceUnsafe arrContents arrStart arr off1 arrLen
288289 pure (off1 + arrLen)
289290
290291instance (Serialize a, Serialize b) => Serialize (a, b) where
291292
292− {-# INLINE size #-}
293− size acc (a, b) = size (size acc a) b
293+ {-# INLINE addSizeTo #-}
294+ addSizeTo acc (a, b) = addSizeTo (addSizeTo acc a) b
294295
295− {-# INLINE serialize #-}
296− serialize off arr (a, b) = do
297− off1 <- serialize off arr a
298− serialize off1 arr b
296+ {-# INLINE serializeAt #-}
297+ serializeAt off arr (a, b) = do
298+ off1 <- serializeAt off arr a
299+ serializeAt off1 arr b
299300
300− {-# INLINE deserialize #-}
301− deserialize off arr end = do
302− (off1, a) <- deserialize off arr end
303− (off2, b) <- deserialize off1 arr end
301+ {-# INLINE deserializeAt #-}
302+ deserializeAt off arr end = do
303+ (off1, a) <- deserializeAt off arr end
304+ (off2, b) <- deserializeAt off1 arr end
304305 pure (off2, (a, b))
test/Streamly/Test/Data/Serialize.hs+4−4
@@ -160,7 +160,7 @@ poke ::
160160 => a
161161 -> IO (MutByteArray, Int, Int)
162162poke val = do
163− let sz = Serialize.size 0 val
163+ let sz = Serialize.addSizeTo 0 val
164164
165165 let excessSize = 100
166166 randomOff <- randomRIO (10, excessSize)
@@ -171,7 +171,7 @@ poke val = do
171171 serEndOff = randomOff + sz
172172 arr <- Serialize.new arrSize
173173
174− off1 <- Serialize.serialize serStartOff arr val
174+ off1 <- Serialize.serializeAt serStartOff arr val
175175 off1 `shouldBe` serEndOff
176176 pure (arr, serStartOff, serEndOff)
177177
@@ -181,7 +181,7 @@ peekAndVerify ::
181181 -> a
182182 -> IO ()
183183peekAndVerify (arr, serStartOff, serEndOff) val = do
184− (off2, val2) <- Serialize.deserialize serStartOff arr serEndOff
184+ (off2, val2) <- Serialize.deserializeAt serStartOff arr serEndOff
185185 val2 `shouldBe` val
186186 off2 `shouldBe` serEndOff
187187 let slice = Array.Array arr serStartOff serEndOff
@@ -207,7 +207,7 @@ testSerializeList
207207 -> IO ()
208208testSerializeList sizeOfA val = do
209209
210− let sz = Serialize.size 0 val
210+ let sz = Serialize.addSizeTo 0 val
211211
212212 sz `shouldBe` sizeOfA
213213
test/Streamly/Test/Data/Unbox.hs+3−3
@@ -40,8 +40,8 @@ import Test.Hspec as H
4040
4141#define MODULE_NAME "Data.Serialize.Deriving.TH"
4242#define DERIVE_UNBOX(typ) $(deriveSerialize [d|instance Serialize typ|])
43−#define PEEK(i, arr, sz) (deserialize i arr sz)
44−#define POKE(i, arr, val) (serialize i arr val)
43+#define PEEK(i, arr, sz) (deserializeAt i arr sz)
44+#define POKE(i, arr, val) (serializeAt i arr val)
4545#define TYPE_CLASS Serialize
4646
4747#else
@@ -185,7 +185,7 @@ variableSizeOf ::
185185 forall a. Serialize a
186186 => a
187187 -> Int
188−variableSizeOf = size 0
188+variableSizeOf = addSizeTo 0
189189#endif
190190
191191testSerialization ::