X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FbasicTypes%2FVar.lhs;h=60fdf3831c3c5de74a15612b80089db9189cf292;hb=45252b35151fc55aa19fb6770df5ed8267639083;hp=df030e220d696890864131585fbe5daf9c18fab9;hpb=f714e6b642fd614a9971717045ae47c3d871275e;p=ghc-hetmet.git diff --git a/ghc/compiler/basicTypes/Var.lhs b/ghc/compiler/basicTypes/Var.lhs index df030e2..60fdf38 100644 --- a/ghc/compiler/basicTypes/Var.lhs +++ b/ghc/compiler/basicTypes/Var.lhs @@ -7,45 +7,42 @@ module Var ( Var, varName, varUnique, - setVarName, setVarUnique, setVarOcc, + setVarName, setVarUnique, -- TyVars TyVar, mkTyVar, mkTcTyVar, tyVarName, tyVarKind, setTyVarName, setTyVarUnique, - tcTyVarRef, tcTyVarDetails, + tcTyVarDetails, -- Ids Id, DictId, idName, idType, idUnique, idInfo, modifyIdInfo, maybeModifyIdInfo, setIdName, setIdUnique, setIdType, setIdInfo, lazySetIdInfo, - setIdLocalExported, zapSpecPragmaId, + setIdExported, setIdNotExported, - globalIdDetails, setGlobalIdDetails, + globalIdDetails, globaliseId, - mkLocalId, mkExportedLocalId, mkSpecPragmaId, - mkGlobalId, + mkLocalId, mkExportedLocalId, mkGlobalId, isTyVar, isTcTyVar, isId, isLocalVar, isLocalId, - isGlobalId, isExportedId, isSpecPragmaId, + isGlobalId, isExportedId, mustHaveLocalBinding ) where #include "HsVersions.h" import {-# SOURCE #-} TypeRep( Type ) -import {-# SOURCE #-} TcType( TyVarDetails ) -import {-# SOURCE #-} IdInfo( GlobalIdDetails, notGlobalId, - IdInfo, seqIdInfo ) +import {-# SOURCE #-} TcType( TcTyVarDetails, pprTcTyVarDetails ) +import {-# SOURCE #-} IdInfo( GlobalIdDetails, notGlobalId, IdInfo, seqIdInfo ) -import Name ( Name, OccName, NamedThing(..), - setNameUnique, setNameOcc, nameUnique +import Name ( Name, NamedThing(..), + setNameUnique, nameUnique ) import Kind ( Kind ) import Unique ( Unique, Uniquable(..), mkUniqueGrimily, getKey# ) import FastTypes import Outputable -import DATA_IOREF \end{code} @@ -70,12 +67,11 @@ data Var -- cached here for speed tyVarKind :: Kind } - | TcTyVar { -- Used only during type inference - varName :: !Name, -- Could we get away without a Name? + | TcTyVar { -- Used only during type inference + varName :: !Name, realUnique :: FastInt, tyVarKind :: Kind, - tcTyVarRef :: IORef (Maybe Type), - tcTyVarDetails :: TyVarDetails } + tcTyVarDetails :: TcTyVarDetails } | GlobalId { -- Used for imported Ids, dict selectors etc varName :: !Name, @@ -94,8 +90,8 @@ data Var data LocalIdDetails = NotExported -- Not exported | Exported -- Exported - | SpecPragma -- Not exported, but not to be discarded either - -- It's unclean that this is so deeply built in + -- Exported Ids are kept alive; + -- NotExported things may be discarded as dead code. \end{code} LocalId and GlobalId @@ -115,7 +111,13 @@ After CoreTidy, top-level LocalIds are turned into GlobalIds \begin{code} instance Outputable Var where - ppr var = ppr (varName var) + ppr var = ppr (varName var) <+> ifPprDebug (brackets extra) + where + extra = case var of + GlobalId {} -> ptext SLIT("gid") + LocalId {} -> ptext SLIT("lid") + TyVar {} -> ptext SLIT("tv") + TcTyVar {tcTyVarDetails = details} -> pprTcTyVarDetails details instance Show Var where showsPrec p var = showsPrecSDoc p (ppr var) @@ -151,10 +153,6 @@ setVarName :: Var -> Name -> Var setVarName var new_name = var { realUnique = getKey# (getUnique new_name), varName = new_name } - -setVarOcc :: Var -> OccName -> Var -setVarOcc var new_occ - = var { varName = setNameOcc (varName var) new_occ } \end{code} @@ -180,12 +178,11 @@ mkTyVar name kind = TyVar { varName = name , tyVarKind = kind } -mkTcTyVar :: Name -> Kind -> TyVarDetails -> IORef (Maybe Type) -> TyVar -mkTcTyVar name kind details ref +mkTcTyVar :: Name -> Kind -> TcTyVarDetails -> TyVar +mkTcTyVar name kind details = TcTyVar { varName = name, realUnique = getKey# (nameUnique name), tyVarKind = kind, - tcTyVarRef = ref, tcTyVarDetails = details } \end{code} @@ -217,18 +214,23 @@ setIdName = setVarName setIdType :: Id -> Type -> Id setIdType id ty = id {idType = ty} -setIdLocalExported :: Id -> Id --- It had better be a LocalId already -setIdLocalExported id = id { lclDetails = Exported } +setIdExported :: Id -> Id +-- Can be called on GlobalIds, such as data cons and class ops, +-- which are "born" as GlobalIds and automatically exported +setIdExported id@(LocalId {}) = id { lclDetails = Exported } +setIdExported other_id = ASSERT( isId other_id ) other_id -setGlobalIdDetails :: Id -> GlobalIdDetails -> Id --- It had better be a GlobalId already -setGlobalIdDetails id details = id { gblDetails = details } +setIdNotExported :: Id -> Id +-- We can only do this to LocalIds +setIdNotExported id = ASSERT( isLocalId id ) id { lclDetails = NotExported } -zapSpecPragmaId :: Id -> Id -zapSpecPragmaId id - | isSpecPragmaId id = id {lclDetails = NotExported} - | otherwise = id +globaliseId :: GlobalIdDetails -> Id -> Id +-- If it's a local, make it global +globaliseId details id = GlobalId { varName = varName id, + realUnique = realUnique id, + idType = idType id, + idInfo = idInfo id, + gblDetails = details } lazySetIdInfo :: Id -> IdInfo -> Id lazySetIdInfo id info = id {idInfo = info} @@ -279,16 +281,13 @@ mkLocalId name ty info = mk_local_id name ty NotExported info mkExportedLocalId :: Name -> Type -> IdInfo -> Id mkExportedLocalId name ty info = mk_local_id name ty Exported info - -mkSpecPragmaId :: Name -> Type -> IdInfo -> Id -mkSpecPragmaId name ty info = mk_local_id name ty SpecPragma info \end{code} \begin{code} -isTyVar, isTcTyVar :: Var -> Bool -isId, isLocalVar, isLocalId :: Var -> Bool -isGlobalId, isExportedId, isSpecPragmaId :: Var -> Bool -mustHaveLocalBinding :: Var -> Bool +isTyVar, isTcTyVar :: Var -> Bool +isId, isLocalVar, isLocalId :: Var -> Bool +isGlobalId, isExportedId :: Var -> Bool +mustHaveLocalBinding :: Var -> Bool isTyVar (TyVar {}) = True isTyVar (TcTyVar {}) = True @@ -325,12 +324,8 @@ isExportedId (GlobalId {}) = True isExportedId (LocalId {lclDetails = details}) = case details of Exported -> True - SpecPragma -> True other -> False isExportedId other = False - -isSpecPragmaId (LocalId {lclDetails = SpecPragma}) = True -isSpecPragmaId other = False \end{code} \begin{code}