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
154 , realUnique = getKey (nameUnique name)
158 , varInfo = pprPanic "mkTyVar" (ppr name)
162 mkSysTyVar :: Unique -> Kind -> TyVar
163 mkSysTyVar uniq kind = Var { varName = name
164 , realUnique = getKey uniq
168 , varInfo = pprPanic "mkSysTyVar" (ppr name)
172 name = mkSysLocalName uniq SLIT("t")
174 newMutTyVar :: Name -> Kind -> IO TyVar
175 newMutTyVar name kind =
176 do loc <- newIORef Nothing
177 return (Var { varName = name,
178 realUnique = getKey (nameUnique name),
180 varDetails = MutTyVar loc })
182 readMutTyVar :: TyVar -> IO (Maybe Type)
183 readMutTyVar (Var {varDetails = MutTyVar loc}) = readIORef loc
185 writeMutTyVar :: TyVar -> Maybe Type -> IO ()
186 writeMutTyVar (Var {varDetails = MutTyVar loc}) val = writeIORef loc val
188 makeTyVarImmutable :: TyVar -> TyVar
189 makeTyVarImmutable tyvar = tyvar { varDetails = TyVar}
193 isTyVar :: Var -> Bool
194 isTyVar (Var {varDetails = details}) = case details of
199 isMutTyVar :: Var -> Bool
200 isMutTyVar (Var {varDetails = MutTyVar _}) = True
201 isMutTyVar other = False
205 %************************************************************************
207 \subsection{Id Construction}
209 %************************************************************************
211 Most Id-related functions are in Id.lhs and MkId.lhs
223 idDetails = varDetails
225 setIdUnique :: Id -> Unique -> Id
226 setIdUnique = setVarUnique
228 setIdName :: Id -> Name -> Id
229 setIdName = setVarName
231 setIdInfo :: Id -> IdInfo -> Id
232 setIdInfo var info = var {varInfo = info}
234 modifyIdInfo :: Id -> (IdInfo -> IdInfo) -> Id
235 modifyIdInfo var@(Var {varInfo = info}) fn = var {varInfo = fn info}
239 mkId :: Name -> Type -> VarDetails -> IdInfo -> Id
240 mkId name ty details info
241 = Var {varName = name, realUnique = getKey (nameUnique name), varType = ty,
242 varDetails = details, varInfo = info}
247 isId (Var {varDetails = details}) = case details of
250 RecordSelId _ -> True
254 @externallyVisibleId@: is it true that another module might be
255 able to ``see'' this Id in a code generation sense. That
256 is, another .o file might refer to this Id.
258 In tidyCorePgm (SimplCore.lhs) we carefully set each top level thing's
259 local-ness precisely so that the test here would be easy
261 This defn appears here (rather than, say, in Id.lhs) because
262 CostCentre.lhs uses it (CostCentre feeds PprType feeds Id.lhs)
266 externallyVisibleId :: Id -> Bool
267 externallyVisibleId var = isExternallyVisibleName (varName var)