merge GHC HEAD
[ghc-hetmet.git] / compiler / basicTypes / IdInfo.lhs
index 0a173d9..c106f53 100644 (file)
@@ -10,7 +10,7 @@ Haskell. [WDP 94/11])
 \begin{code}
 module IdInfo (
         -- * The IdDetails type
-       IdDetails(..), pprIdDetails,
+       IdDetails(..), pprIdDetails, coVarDetails,
 
         -- * The IdInfo type
        IdInfo,         -- Abstract
@@ -46,6 +46,7 @@ module IdInfo (
        
        -- ** The SpecInfo type
        SpecInfo(..),
+       emptySpecInfo,
        isEmptySpecInfo, specInfoFreeVars,
        specInfoRules, seqSpecInfo, setSpecInfoHead,
         specInfo, setSpecInfo,
@@ -64,7 +65,7 @@ module IdInfo (
         TickBoxOp(..), TickBoxId,
     ) where
 
-import CoreSyn ( CoreRule, setRuleIdName, seqRules, Unfolding, noUnfolding )
+import CoreSyn
 
 import Class
 import PrimOp
@@ -128,11 +129,20 @@ data IdDetails
 
   | TickBoxOpId TickBoxOp      -- ^ The 'Id' is for a HPC tick box (both traditional and binary)
 
-  | DFunId Bool                        -- ^ A dictionary function.  
-                               --   True <=> the class has only one method, so may be 
-                               --            implemented with a newtype, so it might be bad 
-                               --            to be strict on this dictionary
-
+  | DFunId Int Bool             -- ^ A dictionary function.
+       -- Int = the number of "silent" arguments to the dfun
+       --       e.g.  class D a => C a where ...
+       --             instance C a => C [a]
+       --       has is_silent = 1, because the dfun
+       --       has type  dfun :: (D a, C a) => C [a]
+       --       See the DFun Superclass Invariant in TcInstDcls
+       --
+       -- Bool = True <=> the class has only one method, so may be
+       --                  implemented with a newtype, so it might be bad
+       --                  to be strict on this dictionary
+
+coVarDetails :: IdDetails
+coVarDetails = VanillaId
 
 instance Outputable IdDetails where
     ppr = pprIdDetails
@@ -148,8 +158,9 @@ pprIdDetails other     = brackets (pp other)
    pp (PrimOpId _)      = ptext (sLit "PrimOp")
    pp (FCallId _)       = ptext (sLit "ForeignCall")
    pp (TickBoxOpId _)   = ptext (sLit "TickBoxOp")
-   pp (DFunId b)        = ptext (sLit "DFunId") <> 
-                            ppWhen b (ptext (sLit "(newtype)"))
+   pp (DFunId ns nt)    = ptext (sLit "DFunId")
+                             <> ppWhen (ns /= 0) (brackets (int ns))
+                             <> ppWhen nt (ptext (sLit "(nt)"))
    pp (RecSelId { sel_naughty = is_naughty })
                         = brackets $ ptext (sLit "RecSel") 
                            <> ppWhen is_naughty (ptext (sLit "(naughty)"))
@@ -243,9 +254,11 @@ setUnfoldingInfoLazily info uf     -- Lazy variant to avoid looking at the
 
 setUnfoldingInfo :: IdInfo -> Unfolding -> IdInfo
 setUnfoldingInfo info uf 
-       -- We do *not* seq on the unfolding info, For some reason, doing so 
-       -- actually increases residency significantly. 
-  = info { unfoldingInfo = uf }
+  = -- We don't seq the unfolding, as we generate intermediate
+    -- unfoldings which are just thrown away, so evaluating them is a
+    -- waste of time.
+    -- seqUnfolding uf `seq`
+    info { unfoldingInfo = uf }
 
 setArityInfo :: IdInfo -> ArityInfo -> IdInfo
 setArityInfo     info ar  = info { arityInfo = ar  }