on master help sign in
Reduce inlining bloat from use of empty literals
6d75e1aBryan O'Sullivan
Data/Text.hs+5−1
@@ -217,7 +217,7 @@ import qualified Data.Text.Internal.Fusion as S
217import qualified Data.Text.Internal.Fusion.Common as S
217import qualified Data.Text.Internal.Fusion.Common as S
218import Data.Text.Internal.Fusion (stream, reverseStream, unstream)
218import Data.Text.Internal.Fusion (stream, reverseStream, unstream)
219import Data.Text.Internal.Private (span_)
219import Data.Text.Internal.Private (span_)
220−import Data.Text.Internal (Text(..), empty, firstf, mul, safe, text)
220+import Data.Text.Internal (Text(..), empty, empty_, firstf, mul, safe, text)
221import qualified Prelude as P
221import qualified Prelude as P
222import Data.Text.Unsafe (Iter(..), iter, iter_, lengthWord16, reverseIter,
222import Data.Text.Unsafe (Iter(..), iter, iter_, lengthWord16, reverseIter,
223 reverseIter_, unsafeHead, unsafeTail)
223 reverseIter_, unsafeHead, unsafeTail)
@@ -419,6 +419,10 @@ unpackCString# addr# = unstream (S.streamCString# addr#)
419 unstream (S.map safe (S.streamList (GHC.unpackCStringUtf8# a)))
419 unstream (S.map safe (S.streamList (GHC.unpackCStringUtf8# a)))
420 = unpackCString# a #-}
420 = unpackCString# a #-}
421
421
422+{-# RULES "TEXT empty literal"
423+ unstream (S.map safe (S.streamList []))
424+ = empty_ #-}
425+
422-- | /O(1)/ Convert a character into a Text. Subject to fusion.
426-- | /O(1)/ Convert a character into a Text. Subject to fusion.
423-- Performs replacement on invalid scalar values.
427-- Performs replacement on invalid scalar values.
424singleton :: Char -> Text
428singleton :: Char -> Text
Data/Text/Internal.hs+6
@@ -36,6 +36,7 @@ module Data.Text.Internal
36 , safe
36 , safe
37 -- * Code that must be here for accessibility
37 -- * Code that must be here for accessibility
38 , empty
38 , empty
39+ , empty_
39 -- * Utilities
40 -- * Utilities
40 , firstf
41 , firstf
41 -- * Checked multiplication
42 -- * Checked multiplication
@@ -81,6 +82,11 @@ empty :: Text
81empty = Text A.empty 0 0
82empty = Text A.empty 0 0
82{-# INLINE [1] empty #-}
83{-# INLINE [1] empty #-}
83
84
85+-- | A non-inlined version of 'empty'.
86+empty_ :: Text
87+empty_ = Text A.empty 0 0
88+{-# NOINLINE empty_ #-}
89+
84-- | Construct a 'Text' without invisibly pinning its byte array in
90-- | Construct a 'Text' without invisibly pinning its byte array in
85-- memory if its length has dwindled to zero.
91-- memory if its length has dwindled to zero.
86text :: A.Array -> Int -> Int -> Text
92text :: A.Array -> Int -> Int -> Text
Data/Text/Lazy.hs+4
@@ -381,6 +381,10 @@ unpackCString# addr# = unstream (S.streamCString# addr#)
381 unstream (S.streamList (L.map safe (GHC.unpackCStringUtf8# a)))
381 unstream (S.streamList (L.map safe (GHC.unpackCStringUtf8# a)))
382 = unpackCString# a #-}
382 = unpackCString# a #-}
383
383
384+{-# RULES "LAZY TEXT empty literal"
385+ unstream (S.streamList (L.map safe []))
386+ = Empty #-}
387+
384-- | /O(1)/ Convert a character into a Text. Subject to fusion.
388-- | /O(1)/ Convert a character into a Text. Subject to fusion.
385-- Performs replacement on invalid scalar values.
389-- Performs replacement on invalid scalar values.
386singleton :: Char -> Text
390singleton :: Char -> Text