2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section{@Vars@: Variables}
8 Var, VarDetails, -- Abstract
9 varName, varUnique, varInfo, varType,
10 setVarName, setVarUnique, setVarType, setVarOcc,
15 setTyVarName, setTyVarUnique,
16 mkTyVar, mkSysTyVar, isTyVar, isSigTyVar,
17 newMutTyVar, newSigTyVar,
18 readMutTyVar, writeMutTyVar, isMutTyVar, makeTyVarImmutable,
27 idName, idType, idUnique, idInfo, modifyIdInfo, maybeModifyIdInfo,
28 setIdName, setIdUnique, setIdInfo, lazySetIdInfo, zapIdInfo,
29 mkIdVar, isId, externallyVisibleId
32 #include "HsVersions.h"
34 import {-# SOURCE #-} TypeRep( Type, Kind )
35 import {-# SOURCE #-} IdInfo( IdInfo, seqIdInfo, vanillaIdInfo )
37 import Unique ( Unique, Uniquable(..), mkUniqueGrimily, getKey )
38 import Name ( Name, OccName, NamedThing(..),
39 setNameUnique, setNameOcc, nameUnique,
40 mkSysLocalName, isExternallyVisibleName
45 import IOExts ( IORef, newIORef, readIORef, writeIORef )
49 %************************************************************************
51 \subsection{The main data type declarations}
53 %************************************************************************
56 Every @Var@ has a @Unique@, to uniquify it and for fast comparison, a
57 @Type@, and an @IdInfo@ (non-essential info about it, e.g.,
58 strictness). The essential info about different kinds of @Vars@ is
65 realUnique :: FastInt, -- Key for fast comparison
66 -- Identical to the Unique in the name,
67 -- cached here for speed
69 varDetails :: VarDetails,
70 varInfo :: IdInfo -- Only used for Ids at the moment
76 | MutTyVar (IORef (Maybe Type)) -- Used during unification;
77 Bool -- True <=> this is a type signature variable, which
78 -- should not be unified with a non-tyvar type
79 | UVar -- Usage variable
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@(Var {varName = name}) uniq
118 = var {realUnique = getKey uniq,
119 varName = setNameUnique name uniq}
121 setVarName :: Var -> Name -> Var
122 setVarName var new_name
123 = var { realUnique = getKey (getUnique new_name), varName = new_name }
125 setVarOcc :: Var -> OccName -> Var
126 setVarOcc var new_occ
127 = var { varName = setNameOcc (varName var) new_occ }
129 setVarType :: Var -> Type -> Var
130 setVarType var ty = var {varType = ty}
134 %************************************************************************
136 \subsection{Type variables}
138 %************************************************************************
148 setTyVarUnique = setVarUnique
149 setTyVarName = setVarName
153 mkTyVar :: Name -> Kind -> TyVar
154 mkTyVar name kind = Var { varName = name
155 , realUnique = getKey (nameUnique name)
158 , varInfo = pprPanic "mkTyVar" (ppr name)
161 mkSysTyVar :: Unique -> Kind -> TyVar
162 mkSysTyVar uniq kind = Var { varName = name
163 , realUnique = getKey uniq
166 , varInfo = pprPanic "mkSysTyVar" (ppr name)
169 name = mkSysLocalName uniq SLIT("t")
171 newMutTyVar :: Name -> Kind -> IO TyVar
172 newMutTyVar name kind = newTyVar name kind False
174 newSigTyVar :: Name -> Kind -> IO TyVar
175 -- Type variables from type signatures are still mutable, because
176 -- they may get unified with type variables from other signatures
177 -- But they do contain a flag to distinguish them, so we can tell if
178 -- we unify them with a non-type-variable.
179 newSigTyVar name kind = newTyVar name kind True
181 newTyVar name kind is_sig
182 = do loc <- newIORef Nothing
183 return (Var { varName = name
184 , realUnique = getKey (nameUnique name)
186 , varDetails = MutTyVar loc is_sig
187 , varInfo = pprPanic "newMutTyVar" (ppr name)
190 readMutTyVar :: TyVar -> IO (Maybe Type)
191 readMutTyVar (Var {varDetails = MutTyVar loc _}) = readIORef loc
193 writeMutTyVar :: TyVar -> Maybe Type -> IO ()
194 writeMutTyVar (Var {varDetails = MutTyVar loc _}) val = writeIORef loc val
196 makeTyVarImmutable :: TyVar -> TyVar
197 makeTyVarImmutable tyvar = tyvar { varDetails = TyVar}
199 isTyVar :: Var -> Bool
200 isTyVar (Var {varDetails = details}) = case details of
205 isMutTyVar :: Var -> Bool
206 isMutTyVar (Var {varDetails = MutTyVar _ _}) = True
207 isMutTyVar other = False
209 isSigTyVar :: Var -> Bool
210 isSigTyVar (Var {varDetails = MutTyVar _ is_sig}) = is_sig
211 isSigTyVar other = False
215 %************************************************************************
217 \subsection{Usage variables}
219 %************************************************************************
226 mkUVar :: Unique -> UVar
227 mkUVar unique = Var { varName = name
228 , realUnique = getKey unique
230 , varType = pprPanic "mkUVar (varType)" (ppr name)
231 , varInfo = pprPanic "mkUVar (varInfo)" (ppr name)
233 where name = mkSysLocalName unique SLIT("u")
235 mkNamedUVar :: Name -> UVar
236 mkNamedUVar name = Var { varName = name
237 , realUnique = getKey (nameUnique name)
239 , varType = pprPanic "mkNamedUVar (varType)" (ppr name)
240 , varInfo = pprPanic "mkNamedUVar (varInfo)" (ppr name)
245 isUVar :: Var -> Bool
246 isUVar (Var {varDetails = details}) = case details of
252 %************************************************************************
254 \subsection{Id Construction}
256 %************************************************************************
258 Most Id-related functions are in Id.lhs and MkId.lhs
271 setIdUnique :: Id -> Unique -> Id
272 setIdUnique = setVarUnique
274 setIdName :: Id -> Name -> Id
275 setIdName = setVarName
277 lazySetIdInfo :: Id -> IdInfo -> Id
278 lazySetIdInfo var info = var {varInfo = info}
280 setIdInfo :: Id -> IdInfo -> Id
281 setIdInfo var info = seqIdInfo info `seq` var {varInfo = info}
282 -- Try to avoid spack leaks by seq'ing
284 zapIdInfo :: Id -> Id
285 zapIdInfo var = var {varInfo = vanillaIdInfo}
287 modifyIdInfo :: (IdInfo -> IdInfo) -> Id -> Id
288 modifyIdInfo fn var@(Var {varInfo = info})
289 = seqIdInfo new_info `seq` var {varInfo = new_info}
293 -- maybeModifyIdInfo tries to avoid unnecesary thrashing
294 maybeModifyIdInfo :: (IdInfo -> Maybe IdInfo) -> Id -> Id
295 maybeModifyIdInfo fn var@(Var {varInfo = info}) = case fn info of
297 Just new_info -> var {varInfo = new_info}
301 mkIdVar :: Name -> Type -> IdInfo -> Id
303 = Var {varName = name, realUnique = getKey (nameUnique name), varType = ty,
304 varDetails = AnId, varInfo = info}
309 isId (Var {varDetails = AnId}) = True
313 @externallyVisibleId@: is it true that another module might be
314 able to ``see'' this Id in a code generation sense. That
315 is, another .o file might refer to this Id.
317 In tidyCorePgm (SimplCore.lhs) we carefully set each top level thing's
318 local-ness precisely so that the test here would be easy
320 This defn appears here (rather than, say, in Id.lhs) because
321 CostCentre.lhs uses it (CostCentre feeds PprType feeds Id.lhs)
325 externallyVisibleId :: Id -> Bool
326 externallyVisibleId var = isExternallyVisibleName (varName var)