1. Bryan O'Sullivan
  2. text

Commits

tibbe  committed 5c2f537

Workaround for inliner problem

The rewrite rules makes GHC think writeN (and ensureFree) are
recursive so no unfolding would be generated for them.

  • Participants
  • Parent commits 5b6ffba
  • Branches default

Comments (0)

Files changed (1)

File Data/Text/Lazy/Builder.hs

View file
 ensureFree !n = withSize $ \ l ->
     if n <= l
     then empty
-    else flush `append` withBuffer (const (newBuffer (max n defaultChunkSize)))
+    else flush `append'` withBuffer (const (newBuffer (max n defaultChunkSize)))
 {-# INLINE [1] ensureFree #-}
 
 -- | Ensure that @n@ many elements are available, and then use @f@ to
 -- write some elements into the memory.
 writeN :: Int -> (forall s. A.MArray s Word16 -> Int -> ST s ()) -> Builder
-writeN n f = ensureFree 1 `append` withBuffer (writeNBuffer n f)
+writeN n f = ensureFree 1 `append'` withBuffer (writeNBuffer n f)
 {-# INLINE [1] writeN #-}
 
 writeNBuffer :: Int -> (A.MArray s Word16 -> Int -> ST s ()) -> (Buffer s)
 ------------------------------------------------------------------------
 -- Some nice rules for Builder
 
+-- This function makes GHC understand that 'writeN' and 'ensureFree'
+-- are *not* recursive in the precense of the rewrite rules below.
+-- This is not needed with GHC 6.14+.
+append' :: Builder -> Builder -> Builder
+append' (Builder f) (Builder g) = Builder (f . g)
+{-# INLINE append' #-}
+
 {-# RULES
 
 "writeN/combine" forall a b (f::forall s. A.MArray s Word16 -> Int -> ST s ())