1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
|
% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
%
\section{@Vars@: Variables}
\begin{code}
module Var (
Var, IdOrTyVar, -- Abstract
VarDetails(..), -- Concrete
varName, varUnique, varDetails, varInfo, varType,
setVarName, setVarUnique, setVarType,
-- TyVars
TyVar, GenTyVar,
tyVarName, tyVarKind,
tyVarFlexi, setTyVarFlexi, removeTyVarFlexi, setTyVarName, setTyVarUnique,
mkFlexiTyVar, mkTyVar, mkSysTyVar, isTyVar, isFlexiTyVar,
-- Ids
Id, DictId, GenId,
idName, idType, idUnique, idInfo, modifyIdInfo,
setIdName, setIdUnique, setIdInfo,
mkId, isId, externallyVisibleId
) where
#include "HsVersions.h"
import {-# SOURCE #-} Type( GenType, Kind )
import {-# SOURCE #-} IdInfo( IdInfo )
import {-# SOURCE #-} Const( Con )
import FieldLabel ( FieldLabel )
import Unique ( Unique, Uniquable(..), mkUniqueGrimily, getKey )
import Name ( Name, NamedThing(..),
changeUnique, nameUnique,
mkSysLocalName, isExternallyVisibleName
)
import BasicTypes ( Unused )
import Outputable
\end{code}
%************************************************************************
%* *
\subsection{The main data type declarations}
%* *
%************************************************************************
Every @Var@ has a @Unique@, to uniquify it and for fast comparison, a
@Type@, and an @IdInfo@ (non-essential info about it, e.g.,
strictness). The essential info about different kinds of @Vars@ is
in its @VarDetails@.
\begin{code}
type IdOrTyVar = Var Unused Unused
data Var flex_self flex_ty
= Var {
varName :: Name,
realUnique :: Int#, -- Key for fast comparison
-- Identical to the Unique in the name,
-- cached here for speed
varType :: GenType flex_ty,
varDetails :: VarDetails flex_self,
varInfo :: IdInfo -- Only used for Ids at the moment
}
varUnique Var{realUnique = uniq} = mkUniqueGrimily uniq
data VarDetails flex_self
= TyVar
| FlexiTyVar flex_self -- Used during unification
| VanillaId -- Most Ids are like this
| ConstantId Con -- The Id for a constant (data constructor or primop)
| RecordSelId FieldLabel -- The Id for a record selector
\end{code}
\begin{code}
instance Outputable (Var fs ft) where
ppr var = ppr (varName var)
instance Show (Var fs ft) where
showsPrec p var = showsPrecSDoc p (ppr var)
instance NamedThing (Var fs ft) where
getName = varName
instance Uniquable (Var fs ft) where
getUnique = varUnique
instance Eq (Var fs ft) where
a == b = realUnique a ==# realUnique b
instance Ord (Var fs ft) where
a <= b = realUnique a <=# realUnique b
a < b = realUnique a <# realUnique b
a >= b = realUnique a >=# realUnique b
a > b = realUnique a ># realUnique b
a `compare` b = varUnique a `compare` varUnique b
\end{code}
\begin{code}
setVarUnique :: Var fs ft -> Unique -> Var fs ft
setVarUnique var uniq = var {realUnique = getKey uniq,
varName = changeUnique (varName var) uniq}
setVarName :: Var fs ft -> Name -> Var fs ft
setVarName var new_name
= var { realUnique = getKey (getUnique new_name), varName = new_name }
setVarType :: Var flex_self flex_ty1 -> GenType flex_ty2 -> Var flex_self flex_ty2
setVarType var ty = var {varType = ty}
\end{code}
%************************************************************************
%* *
\subsection{Type variables}
%* *
%************************************************************************
\begin{code}
type GenTyVar flex_self = Var flex_self Unused -- Perhaps a mutable tyvar, but
-- with a fixed Kind
type TyVar = GenTyVar Unused -- NOt even mutable
\end{code}
\begin{code}
tyVarName = varName
tyVarKind = varType
setTyVarUnique = setVarUnique
setTyVarName = setVarName
tyVarFlexi :: GenTyVar flexi -> flexi
tyVarFlexi (Var {varDetails = FlexiTyVar flex}) = flex
tyVarFlexi other_var = pprPanic "tyVarFlexi" (ppr other_var)
setTyVarFlexi :: GenTyVar flexi1 -> flexi2 -> GenTyVar flexi2
setTyVarFlexi var flex = var {varDetails = FlexiTyVar flex}
removeTyVarFlexi :: GenTyVar flexi1 -> GenTyVar flexi2
removeTyVarFlexi var = var {varDetails = TyVar}
\end{code}
\begin{code}
mkTyVar :: Name -> Kind -> GenTyVar flexi
mkTyVar name kind = Var { varName = name, realUnique = getKey (nameUnique name),
varType = kind, varDetails = TyVar }
mkSysTyVar :: Unique -> Kind -> GenTyVar flexi
mkSysTyVar uniq kind = Var { varName = name, realUnique = getKey uniq,
varType = kind, varDetails = TyVar }
where
name = mkSysLocalName uniq
mkFlexiTyVar :: Name -> Kind -> flexi -> GenTyVar flexi
mkFlexiTyVar name kind flex = Var { varName = name,
realUnique = getKey (nameUnique name),
varType = kind,
varDetails = FlexiTyVar flex }
\end{code}
\begin{code}
isTyVar :: Var fs ft -> Bool
isTyVar (Var {varDetails = details}) = case details of
TyVar -> True
FlexiTyVar _ -> True
other -> False
isFlexiTyVar :: Var fs ft -> Bool
isFlexiTyVar (Var {varDetails = FlexiTyVar _}) = True
isFlexiTyVar other = False
\end{code}
%************************************************************************
%* *
\subsection{Id Construction}
%* *
%************************************************************************
Most Id-related functions are in Id.lhs and MkId.lhs
\begin{code}
type GenId flex_ty = Var Unused flex_ty
type Id = GenId Unused
type DictId = Id
\end{code}
\begin{code}
idName = varName
idType = varType
idUnique = varUnique
idInfo = varInfo
idDetails = varDetails
setIdUnique :: Id -> Unique -> Id
setIdUnique = setVarUnique
setIdName :: Id -> Name -> Id
setIdName = setVarName
setIdInfo :: GenId flexi -> IdInfo -> GenId flexi
setIdInfo var info = var {varInfo = info}
modifyIdInfo :: GenId flexi -> (IdInfo -> IdInfo) -> GenId flexi
modifyIdInfo var@(Var {varInfo = info}) fn = var {varInfo = fn info}
\end{code}
\begin{code}
mkId :: Name -> GenType flex_ty -> VarDetails Unused -> IdInfo -> GenId flex_ty
mkId name ty details info
= Var {varName = name, realUnique = getKey (nameUnique name), varType = ty,
varDetails = details, varInfo = info}
\end{code}
\begin{code}
isId :: Var fs ft -> Bool
isId (Var {varDetails = details}) = case details of
VanillaId -> True
ConstantId _ -> True
RecordSelId _ -> True
other -> False
\end{code}
@externallyVisibleId@: is it true that another module might be
able to ``see'' this Id in a code generation sense. That
is, another .o file might refer to this Id.
In tidyCorePgm (SimplCore.lhs) we carefully set each top level thing's
local-ness precisely so that the test here would be easy
This defn appears here (rather than, say, in Id.lhs) because
CostCentre.lhs uses it (CostCentre feeds PprType feeds Id.lhs)
\end{code}
\begin{code}
externallyVisibleId :: Id -> Bool
externallyVisibleId var = isExternallyVisibleName (varName var)
\end{code}
|