X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FbasicTypes%2FVar.lhs;h=66876c6415deb6c03dd4c782953e7b6eb34d0625;hb=07d4332263895cabac09db76e21ad9c4071011a8;hp=deff82acda7222770ce1dbb87b6bfaa77ed6cb50;hpb=1553c7788e7f663bfc55813158325d695a21a229;p=ghc-hetmet.git diff --git a/ghc/compiler/basicTypes/Var.lhs b/ghc/compiler/basicTypes/Var.lhs index deff82a..66876c6 100644 --- a/ghc/compiler/basicTypes/Var.lhs +++ b/ghc/compiler/basicTypes/Var.lhs @@ -14,7 +14,7 @@ module Var ( tyVarName, tyVarKind, setTyVarName, setTyVarUnique, mkTyVar, mkSysTyVar, - newMutTyVar, readMutTyVar, writeMutTyVar, makeTyVarImmutable, + mkMutTyVar, mutTyVarRef, makeTyVarImmutable, -- Ids Id, DictId, @@ -41,13 +41,13 @@ import {-# SOURCE #-} IdInfo( GlobalIdDetails, notGlobalId, import Name ( Name, OccName, NamedThing(..), setNameUnique, setNameOcc, nameUnique, - mkSystemName + mkSystemTvNameEncoded, ) import Unique ( Unique, Uniquable(..), mkUniqueGrimily, getKey ) import FastTypes import Outputable -import IOExts ( IORef, newIORef, readIORef, writeIORef ) +import DATA_IOREF ( IORef ) \end{code} @@ -85,11 +85,14 @@ data VarDetails | TyVar | MutTyVar (IORef (Maybe Type)) -- Used during unification; TyVarDetails + -- TODO: the IORef should be unboxed here, but we don't want to unbox + -- the Name above. - -- 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. + -- 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. data LocalIdDetails = NotExported -- Not exported @@ -195,23 +198,19 @@ mkSysTyVar uniq kind = Var { varName = name , varInfo = pprPanic "mkSysTyVar" (ppr name) } where - name = mkSystemName uniq FSLIT("t") - -newMutTyVar :: Name -> Kind -> TyVarDetails -> IO TyVar -newMutTyVar name kind details - = do loc <- newIORef Nothing - return (Var { varName = name - , realUnique = getKey (nameUnique name) - , varType = kind - , varDetails = MutTyVar loc details - , varInfo = pprPanic "newMutTyVar" (ppr name) - }) - -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 + name = mkSystemTvNameEncoded uniq FSLIT("t") + +mkMutTyVar :: Name -> Kind -> TyVarDetails -> IORef (Maybe Type) -> TyVar +mkMutTyVar name kind details ref + = Var { varName = name + , realUnique = getKey (nameUnique name) + , varType = kind + , varDetails = MutTyVar ref details + , varInfo = pprPanic "newMutTyVar" (ppr name) + } + +mutTyVarRef :: TyVar -> IORef (Maybe Type) +mutTyVarRef (Var {varDetails = MutTyVar loc _}) = loc makeTyVarImmutable :: TyVar -> TyVar makeTyVarImmutable tyvar = tyvar { varDetails = TyVar}