on master help sign in
Add NOINLINE statements to the slow path
c60834bAdithya Kumar
core/src/Streamly/Internal/Data/Serialize/TH.hs+4−14
@@ -245,21 +245,11 @@ mkDeserializeExpr False False headTy tyOfTy =
245mkDeserializeExpr False True headTy (TheType con@(SimpleDataCon _ fields)) = do
245mkDeserializeExpr False True headTy (TheType con@(SimpleDataCon _ fields)) = do
246 deserializeWithKeys <- newName "deserializeWithKeys"
246 deserializeWithKeys <- newName "deserializeWithKeys"
247 updateFunc <- newName "updateFunc"
247 updateFunc <- newName "updateFunc"
248− hOff <- newName "hOff"
249− finalOff <- newName "finalOff"
250− deserializeWithKeysMethod <-
251− RecHeader.mkDeserializeKeysExpr
252− hOff finalOff _arr _endOffset updateFunc con
253− updateFuncDec <- RecHeader.conUpdateFuncExpr updateFunc headTy fields
248+ updateFuncDec <- RecHeader.conUpdateFuncDec updateFunc headTy fields
249+ deserializeWithKeysDec <-
250+ RecHeader.mkDeserializeKeysDec deserializeWithKeys updateFunc con
254 letE
251 letE
255− ([ pure $ FunD
256− deserializeWithKeys
257− [ Clause
258− [VarP hOff, VarP finalOff]
259− (NormalB deserializeWithKeysMethod)
260− []
261− ]
262− ] ++ (pure <$> updateFuncDec))
252+ (pure <$> (deserializeWithKeysDec ++ updateFuncDec))
263 (RecHeader.mkDeserializeExpr
253 (RecHeader.mkDeserializeExpr
264 _initialOffset
254 _initialOffset
265 _endOffset
255 _endOffset
core/src/Streamly/Internal/Data/Serialize/TH/RecHeader.hs+39−19
@@ -12,8 +12,8 @@ module Streamly.Internal.Data.Serialize.TH.RecHeader
12 ( mkSerializeExpr
12 ( mkSerializeExpr
13 , mkDeserializeExpr
13 , mkDeserializeExpr
14 , mkSizeOfExpr
14 , mkSizeOfExpr
15− , conUpdateFuncExpr
15+ , conUpdateFuncDec
16− , mkDeserializeKeysExpr
16+ , mkDeserializeKeysDec
17 ) where
17 ) where
18
18
19--------------------------------------------------------------------------------
19--------------------------------------------------------------------------------
@@ -255,8 +255,8 @@ deserializeWithSize ::
255 Serialize a => Int -> MutableByteArray -> Int -> IO (Int, a)
255 Serialize a => Int -> MutableByteArray -> Int -> IO (Int, a)
256deserializeWithSize off arr endOff = deserialize (off + 4) arr endOff
256deserializeWithSize off arr endOff = deserialize (off + 4) arr endOff
257
257
258−conUpdateFuncExpr :: Name -> Type -> [Field] -> Q [Dec]
258+conUpdateFuncDec :: Name -> Type -> [Field] -> Q [Dec]
259−conUpdateFuncExpr funcName headTy fields = do
259+conUpdateFuncDec funcName headTy fields = do
260 prevRec <- newName "prevRec"
260 prevRec <- newName "prevRec"
261 curOff <- newName "curOff"
261 curOff <- newName "curOff"
262 endOff <- newName "endOff"
262 endOff <- newName "endOff"
@@ -317,20 +317,36 @@ conUpdateFuncExpr funcName headTy fields = do
317 , $(varE newOff))|])
317 , $(varE newOff))|])
318 []
318 []
319
319
320−mkDeserializeKeysExpr ::
321− Name -> Name -> Name -> Name -> Name -> SimpleDataCon -> Q Exp
320+mkDeserializeKeysDec :: Name -> Name -> SimpleDataCon -> Q [Dec]
322−mkDeserializeKeysExpr
323− hOff finalOff arr endOff updateFunc (SimpleDataCon cname fields) = do
321+mkDeserializeKeysDec funcName updateFunc (SimpleDataCon cname fields) = do
324−
322+ hOff <- newName "hOff"
323+ finalOff <- newName "finalOff"
324+ arr <- newName "arr"
325+ endOff <- newName "endOff"
326+ method <-
325− [|do (dataOff, hlist :: CompactList (CompactList Word8)) <-
327+ [|do (dataOff, hlist :: CompactList (CompactList Word8)) <-
326− deserialize $(varE hOff) $(varE arr) $(varE endOff)
328+ deserialize $(varE hOff) $(varE arr) $(varE endOff)
327− let keys = wListToString . unCompactList <$> unCompactList hlist
329+ let keys = wListToString . unCompactList <$> unCompactList hlist
328− (finalRec, _) <-
330+ (finalRec, _) <-
329− foldlM
331+ foldlM
330− ($(varE updateFunc) $(varE arr) $(varE endOff))
332+ ($(varE updateFunc) $(varE arr) $(varE endOff))
331− ($(emptyConExpr), dataOff)
333+ ($(emptyConExpr), dataOff)
332− keys
334+ keys
333− pure ($(varE finalOff), finalRec)|]
335+ pure ($(varE finalOff), finalRec)|]
336+ pure
337+ [ PragmaD (InlineP funcName NoInline FunLike AllPhases)
338+ , FunD
339+ funcName
340+ [ Clause
341+ [ VarP hOff
342+ , VarP finalOff
343+ , VarP arr
344+ , VarP endOff
345+ ]
346+ (NormalB method)
347+ []
348+ ]
349+ ]
334
350
335 where
351 where
336
352
@@ -362,9 +378,13 @@ mkDeserializeExpr initialOff endOff deserializeWithKeys con = do
362 else $(varE deserializeWithKeys)
378 else $(varE deserializeWithKeys)
363 $(varE hOff)
379 $(varE hOff)
364 ($(varE initialOff) + w32_int encLen)
380 ($(varE initialOff) + w32_int encLen)
381+ $(varE _arr)
382+ $(varE endOff)
365 else $(varE deserializeWithKeys)
383 else $(varE deserializeWithKeys)
366 $(varE hOff)
384 $(varE hOff)
367− ($(varE initialOff) + w32_int encLen)|]
385+ ($(varE initialOff) + w32_int encLen)
386+ $(varE _arr)
387+ $(varE endOff)|]
368
388
369 where
389 where
370
390