[project @ 2003-06-09 11:41:47 by simonmar]
[ghc-hetmet.git] / ghc / compiler / basicTypes / Var.lhs
index deff82a..66876c6 100644 (file)
@@ -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}