X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FbasicTypes%2FBasicTypes.lhs;h=b0100e659e06ea98439738f6e6047b8ca4a45514;hb=1bba522f5ec82c43abd2ba4e84127b9c915dd020;hp=5625103a86e9c7a9349e51cf60c25f6a74c95d01;hpb=33455e881b066bb1328ed0b4d45c57405ac849c9;p=ghc-hetmet.git diff --git a/ghc/compiler/basicTypes/BasicTypes.lhs b/ghc/compiler/basicTypes/BasicTypes.lhs index 5625103..b0100e6 100644 --- a/ghc/compiler/basicTypes/BasicTypes.lhs +++ b/ghc/compiler/basicTypes/BasicTypes.lhs @@ -14,16 +14,32 @@ types that \begin{code} module BasicTypes( - Version, Arity, + Version, bumpVersion, initialVersion, bogusVersion, + + Arity, + Unused, unused, - Fixity(..), FixityDirection(..), StrictnessMark(..), - NewOrData(..), TopLevelFlag(..), RecFlag(..) + + Fixity(..), FixityDirection(..), + defaultFixity, maxPrecedence, negateFixity, negatePrecedence, + + NewOrData(..), + + RecFlag(..), isRec, isNonRec, + + TopLevelFlag(..), isTopLevel, isNotTopLevel, + + Boxity(..), isBoxed, tupleParens, + + OccInfo(..), seqOccInfo, isFragileOcc, isDeadOcc, isLoopBreaker, + + InsideLam, insideLam, notInsideLam, + OneBranch, oneBranch, notOneBranch + ) where #include "HsVersions.h" -import {-# SOURCE #-} DataCon ( DataCon ) -import {-# SOURCE #-} Type ( Type ) import Outputable \end{code} @@ -62,6 +78,15 @@ type Arity = Int \begin{code} type Version = Int + +bogusVersion :: Version -- Shouldn't look at these +bogusVersion = error "bogusVersion" + +bumpVersion :: Version -> Version +bumpVersion v = v+1 + +initialVersion :: Version +initialVersion = 1 \end{code} @@ -86,6 +111,15 @@ instance Outputable FixityDirection where instance Eq Fixity where -- Used to determine if two fixities conflict (Fixity p1 dir1) == (Fixity p2 dir2) = p1==p2 && dir1 == dir2 + +maxPrecedence = (9::Int) +defaultFixity = Fixity maxPrecedence InfixL + +negateFixity :: Fixity +negateFixity = Fixity negatePrecedence InfixL -- Precedence of unary negate is wired in as infixl 6! + +negatePrecedence :: Int +negatePrecedence = 6 \end{code} @@ -99,7 +133,6 @@ instance Eq Fixity where -- Used to determine if two fixities conflict data NewOrData = NewType -- "newtype Blah ..." | DataType -- "data Blah ..." - | EnumType -- Enumeration; all constructors are nullary deriving( Eq ) -- Needed because Demand derives Eq \end{code} @@ -113,8 +146,38 @@ data NewOrData data TopLevelFlag = TopLevel | NotTopLevel + +isTopLevel, isNotTopLevel :: TopLevelFlag -> Bool + +isNotTopLevel NotTopLevel = True +isNotTopLevel TopLevel = False + +isTopLevel TopLevel = True +isTopLevel NotTopLevel = False +\end{code} + +%************************************************************************ +%* * +\subsection[Top-level/local]{Top-level/not-top level flag} +%* * +%************************************************************************ + +\begin{code} +data Boxity + = Boxed + | Unboxed + deriving( Eq ) + +isBoxed :: Boxity -> Bool +isBoxed Boxed = True +isBoxed Unboxed = False + +tupleParens :: Boxity -> SDoc -> SDoc +tupleParens Boxed p = parens p +tupleParens Unboxed p = ptext SLIT("(#") <+> p <+> ptext SLIT("#)") \end{code} + %************************************************************************ %* * \subsection[Recursive/Non-Recursive]{Recursive/Non-Recursive flag} @@ -124,16 +187,81 @@ data TopLevelFlag \begin{code} data RecFlag = Recursive | NonRecursive + +isRec :: RecFlag -> Bool +isRec Recursive = True +isRec NonRecursive = False + +isNonRec :: RecFlag -> Bool +isNonRec Recursive = False +isNonRec NonRecursive = True \end{code} + %************************************************************************ %* * -\subsection{Strictness indication} +\subsection{Occurrence information} %* * %************************************************************************ +This data type is used exclusively by the simplifier, but it appears in a +SubstResult, which is currently defined in VarEnv, which is pretty near +the base of the module hierarchy. So it seemed simpler to put the +defn of OccInfo here, safely at the bottom + \begin{code} -data StrictnessMark = MarkedStrict - | MarkedUnboxed DataCon [Type] - | NotMarkedStrict +data OccInfo + = NoOccInfo + + | IAmDead -- Marks unused variables. Sometimes useful for + -- lambda and case-bound variables. + + | OneOcc InsideLam + + OneBranch + + | IAmALoopBreaker -- Used by the occurrence analyser to mark loop-breakers + -- in a group of recursive definitions + +seqOccInfo :: OccInfo -> () +seqOccInfo (OneOcc in_lam once) = in_lam `seq` once `seq` () +seqOccInfo occ = () + +type InsideLam = Bool -- True <=> Occurs inside a non-linear lambda + -- Substituting a redex for this occurrence is + -- dangerous because it might duplicate work. +insideLam = True +notInsideLam = False + +type OneBranch = Bool -- True <=> Occurs in only one case branch + -- so no code-duplication issue to worry about +oneBranch = True +notOneBranch = False + +isLoopBreaker :: OccInfo -> Bool +isLoopBreaker IAmALoopBreaker = True +isLoopBreaker other = False + +isDeadOcc :: OccInfo -> Bool +isDeadOcc IAmDead = True +isDeadOcc other = False + +isFragileOcc :: OccInfo -> Bool +isFragileOcc (OneOcc _ _) = True +isFragileOcc other = False +\end{code} + +\begin{code} +instance Outputable OccInfo where + -- only used for debugging; never parsed. KSW 1999-07 + ppr NoOccInfo = empty + ppr IAmALoopBreaker = ptext SLIT("_Kx") + ppr IAmDead = ptext SLIT("_Kd") + ppr (OneOcc inside_lam one_branch) | inside_lam = ptext SLIT("_Kl") + | one_branch = ptext SLIT("_Ks") + | otherwise = ptext SLIT("_Ks*") + +instance Show OccInfo where + showsPrec p occ = showsPrecSDoc p (ppr occ) \end{code} +