@@ -79,8 +79,8 @@ conEncLen cname = getNameBaseLen cname + 1
80--------------------------------------------------------------------------------
80--------------------------------------------------------------------------------
82−mkSizeOfExpr :: Bool -> TypeOfType -> Q Exp
82+mkSizeOfExpr :: Bool -> Bool -> TypeOfType -> Q Exp
83−mkSizeOfExpr True tyOfTy =
83+mkSizeOfExpr True False tyOfTy =
84 case tyOfTy of
84 case tyOfTy of
85 UnitType cname ->
85 UnitType cname ->
@@ -109,7 +109,7 @@ mkSizeOfExpr True tyOfTy =
109 [varP _acc, varP _x]
109 [varP _acc, varP _x]
110 (caseE (varE _x) (fmap (matchCons acc) cons))
110 (caseE (varE _x) (fmap (matchCons acc) cons))
112−mkSizeOfExpr False tyOfTy =
112+mkSizeOfExpr False False tyOfTy =
113 case tyOfTy of
113 case tyOfTy of
114 UnitType _ -> lamE [varP _acc, wildP] [|$(varE _acc) + 1|]
114 UnitType _ -> lamE [varP _acc, wildP] [|$(varE _acc) + 1|]
115 TheType con ->
115 TheType con ->
@@ -146,10 +146,16 @@ mkSizeOfExpr False tyOfTy =
146 [varP _acc, varP _x]
146 [varP _acc, varP _x]
147 (caseE (varE _x) (fmap (matchCons acc) cons))
147 (caseE (varE _x) (fmap (matchCons acc) cons))
149+mkSizeOfExpr _ _ _ = errorUnimplemented
149mkSizeDec :: Config -> Type -> [DataCon] -> Q [Dec]
151mkSizeDec :: Config -> Type -> [DataCon] -> Q [Dec]
150mkSizeDec (Config {..}) headTy cons = do
152mkSizeDec (Config {..}) headTy cons = do
151 -- INLINE on sizeOf actually worsens some benchmarks, and improves none
153 -- INLINE on sizeOf actually worsens some benchmarks, and improves none
152− sizeOfMethod <- mkSizeOfExpr constructorTagAsString (typeOfType headTy cons)
156+ constructorTagAsString
157+ recordSyntaxWithHeader
158+ (typeOfType headTy cons)
154 [ PragmaD (InlineP 'size inlineSize FunLike AllPhases)
160 [ PragmaD (InlineP 'size inlineSize FunLike AllPhases)
155 , FunD 'size [Clause [] (NormalB sizeOfMethod) []]
161 , FunD 'size [Clause [] (NormalB sizeOfMethod) []]
@@ -159,8 +165,8 @@ mkSizeDec (Config {..}) headTy cons = do
160--------------------------------------------------------------------------------
166--------------------------------------------------------------------------------
162−mkDeserializeExpr :: Bool -> Type -> TypeOfType -> Q Exp
168+mkDeserializeExpr :: Bool -> Bool -> Type -> TypeOfType -> Q Exp
163−mkDeserializeExpr True headTy tyOfTy =
169+mkDeserializeExpr True False headTy tyOfTy =
164 case tyOfTy of
170 case tyOfTy of
165 UnitType cname -> deserializeConsExpr [SimpleDataCon cname []]
171 UnitType cname -> deserializeConsExpr [SimpleDataCon cname []]
166 TheType con -> deserializeConsExpr [con]
172 TheType con -> deserializeConsExpr [con]
@@ -194,7 +200,7 @@ mkDeserializeExpr True headTy tyOfTy =
194 [|let $(varP (makeI 0)) = $(varE off) + $(litIntegral lenCname)
200 [|let $(varP (makeI 0)) = $(varE off) + $(litIntegral lenCname)
195 in $(mkDeserializeExprOne 'deserialize con)|]
201 in $(mkDeserializeExprOne 'deserialize con)|]
197−mkDeserializeExpr False headTy tyOfTy =
203+mkDeserializeExpr False False headTy tyOfTy =
198 case tyOfTy of
204 case tyOfTy of
199 -- Unit constructor
205 -- Unit constructor
200 UnitType cname ->
206 UnitType cname ->
@@ -232,10 +238,16 @@ mkDeserializeExpr False headTy tyOfTy =
232 $(lift (pprint headTy)) ++ ")")|])
238 $(lift (pprint headTy)) ++ ")")|])
241+mkDeserializeExpr _ _ _ _ = errorUnimplemented
235mkDeserializeDec :: Config -> Type -> [DataCon] -> Q [Dec]
243mkDeserializeDec :: Config -> Type -> [DataCon] -> Q [Dec]
236mkDeserializeDec (Config {..}) headTy cons = do
244mkDeserializeDec (Config {..}) headTy cons = do
237 peekMethod <-
245 peekMethod <-
238− mkDeserializeExpr constructorTagAsString headTy (typeOfType headTy cons)
247+ constructorTagAsString
248+ recordSyntaxWithHeader
250+ (typeOfType headTy cons)
240 [ PragmaD (InlineP 'deserialize inlineDeserialize FunLike AllPhases)
252 [ PragmaD (InlineP 'deserialize inlineDeserialize FunLike AllPhases)
@@ -260,8 +272,8 @@ mkSerializeExprTag tagType tagVal =
260 $(varE _arr)
272 $(varE _arr)
261 $((sigE (litE (IntegerL (fromIntegral tagVal))) (conT tagType)))|]
273 $((sigE (litE (IntegerL (fromIntegral tagVal))) (conT tagType)))|]
263−mkSerializeExpr :: Bool -> TypeOfType -> Q Exp
275+mkSerializeExpr :: Bool -> Bool -> TypeOfType -> Q Exp
264−mkSerializeExpr True tyOfTy =
276+mkSerializeExpr True False tyOfTy =
265 case tyOfTy of
277 case tyOfTy of
266 -- Unit type
278 -- Unit type
267 UnitType cname ->
279 UnitType cname ->
@@ -293,7 +305,7 @@ mkSerializeExpr True tyOfTy =
293 , noBindS (mkSerializeExprFields 'serialize fields)
305 , noBindS (mkSerializeExprFields 'serialize fields)
296−mkSerializeExpr False tyOfTy =
308+mkSerializeExpr False False tyOfTy =
297 case tyOfTy of
309 case tyOfTy of
298 -- Unit type
310 -- Unit type
299 UnitType _ -> [|pure ($(varE _initialOffset) + 1)|]
311 UnitType _ -> [|pure ($(varE _initialOffset) + 1)|]
@@ -328,10 +340,15 @@ mkSerializeExpr False tyOfTy =
329 (zip [0 ..] cons))
341 (zip [0 ..] cons))
343+mkSerializeExpr _ _ _ = errorUnimplemented
331mkSerializeDec :: Config -> Type -> [DataCon] -> Q [Dec]
345mkSerializeDec :: Config -> Type -> [DataCon] -> Q [Dec]
332mkSerializeDec (Config {..}) headTy cons = do
346mkSerializeDec (Config {..}) headTy cons = do
333 pokeMethod <-
347 pokeMethod <-
334− mkSerializeExpr constructorTagAsString (typeOfType headTy cons)
349+ constructorTagAsString
350+ recordSyntaxWithHeader
351+ (typeOfType headTy cons)
336 [ PragmaD (InlineP 'serialize inlineSerialize FunLike AllPhases)
353 [ PragmaD (InlineP 'serialize inlineSerialize FunLike AllPhases)