[project @ 2003-11-06 17:09:50 by simonpj]
[ghc-hetmet.git] / ghc / compiler / basicTypes / Var.lhs
index e317315..d2c22f3 100644 (file)
@@ -14,7 +14,7 @@ module Var (
        tyVarName, tyVarKind,
        setTyVarName, setTyVarUnique,
        mkTyVar, mkSysTyVar, 
-       newMutTyVar, readMutTyVar, writeMutTyVar, makeTyVarImmutable, 
+       mkMutTyVar, mutTyVarRef, makeTyVarImmutable, 
 
        -- Ids
        Id, DictId,
@@ -43,11 +43,11 @@ import Name         ( Name, OccName, NamedThing(..),
                          setNameUnique, setNameOcc, nameUnique, 
                          mkSystemTvNameEncoded,
                        )
-import Unique          ( Unique, Uniquable(..), mkUniqueGrimily, getKey )
+import Unique          ( Unique, Uniquable(..), mkUniqueGrimily, getKey# )
 import FastTypes
 import Outputable
 
-import DATA_IOREF      ( 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,7 +192,7 @@ 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)
@@ -197,21 +200,17 @@ mkSysTyVar uniq kind = Var { varName    = name
                     where
                       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 }