X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FbasicTypes%2FVar.lhs;h=d2c22f3b414461ab72213fc2d5a30b92df234072;hb=1f5e55804b97d2b9a77207d568d602ba88d8855d;hp=deff82acda7222770ce1dbb87b6bfaa77ed6cb50;hpb=1553c7788e7f663bfc55813158325d695a21a229;p=ghc-hetmet.git diff --git a/ghc/compiler/basicTypes/Var.lhs b/ghc/compiler/basicTypes/Var.lhs index deff82a..d2c22f3 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 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 @@ -140,16 +143,16 @@ instance Ord Var where \begin{code} varUnique :: Var -> Unique -varUnique (Var {realUnique = uniq}) = mkUniqueGrimily uniq +varUnique (Var {realUnique = uniq}) = mkUniqueGrimily (iBox uniq) setVarUnique :: Var -> Unique -> Var setVarUnique var@(Var {varName = name}) uniq - = var {realUnique = getKey uniq, + = var {realUnique = getKey# uniq, varName = setNameUnique name uniq} setVarName :: Var -> Name -> Var setVarName var new_name - = var { realUnique = getKey (getUnique new_name), varName = new_name } + = var { realUnique = getKey# (getUnique new_name), varName = new_name } setVarOcc :: Var -> OccName -> Var setVarOcc var new_occ @@ -181,7 +184,7 @@ setTyVarName = setVarName \begin{code} mkTyVar :: Name -> Kind -> TyVar mkTyVar name kind = Var { varName = name - , realUnique = getKey (nameUnique name) + , realUnique = getKey# (nameUnique name) , varType = kind , varDetails = TyVar , varInfo = pprPanic "mkTyVar" (ppr name) @@ -189,29 +192,25 @@ mkTyVar name kind = Var { varName = name mkSysTyVar :: Unique -> Kind -> TyVar mkSysTyVar uniq kind = Var { varName = name - , realUnique = getKey uniq + , realUnique = getKey# uniq , varType = kind , varDetails = TyVar , varInfo = pprPanic "mkSysTyVar" (ppr name) } where - name = mkSystemName uniq FSLIT("t") + name = mkSystemTvNameEncoded 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) - }) +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) + } -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 +mutTyVarRef :: TyVar -> IORef (Maybe Type) +mutTyVarRef (Var {varDetails = MutTyVar loc _}) = loc makeTyVarImmutable :: TyVar -> TyVar makeTyVarImmutable tyvar = tyvar { varDetails = TyVar} @@ -285,7 +284,7 @@ maybeModifyIdInfo fn var@(Var {varInfo = info}) = case fn info of mkId :: Name -> Type -> VarDetails -> IdInfo -> Id mkId name ty details info = Var { varName = name, - realUnique = getKey (nameUnique name), -- Cache the unique + realUnique = getKey# (nameUnique name), -- Cache the unique varType = ty, varDetails = details, varInfo = info }