Make sure that Pretty.text is inlined in stage 0,
authorSimon Peyton Jones <simonpj@microsoft.com>
Fri, 21 Jun 2013 16:41:26 +0000 (17:41 +0100)
committerSimon Peyton Jones <simonpj@microsoft.com>
Mon, 24 Jun 2013 12:10:47 +0000 (13:10 +0100)
so that RULE text/str gets a chance to fire (Trac #7995).

And make sure that Outputable.text is inlined, so that the underlying
Pretty.text rule can fire.

The thing is that literal strings only turn into unpackCString#
in phase 1.

compiler/utils/Outputable.lhs
compiler/utils/Pretty.lhs

index bd2a955..88a8a75 100644 (file)
@@ -421,7 +421,10 @@ rational :: Rational   -> SDoc
 
 empty       = docToSDoc $ Pretty.empty
 char c      = docToSDoc $ Pretty.char c
+
 text s      = docToSDoc $ Pretty.text s
+{-# INLINE text #-}   -- Inline so that the RULE Pretty.text will fire
+
 ftext s     = docToSDoc $ Pretty.ftext s
 ptext s     = docToSDoc $ Pretty.ptext s
 ztext s     = docToSDoc $ Pretty.ztext s
index e4f748a..0c8e5fa 100644 (file)
@@ -557,7 +557,9 @@ isEmpty _     = False
 char  c = textBeside_ (Chr c) (_ILIT(1)) Empty
 
 text  s = case iUnbox (length   s) of {sl -> textBeside_ (Str s)  sl Empty}
-{-# NOINLINE [1] text #-}   -- Give the RULE a chance to fire
+{-# NOINLINE [0] text #-}   -- Give the RULE a chance to fire
+                            -- It must wait till after phase 1 when
+                            -- the unpackCString first is manifested
 
 ftext :: FastString -> Doc
 ftext s = case iUnbox (lengthFS s) of {sl -> textBeside_ (PStr s) sl Empty}