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,
17 newMutTyVar, newSigTyVar,
18 readMutTyVar, writeMutTyVar, makeTyVarImmutable,
22 idName, idType, idUnique, idInfo, modifyIdInfo, maybeModifyIdInfo,
23 setIdName, setIdUnique, setIdInfo, lazySetIdInfo,
24 setIdNoDiscard, zapSpecPragmaId,
26 globalIdDetails, setGlobalIdDetails,
28 mkLocalId, mkGlobalId, mkSpecPragmaId,
30 isTyVar, isMutTyVar, isSigTyVar,
31 isId, isLocalVar, isLocalId,
32 isGlobalId, isExportedId, isSpecPragmaId,
36 #include "HsVersions.h"
38 import {-# SOURCE #-} TypeRep( Type, Kind )
39 import {-# SOURCE #-} IdInfo( GlobalIdDetails, notGlobalId,
42 import Name ( Name, OccName, NamedThing(..),
43 setNameUnique, setNameOcc, nameUnique,
44 mkSysLocalName, isExternallyVisibleName
46 import Unique ( Unique, Uniquable(..), mkUniqueGrimily, getKey )
50 import IOExts ( IORef, newIORef, readIORef, writeIORef )
54 %************************************************************************
56 \subsection{The main data type declarations}
58 %************************************************************************
61 Every @Var@ has a @Unique@, to uniquify it and for fast comparison, a
62 @Type@, and an @IdInfo@ (non-essential info about it, e.g.,
63 strictness). The essential info about different kinds of @Vars@ is
70 realUnique :: FastInt, -- Key for fast comparison
71 -- Identical to the Unique in the name,
72 -- cached here for speed
74 varDetails :: VarDetails,
75 varInfo :: IdInfo -- Only used for Ids at the moment
79 = LocalId -- Used for locally-defined Ids (see NOTE below)
82 | GlobalId -- Used for imported Ids, dict selectors etc
86 | MutTyVar (IORef (Maybe Type)) -- Used during unification;
87 Bool -- True <=> this is a type signature variable, which
88 -- should not be unified with a non-tyvar type
90 -- For a long time I tried to keep mutable Vars statically type-distinct
91 -- from immutable Vars, but I've finally given up. It's just too painful.
92 -- After type checking there are no MutTyVars left, but there's no static check
96 = NotExported -- Not exported
97 | Exported -- Exported
98 | SpecPragma -- Not exported, but not to be discarded either
99 -- It's unclean that this is so deeply built in
105 * always a constant (top-level)
106 * imported, or data constructor, or primop, or record selector
107 * has a Unique that is globally unique across the whole
108 GHC invocation (a single invocation may compile multiple modules)
111 * bound within an expression (lambda, case, local let(rec))
112 * or defined at top level in the module being compiled
114 After CoreTidy, top-level LocalIds are turned into GlobalIds
118 instance Outputable Var where
119 ppr var = ppr (varName var)
121 instance Show Var where
122 showsPrec p var = showsPrecSDoc p (ppr var)
124 instance NamedThing Var where
127 instance Uniquable Var where
128 getUnique = varUnique
130 instance Eq Var where
131 a == b = realUnique a ==# realUnique b
133 instance Ord Var where
134 a <= b = realUnique a <=# realUnique b
135 a < b = realUnique a <# realUnique b
136 a >= b = realUnique a >=# realUnique b
137 a > b = realUnique a ># realUnique b
138 a `compare` b = varUnique a `compare` varUnique b
143 varUnique :: Var -> Unique
144 varUnique (Var {realUnique = uniq}) = mkUniqueGrimily uniq
146 setVarUnique :: Var -> Unique -> Var
147 setVarUnique var@(Var {varName = name}) uniq
148 = var {realUnique = getKey uniq,
149 varName = setNameUnique name uniq}
151 setVarName :: Var -> Name -> Var
152 setVarName var new_name
153 = var { realUnique = getKey (getUnique new_name), varName = new_name }
155 setVarOcc :: Var -> OccName -> Var
156 setVarOcc var new_occ
157 = var { varName = setNameOcc (varName var) new_occ }
159 setVarType :: Var -> Type -> Var
160 setVarType var ty = var {varType = ty}
164 %************************************************************************
166 \subsection{Type variables}
168 %************************************************************************
178 setTyVarUnique = setVarUnique
179 setTyVarName = setVarName
183 mkTyVar :: Name -> Kind -> TyVar
184 mkTyVar name kind = Var { varName = name
185 , realUnique = getKey (nameUnique name)
188 , varInfo = pprPanic "mkTyVar" (ppr name)
191 mkSysTyVar :: Unique -> Kind -> TyVar
192 mkSysTyVar uniq kind = Var { varName = name
193 , realUnique = getKey uniq
196 , varInfo = pprPanic "mkSysTyVar" (ppr name)
199 name = mkSysLocalName uniq SLIT("t")
201 newMutTyVar :: Name -> Kind -> IO TyVar
202 newMutTyVar name kind = newTyVar name kind False
204 newSigTyVar :: Name -> Kind -> IO TyVar
205 -- Type variables from type signatures are still mutable, because
206 -- they may get unified with type variables from other signatures
207 -- But they do contain a flag to distinguish them, so we can tell if
208 -- we unify them with a non-type-variable.
209 newSigTyVar name kind = newTyVar name kind True
211 newTyVar name kind is_sig
212 = do loc <- newIORef Nothing
213 return (Var { varName = name
214 , realUnique = getKey (nameUnique name)
216 , varDetails = MutTyVar loc is_sig
217 , varInfo = pprPanic "newMutTyVar" (ppr name)
220 readMutTyVar :: TyVar -> IO (Maybe Type)
221 readMutTyVar (Var {varDetails = MutTyVar loc _}) = readIORef loc
223 writeMutTyVar :: TyVar -> Maybe Type -> IO ()
224 writeMutTyVar (Var {varDetails = MutTyVar loc _}) val = writeIORef loc val
226 makeTyVarImmutable :: TyVar -> TyVar
227 makeTyVarImmutable tyvar = tyvar { varDetails = TyVar}
231 %************************************************************************
233 \subsection{Id Construction}
235 %************************************************************************
237 Most Id-related functions are in Id.lhs and MkId.lhs
250 setIdUnique :: Id -> Unique -> Id
251 setIdUnique = setVarUnique
253 setIdName :: Id -> Name -> Id
254 setIdName = setVarName
256 setIdNoDiscard :: Id -> Id
258 = WARN( not (isLocalId id), ppr id )
259 id { varDetails = LocalId Exported }
261 zapSpecPragmaId :: Id -> Id
263 = case varDetails id of
264 LocalId SpecPragma -> id { varDetails = LocalId NotExported }
267 lazySetIdInfo :: Id -> IdInfo -> Id
268 lazySetIdInfo var info = var {varInfo = info}
270 setIdInfo :: Id -> IdInfo -> Id
271 setIdInfo var info = seqIdInfo info `seq` var {varInfo = info}
272 -- Try to avoid spack leaks by seq'ing
274 modifyIdInfo :: (IdInfo -> IdInfo) -> Id -> Id
275 modifyIdInfo fn var@(Var {varInfo = info})
276 = seqIdInfo new_info `seq` var {varInfo = new_info}
280 -- maybeModifyIdInfo tries to avoid unnecesary thrashing
281 maybeModifyIdInfo :: (IdInfo -> Maybe IdInfo) -> Id -> Id
282 maybeModifyIdInfo fn var@(Var {varInfo = info}) = case fn info of
284 Just new_info -> var {varInfo = new_info}
287 %************************************************************************
289 \subsection{Predicates over variables
291 %************************************************************************
294 mkId :: Name -> Type -> VarDetails -> IdInfo -> Id
295 mkId name ty details info
296 = Var { varName = name,
297 realUnique = getKey (nameUnique name), -- Cache the unique
299 varDetails = details,
302 mkLocalId :: Name -> Type -> IdInfo -> Id
303 mkLocalId name ty info = mkId name ty (LocalId NotExported) info
305 mkSpecPragmaId :: Name -> Type -> IdInfo -> Id
306 mkSpecPragmaId name ty info = mkId name ty (LocalId SpecPragma) info
308 mkGlobalId :: GlobalIdDetails -> Name -> Type -> IdInfo -> Id
309 mkGlobalId details name ty info = mkId name ty (GlobalId details) info
313 isTyVar, isMutTyVar, isSigTyVar :: Var -> Bool
314 isId, isLocalVar, isLocalId :: Var -> Bool
315 isGlobalId, isExportedId, isSpecPragmaId :: Var -> Bool
316 mustHaveLocalBinding :: Var -> Bool
318 isTyVar var = case varDetails var of
323 isMutTyVar (Var {varDetails = MutTyVar _ _}) = True
324 isMutTyVar other = False
326 isSigTyVar (Var {varDetails = MutTyVar _ is_sig}) = is_sig
327 isSigTyVar other = False
329 isId var = case varDetails var of
334 isLocalId var = case varDetails var of
338 -- isLocalVar returns True for type variables as well as local Ids
339 -- These are the variables that we need to pay attention to when finding free
340 -- variables, or doing dependency analysis.
341 isLocalVar var = case varDetails var of
347 -- mustHaveLocalBinding returns True of Ids and TyVars
348 -- that must have a binding in this module. The converse
349 -- is not quite right: there are some GlobalIds that must have
350 -- bindings, such as record selectors. But that doesn't matter,
351 -- because it's only used for assertions
352 mustHaveLocalBinding var = isLocalVar var
354 isGlobalId var = case varDetails var of
358 -- isExportedId means "don't throw this away"
359 isExportedId var = case varDetails var of
360 LocalId Exported -> True
361 LocalId SpecPragma -> True
365 isSpecPragmaId var = case varDetails var of
366 LocalId SpecPragma -> True
371 globalIdDetails :: Var -> GlobalIdDetails
372 -- Works OK on local Ids too, returning notGlobalId
373 globalIdDetails var = case varDetails var of
374 GlobalId details -> details
376 setGlobalIdDetails :: Id -> GlobalIdDetails -> Id
377 setGlobalIdDetails id details = id { varDetails = GlobalId details }