2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section{@Vars@: Variables}
8 Var, IdOrTyVar, -- Abstract
9 VarDetails(..), -- Concrete
10 varName, varUnique, varDetails, varInfo, varType,
11 setVarName, setVarUnique, setVarType, setVarOcc,
17 setTyVarName, setTyVarUnique,
18 mkTyVar, mkSysTyVar, isTyVar,
19 newMutTyVar, readMutTyVar, writeMutTyVar, isMutTyVar, makeTyVarImmutable,
23 idDetails, idName, idType, idUnique, idInfo, modifyIdInfo,
24 setIdName, setIdUnique, setIdInfo,
25 mkId, isId, externallyVisibleId
28 #include "HsVersions.h"
30 import {-# SOURCE #-} Type( Type, Kind )
31 import {-# SOURCE #-} IdInfo( IdInfo )
32 import {-# SOURCE #-} Const( Con )
34 import FieldLabel ( FieldLabel )
35 import Unique ( Unique, Uniquable(..), mkUniqueGrimily, getKey )
36 import Name ( Name, OccName, NamedThing(..),
37 setNameUnique, setNameOcc, nameUnique,
38 mkSysLocalName, isExternallyVisibleName
40 import BasicTypes ( Unused )
43 import IOExts ( IORef, newIORef, readIORef, writeIORef )
48 %************************************************************************
50 \subsection{The main data type declarations}
52 %************************************************************************
55 Every @Var@ has a @Unique@, to uniquify it and for fast comparison, a
56 @Type@, and an @IdInfo@ (non-essential info about it, e.g.,
57 strictness). The essential info about different kinds of @Vars@ is
66 realUnique :: Int#, -- Key for fast comparison
67 -- Identical to the Unique in the name,
68 -- cached here for speed
70 varDetails :: VarDetails,
71 varInfo :: IdInfo -- Only used for Ids at the moment
75 = VanillaId -- Most Ids are like this
76 | ConstantId Con -- The Id for a constant (data constructor or primop)
77 | RecordSelId FieldLabel -- The Id for a record selector
79 | MutTyVar (IORef (Maybe Type)) -- Used during unification
81 -- For a long time I tried to keep mutable Vars statically type-distinct
82 -- from immutable Vars, but I've finally given up. It's just too painful.
83 -- After type checking there are no MutTyVars left, but there's no static check
88 instance Outputable Var where
89 ppr var = ppr (varName var)
91 instance Show Var where
92 showsPrec p var = showsPrecSDoc p (ppr var)
94 instance NamedThing Var where
97 instance Uniquable Var where
100 instance Eq Var where
101 a == b = realUnique a ==# realUnique b
103 instance Ord Var where
104 a <= b = realUnique a <=# realUnique b
105 a < b = realUnique a <# realUnique b
106 a >= b = realUnique a >=# realUnique b
107 a > b = realUnique a ># realUnique b
108 a `compare` b = varUnique a `compare` varUnique b
113 varUnique :: Var -> Unique
114 varUnique (Var {realUnique = uniq}) = mkUniqueGrimily uniq
116 setVarUnique :: Var -> Unique -> Var
117 setVarUnique var uniq = var {realUnique = getKey uniq,
118 varName = setNameUnique (varName var) uniq}
120 setVarName :: Var -> Name -> Var
121 setVarName var new_name
122 = var { realUnique = getKey (getUnique new_name), varName = new_name }
124 setVarOcc :: Var -> OccName -> Var
125 setVarOcc var new_occ
126 = var { varName = setNameOcc (varName var) new_occ }
128 setVarType :: Var -> Type -> Var
129 setVarType var ty = var {varType = ty}
133 %************************************************************************
135 \subsection{Type variables}
137 %************************************************************************
147 setTyVarUnique = setVarUnique
148 setTyVarName = setVarName
152 mkTyVar :: Name -> Kind -> TyVar
153 mkTyVar name kind = Var { varName = name, realUnique = getKey (nameUnique name),
154 varType = kind, varDetails = TyVar }
156 mkSysTyVar :: Unique -> Kind -> TyVar
157 mkSysTyVar uniq kind = Var { varName = name, realUnique = getKey uniq,
158 varType = kind, varDetails = TyVar }
160 name = mkSysLocalName uniq SLIT("t")
162 newMutTyVar :: Name -> Kind -> IO TyVar
163 newMutTyVar name kind =
164 do loc <- newIORef Nothing
165 return (Var { varName = name,
166 realUnique = getKey (nameUnique name),
168 varDetails = MutTyVar loc })
170 readMutTyVar :: TyVar -> IO (Maybe Type)
171 readMutTyVar (Var {varDetails = MutTyVar loc}) = readIORef loc
173 writeMutTyVar :: TyVar -> Maybe Type -> IO ()
174 writeMutTyVar (Var {varDetails = MutTyVar loc}) val = writeIORef loc val
176 makeTyVarImmutable :: TyVar -> TyVar
177 makeTyVarImmutable tyvar = tyvar { varDetails = TyVar}
181 isTyVar :: Var -> Bool
182 isTyVar (Var {varDetails = details}) = case details of
187 isMutTyVar :: Var -> Bool
188 isMutTyVar (Var {varDetails = MutTyVar _}) = True
189 isMutTyVar other = False
193 %************************************************************************
195 \subsection{Id Construction}
197 %************************************************************************
199 Most Id-related functions are in Id.lhs and MkId.lhs
211 idDetails = varDetails
213 setIdUnique :: Id -> Unique -> Id
214 setIdUnique = setVarUnique
216 setIdName :: Id -> Name -> Id
217 setIdName = setVarName
219 setIdInfo :: Id -> IdInfo -> Id
220 setIdInfo var info = var {varInfo = info}
222 modifyIdInfo :: Id -> (IdInfo -> IdInfo) -> Id
223 modifyIdInfo var@(Var {varInfo = info}) fn = var {varInfo = fn info}
227 mkId :: Name -> Type -> VarDetails -> IdInfo -> Id
228 mkId name ty details info
229 = Var {varName = name, realUnique = getKey (nameUnique name), varType = ty,
230 varDetails = details, varInfo = info}
235 isId (Var {varDetails = details}) = case details of
238 RecordSelId _ -> True
242 @externallyVisibleId@: is it true that another module might be
243 able to ``see'' this Id in a code generation sense. That
244 is, another .o file might refer to this Id.
246 In tidyCorePgm (SimplCore.lhs) we carefully set each top level thing's
247 local-ness precisely so that the test here would be easy
249 This defn appears here (rather than, say, in Id.lhs) because
250 CostCentre.lhs uses it (CostCentre feeds PprType feeds Id.lhs)
254 externallyVisibleId :: Id -> Bool
255 externallyVisibleId var = isExternallyVisibleName (varName var)