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, isSigTyVar,
19 newMutTyVar, newSigTyVar,
20 readMutTyVar, writeMutTyVar, isMutTyVar, makeTyVarImmutable,
29 idDetails, idName, idType, idUnique, idInfo, modifyIdInfo,
30 setIdName, setIdUnique, setIdInfo,
31 mkId, isId, externallyVisibleId
34 #include "HsVersions.h"
36 import {-# SOURCE #-} Type( Type, Kind )
37 import {-# SOURCE #-} IdInfo( IdInfo )
38 import {-# SOURCE #-} Const( Con )
40 import FieldLabel ( FieldLabel )
41 import Unique ( Unique, Uniquable(..), mkUniqueGrimily, getKey )
42 import Name ( Name, OccName, NamedThing(..),
43 setNameUnique, setNameOcc, nameUnique,
44 mkSysLocalName, isExternallyVisibleName
46 import BasicTypes ( Unused )
49 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
72 realUnique :: Int#, -- Key for fast comparison
73 -- Identical to the Unique in the name,
74 -- cached here for speed
76 varDetails :: VarDetails,
77 varInfo :: IdInfo -- Only used for Ids at the moment
81 = VanillaId -- Most Ids are like this
82 | ConstantId Con -- The Id for a constant (data constructor or primop)
83 | RecordSelId FieldLabel -- The Id for a record selector
85 | MutTyVar (IORef (Maybe Type)) -- Used during unification;
86 Bool -- True <=> this is a type signature variable, which
87 -- should not be unified with a non-tyvar type
88 | UVar -- Usage variable
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
97 instance Outputable Var where
98 ppr var = ppr (varName var)
100 instance Show Var where
101 showsPrec p var = showsPrecSDoc p (ppr var)
103 instance NamedThing Var where
106 instance Uniquable Var where
107 getUnique = varUnique
109 instance Eq Var where
110 a == b = realUnique a ==# realUnique b
112 instance Ord Var where
113 a <= b = realUnique a <=# realUnique b
114 a < b = realUnique a <# realUnique b
115 a >= b = realUnique a >=# realUnique b
116 a > b = realUnique a ># realUnique b
117 a `compare` b = varUnique a `compare` varUnique b
122 varUnique :: Var -> Unique
123 varUnique (Var {realUnique = uniq}) = mkUniqueGrimily uniq
125 setVarUnique :: Var -> Unique -> Var
126 setVarUnique var uniq = var {realUnique = getKey uniq,
127 varName = setNameUnique (varName var) uniq}
129 setVarName :: Var -> Name -> Var
130 setVarName var new_name
131 = var { realUnique = getKey (getUnique new_name), varName = new_name }
133 setVarOcc :: Var -> OccName -> Var
134 setVarOcc var new_occ
135 = var { varName = setNameOcc (varName var) new_occ }
137 setVarType :: Var -> Type -> Var
138 setVarType var ty = var {varType = ty}
142 %************************************************************************
144 \subsection{Type variables}
146 %************************************************************************
156 setTyVarUnique = setVarUnique
157 setTyVarName = setVarName
161 mkTyVar :: Name -> Kind -> TyVar
162 mkTyVar name kind = Var { varName = name
163 , realUnique = getKey (nameUnique name)
167 , varInfo = pprPanic "mkTyVar" (ppr name)
171 mkSysTyVar :: Unique -> Kind -> TyVar
172 mkSysTyVar uniq kind = Var { varName = name
173 , realUnique = getKey uniq
177 , varInfo = pprPanic "mkSysTyVar" (ppr name)
181 name = mkSysLocalName uniq SLIT("t")
183 newMutTyVar :: Name -> Kind -> IO TyVar
184 newMutTyVar name kind =
185 do loc <- newIORef Nothing
186 return (Var { varName = name,
187 realUnique = getKey (nameUnique name),
189 varDetails = MutTyVar loc False})
191 newSigTyVar :: Name -> Kind -> IO TyVar
192 newSigTyVar name kind =
193 do loc <- newIORef Nothing
194 return (Var { varName = name,
195 realUnique = getKey (nameUnique name),
197 varDetails = MutTyVar loc True})
199 readMutTyVar :: TyVar -> IO (Maybe Type)
200 readMutTyVar (Var {varDetails = MutTyVar loc _}) = readIORef loc
202 writeMutTyVar :: TyVar -> Maybe Type -> IO ()
203 writeMutTyVar (Var {varDetails = MutTyVar loc _}) val = writeIORef loc val
205 makeTyVarImmutable :: TyVar -> TyVar
206 makeTyVarImmutable tyvar = tyvar { varDetails = TyVar}
208 isTyVar :: Var -> Bool
209 isTyVar (Var {varDetails = details}) = case details of
214 isMutTyVar :: Var -> Bool
215 isMutTyVar (Var {varDetails = MutTyVar _ _}) = True
216 isMutTyVar other = False
218 isSigTyVar :: Var -> Bool
219 isSigTyVar (Var {varDetails = MutTyVar _ is_sig}) = is_sig
220 isSigTyVar other = False
224 %************************************************************************
226 \subsection{Usage variables}
228 %************************************************************************
235 mkUVar :: Unique -> UVar
236 mkUVar unique = Var { varName = mkSysLocalName unique SLIT("u"),
237 realUnique = getKey unique,
242 isUVar :: Var -> Bool
243 isUVar (Var {varDetails = details}) = case details of
249 %************************************************************************
251 \subsection{Id Construction}
253 %************************************************************************
255 Most Id-related functions are in Id.lhs and MkId.lhs
267 idDetails = varDetails
269 setIdUnique :: Id -> Unique -> Id
270 setIdUnique = setVarUnique
272 setIdName :: Id -> Name -> Id
273 setIdName = setVarName
275 setIdInfo :: Id -> IdInfo -> Id
276 setIdInfo var info = var {varInfo = info}
278 modifyIdInfo :: Id -> (IdInfo -> IdInfo) -> Id
279 modifyIdInfo var@(Var {varInfo = info}) fn = var {varInfo = fn info}
283 mkId :: Name -> Type -> VarDetails -> IdInfo -> Id
284 mkId name ty details info
285 = Var {varName = name, realUnique = getKey (nameUnique name), varType = ty,
286 varDetails = details, varInfo = info}
291 isId (Var {varDetails = details}) = case details of
294 RecordSelId _ -> True
298 @externallyVisibleId@: is it true that another module might be
299 able to ``see'' this Id in a code generation sense. That
300 is, another .o file might refer to this Id.
302 In tidyCorePgm (SimplCore.lhs) we carefully set each top level thing's
303 local-ness precisely so that the test here would be easy
305 This defn appears here (rather than, say, in Id.lhs) because
306 CostCentre.lhs uses it (CostCentre feeds PprType feeds Id.lhs)
310 externallyVisibleId :: Id -> Bool
311 externallyVisibleId var = isExternallyVisibleName (varName var)