2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section{@Vars@: Variables}
8 Var, IdOrTyVar, VarDetails, -- Abstract
9 varName, varUnique, varInfo, varType,
10 setVarName, setVarUnique, setVarType, setVarOcc,
16 setTyVarName, setTyVarUnique,
17 mkTyVar, mkSysTyVar, isTyVar, isSigTyVar,
18 newMutTyVar, newSigTyVar,
19 readMutTyVar, writeMutTyVar, isMutTyVar, makeTyVarImmutable,
28 idName, idType, idUnique, idInfo, modifyIdInfo, maybeModifyIdInfo,
29 setIdName, setIdUnique, setIdInfo,
30 mkIdVar, isId, externallyVisibleId
33 #include "HsVersions.h"
35 import {-# SOURCE #-} Type( Type, Kind )
36 import {-# SOURCE #-} IdInfo( IdInfo )
38 import Unique ( Unique, Uniquable(..), mkUniqueGrimily, getKey )
39 import Name ( Name, OccName, NamedThing(..),
40 setNameUnique, setNameOcc, nameUnique,
41 mkSysLocalName, isExternallyVisibleName
43 import BasicTypes ( Unused )
46 import IOExts ( IORef, newIORef, readIORef, writeIORef )
51 %************************************************************************
53 \subsection{The main data type declarations}
55 %************************************************************************
58 Every @Var@ has a @Unique@, to uniquify it and for fast comparison, a
59 @Type@, and an @IdInfo@ (non-essential info about it, e.g.,
60 strictness). The essential info about different kinds of @Vars@ is
69 realUnique :: Int#, -- Key for fast comparison
70 -- Identical to the Unique in the name,
71 -- cached here for speed
73 varDetails :: VarDetails,
74 varInfo :: IdInfo -- Only used for Ids at the moment
80 | MutTyVar (IORef (Maybe Type)) -- Used during unification;
81 Bool -- True <=> this is a type signature variable, which
82 -- should not be unified with a non-tyvar type
83 | UVar -- Usage variable
85 -- For a long time I tried to keep mutable Vars statically type-distinct
86 -- from immutable Vars, but I've finally given up. It's just too painful.
87 -- After type checking there are no MutTyVars left, but there's no static check
92 instance Outputable Var where
93 ppr var = ppr (varName var)
95 instance Show Var where
96 showsPrec p var = showsPrecSDoc p (ppr var)
98 instance NamedThing Var where
101 instance Uniquable Var where
102 getUnique = varUnique
104 instance Eq Var where
105 a == b = realUnique a ==# realUnique b
107 instance Ord Var where
108 a <= b = realUnique a <=# realUnique b
109 a < b = realUnique a <# realUnique b
110 a >= b = realUnique a >=# realUnique b
111 a > b = realUnique a ># realUnique b
112 a `compare` b = varUnique a `compare` varUnique b
117 varUnique :: Var -> Unique
118 varUnique (Var {realUnique = uniq}) = mkUniqueGrimily uniq
120 setVarUnique :: Var -> Unique -> Var
121 setVarUnique var uniq = var {realUnique = getKey uniq,
122 varName = setNameUnique (varName var) uniq}
124 setVarName :: Var -> Name -> Var
125 setVarName var new_name
126 = var { realUnique = getKey (getUnique new_name), varName = new_name }
128 setVarOcc :: Var -> OccName -> Var
129 setVarOcc var new_occ
130 = var { varName = setNameOcc (varName var) new_occ }
132 setVarType :: Var -> Type -> Var
133 setVarType var ty = var {varType = ty}
137 %************************************************************************
139 \subsection{Type variables}
141 %************************************************************************
151 setTyVarUnique = setVarUnique
152 setTyVarName = setVarName
156 mkTyVar :: Name -> Kind -> TyVar
157 mkTyVar name kind = Var { varName = name
158 , realUnique = getKey (nameUnique name)
162 , varInfo = pprPanic "looking at IdInfo of a tyvar" (ppr name)
166 mkSysTyVar :: Unique -> Kind -> TyVar
167 mkSysTyVar uniq kind = Var { varName = name
168 , realUnique = getKey uniq
172 , varInfo = pprPanic "mkSysTyVar" (ppr name)
176 name = mkSysLocalName uniq SLIT("t")
178 newMutTyVar :: Name -> Kind -> IO TyVar
179 newMutTyVar name kind =
180 do loc <- newIORef Nothing
181 return (Var { varName = name,
182 realUnique = getKey (nameUnique name),
184 varDetails = MutTyVar loc False})
186 newSigTyVar :: Name -> Kind -> IO TyVar
187 newSigTyVar name kind =
188 do loc <- newIORef Nothing
189 return (Var { varName = name,
190 realUnique = getKey (nameUnique name),
192 varDetails = MutTyVar loc True})
194 readMutTyVar :: TyVar -> IO (Maybe Type)
195 readMutTyVar (Var {varDetails = MutTyVar loc _}) = readIORef loc
197 writeMutTyVar :: TyVar -> Maybe Type -> IO ()
198 writeMutTyVar (Var {varDetails = MutTyVar loc _}) val = writeIORef loc val
200 makeTyVarImmutable :: TyVar -> TyVar
201 makeTyVarImmutable tyvar = tyvar { varDetails = TyVar}
203 isTyVar :: Var -> Bool
204 isTyVar (Var {varDetails = details}) = case details of
209 isMutTyVar :: Var -> Bool
210 isMutTyVar (Var {varDetails = MutTyVar _ _}) = True
211 isMutTyVar other = False
213 isSigTyVar :: Var -> Bool
214 isSigTyVar (Var {varDetails = MutTyVar _ is_sig}) = is_sig
215 isSigTyVar other = False
219 %************************************************************************
221 \subsection{Usage variables}
223 %************************************************************************
230 mkUVar :: Unique -> UVar
231 mkUVar unique = Var { varName = mkSysLocalName unique SLIT("u"),
232 realUnique = getKey unique,
237 isUVar :: Var -> Bool
238 isUVar (Var {varDetails = details}) = case details of
244 %************************************************************************
246 \subsection{Id Construction}
248 %************************************************************************
250 Most Id-related functions are in Id.lhs and MkId.lhs
263 setIdUnique :: Id -> Unique -> Id
264 setIdUnique = setVarUnique
266 setIdName :: Id -> Name -> Id
267 setIdName = setVarName
269 setIdInfo :: Id -> IdInfo -> Id
270 setIdInfo var info = var {varInfo = info}
272 modifyIdInfo :: (IdInfo -> IdInfo) -> Id -> Id
273 modifyIdInfo fn var@(Var {varInfo = info}) = var {varInfo = fn info}
275 -- maybeModifyIdInfo tries to avoid unnecesary thrashing
276 maybeModifyIdInfo :: (IdInfo -> Maybe IdInfo) -> Id -> Id
277 maybeModifyIdInfo fn var@(Var {varInfo = info}) = case fn info of
279 Just new_info -> var {varInfo = new_info}
283 mkIdVar :: Name -> Type -> IdInfo -> Id
285 = Var {varName = name, realUnique = getKey (nameUnique name), varType = ty,
286 varDetails = AnId, varInfo = info}
291 isId (Var {varDetails = AnId}) = True
295 @externallyVisibleId@: is it true that another module might be
296 able to ``see'' this Id in a code generation sense. That
297 is, another .o file might refer to this Id.
299 In tidyCorePgm (SimplCore.lhs) we carefully set each top level thing's
300 local-ness precisely so that the test here would be easy
302 This defn appears here (rather than, say, in Id.lhs) because
303 CostCentre.lhs uses it (CostCentre feeds PprType feeds Id.lhs)
307 externallyVisibleId :: Id -> Bool
308 externallyVisibleId var = isExternallyVisibleName (varName var)