summaryrefslogtreecommitdiff
path: root/ghc/compiler/basicTypes/Var.lhs
diff options
context:
space:
mode:
Diffstat (limited to 'ghc/compiler/basicTypes/Var.lhs')
-rw-r--r--ghc/compiler/basicTypes/Var.lhs144
1 files changed, 77 insertions, 67 deletions
diff --git a/ghc/compiler/basicTypes/Var.lhs b/ghc/compiler/basicTypes/Var.lhs
index fb760e6fca..6bf3a88b00 100644
--- a/ghc/compiler/basicTypes/Var.lhs
+++ b/ghc/compiler/basicTypes/Var.lhs
@@ -8,36 +8,39 @@ module Var (
Var, IdOrTyVar, -- Abstract
VarDetails(..), -- Concrete
varName, varUnique, varDetails, varInfo, varType,
- setVarName, setVarUnique, setVarType,
+ setVarName, setVarUnique, setVarType, setVarOcc,
-- TyVars
- TyVar, GenTyVar,
+ TyVar,
tyVarName, tyVarKind,
- tyVarFlexi, setTyVarFlexi, removeTyVarFlexi, setTyVarName, setTyVarUnique,
- mkFlexiTyVar, mkTyVar, mkSysTyVar, isTyVar, isFlexiTyVar,
+ setTyVarName, setTyVarUnique,
+ mkTyVar, mkSysTyVar, isTyVar,
+ newMutTyVar, readMutTyVar, writeMutTyVar, isMutTyVar, makeTyVarImmutable,
-- Ids
- Id, DictId, GenId,
- idName, idType, idUnique, idInfo, modifyIdInfo,
+ Id, DictId,
+ idDetails, idName, idType, idUnique, idInfo, modifyIdInfo,
setIdName, setIdUnique, setIdInfo,
mkId, isId, externallyVisibleId
) where
#include "HsVersions.h"
-import {-# SOURCE #-} Type( GenType, Kind )
+import {-# SOURCE #-} Type( Type, Kind )
import {-# SOURCE #-} IdInfo( IdInfo )
import {-# SOURCE #-} Const( Con )
import FieldLabel ( FieldLabel )
import Unique ( Unique, Uniquable(..), mkUniqueGrimily, getKey )
-import Name ( Name, NamedThing(..),
- changeUnique, nameUnique,
+import Name ( Name, OccName, NamedThing(..),
+ setNameUnique, setNameOcc, nameUnique,
mkSysLocalName, isExternallyVisibleName
)
import BasicTypes ( Unused )
import Outputable
+
+import IOExts ( IORef, newIORef, readIORef, writeIORef )
\end{code}
@@ -55,46 +58,49 @@ strictness). The essential info about different kinds of @Vars@ is
in its @VarDetails@.
\begin{code}
-type IdOrTyVar = Var Unused Unused
+type IdOrTyVar = Var
-data Var flex_self flex_ty
+data Var
= 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,
+ varType :: Type,
+ varDetails :: VarDetails,
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
+data VarDetails
+ = 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
+ | TyVar
+ | MutTyVar (IORef (Maybe Type)) -- Used during unification
+
+-- For a long time I tried to keep mutable Vars statically type-distinct
+-- from immutable Vars, but I've finally given up. It's just too painful.
+-- After type checking there are no MutTyVars left, but there's no static check
+-- of that fact.
\end{code}
\begin{code}
-instance Outputable (Var fs ft) where
+instance Outputable Var where
ppr var = ppr (varName var)
-instance Show (Var fs ft) where
+instance Show Var where
showsPrec p var = showsPrecSDoc p (ppr var)
-instance NamedThing (Var fs ft) where
+instance NamedThing Var where
getName = varName
-instance Uniquable (Var fs ft) where
+instance Uniquable Var where
getUnique = varUnique
-instance Eq (Var fs ft) where
+instance Eq Var where
a == b = realUnique a ==# realUnique b
-instance Ord (Var fs ft) where
+instance Ord Var where
a <= b = realUnique a <=# realUnique b
a < b = realUnique a <# realUnique b
a >= b = realUnique a >=# realUnique b
@@ -104,15 +110,22 @@ instance Ord (Var fs ft) where
\begin{code}
-setVarUnique :: Var fs ft -> Unique -> Var fs ft
+varUnique :: Var -> Unique
+varUnique (Var {realUnique = uniq}) = mkUniqueGrimily uniq
+
+setVarUnique :: Var -> Unique -> Var
setVarUnique var uniq = var {realUnique = getKey uniq,
- varName = changeUnique (varName var) uniq}
+ varName = setNameUnique (varName var) uniq}
-setVarName :: Var fs ft -> Name -> Var fs ft
+setVarName :: Var -> Name -> Var
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
+setVarOcc :: Var -> OccName -> Var
+setVarOcc var new_occ
+ = var { varName = setNameOcc (varName var) new_occ }
+
+setVarType :: Var -> Type -> Var
setVarType var ty = var {varType = ty}
\end{code}
@@ -124,10 +137,7 @@ setVarType var ty = var {varType = ty}
%************************************************************************
\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
+type TyVar = Var
\end{code}
\begin{code}
@@ -136,46 +146,47 @@ 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 -> TyVar
mkTyVar name kind = Var { varName = name, realUnique = getKey (nameUnique name),
varType = kind, varDetails = TyVar }
-mkSysTyVar :: Unique -> Kind -> GenTyVar flexi
+mkSysTyVar :: Unique -> Kind -> TyVar
mkSysTyVar uniq kind = Var { varName = name, realUnique = getKey uniq,
varType = kind, varDetails = TyVar }
where
- name = mkSysLocalName uniq
+ name = mkSysLocalName uniq SLIT("t")
+
+newMutTyVar :: Name -> Kind -> IO TyVar
+newMutTyVar name kind =
+ do loc <- newIORef Nothing
+ return (Var { varName = name,
+ realUnique = getKey (nameUnique name),
+ varType = kind,
+ varDetails = MutTyVar loc })
+
+readMutTyVar :: TyVar -> IO (Maybe Type)
+readMutTyVar (Var {varDetails = MutTyVar loc}) = readIORef loc
+
+writeMutTyVar :: TyVar -> Maybe Type -> IO ()
+writeMutTyVar (Var {varDetails = MutTyVar loc}) val = writeIORef loc val
-mkFlexiTyVar :: Name -> Kind -> flexi -> GenTyVar flexi
-mkFlexiTyVar name kind flex = Var { varName = name,
- realUnique = getKey (nameUnique name),
- varType = kind,
- varDetails = FlexiTyVar flex }
+makeTyVarImmutable :: TyVar -> TyVar
+makeTyVarImmutable tyvar = tyvar { varDetails = TyVar}
\end{code}
\begin{code}
-isTyVar :: Var fs ft -> Bool
+isTyVar :: Var -> Bool
isTyVar (Var {varDetails = details}) = case details of
- TyVar -> True
- FlexiTyVar _ -> True
- other -> False
+ TyVar -> True
+ MutTyVar _ -> True
+ other -> False
-isFlexiTyVar :: Var fs ft -> Bool
-isFlexiTyVar (Var {varDetails = FlexiTyVar _}) = True
-isFlexiTyVar other = False
+isMutTyVar :: Var -> Bool
+isMutTyVar (Var {varDetails = MutTyVar _}) = True
+isMutTyVar other = False
\end{code}
@@ -188,9 +199,8 @@ isFlexiTyVar other = False
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
+type Id = Var
+type DictId = Id
\end{code}
\begin{code}
@@ -206,22 +216,22 @@ setIdUnique = setVarUnique
setIdName :: Id -> Name -> Id
setIdName = setVarName
-setIdInfo :: GenId flexi -> IdInfo -> GenId flexi
+setIdInfo :: Id -> IdInfo -> Id
setIdInfo var info = var {varInfo = info}
-modifyIdInfo :: GenId flexi -> (IdInfo -> IdInfo) -> GenId flexi
+modifyIdInfo :: Id -> (IdInfo -> IdInfo) -> Id
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 -> Type -> VarDetails -> IdInfo -> Id
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 -> Bool
isId (Var {varDetails = details}) = case details of
VanillaId -> True
ConstantId _ -> True