[project @ 2000-10-16 08:24:18 by simonpj]
[ghc-hetmet.git] / ghc / compiler / basicTypes / Var.lhs
index 6315261..89bef36 100644 (file)
@@ -1,4 +1,4 @@
-s%
+%
 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
 %
 \section{@Vars@: Variables}
@@ -39,14 +39,13 @@ import Name         ( Name, OccName, NamedThing(..),
                          setNameUnique, setNameOcc, nameUnique, 
                          mkSysLocalName, isExternallyVisibleName
                        )
-import BasicTypes      ( Unused )
+import FastTypes
 import Outputable
 
 import IOExts          ( IORef, newIORef, readIORef, writeIORef )
 \end{code}
 
 
-
 %************************************************************************
 %*                                                                     *
 \subsection{The main data type declarations}
@@ -63,7 +62,7 @@ in its @VarDetails@.
 data Var
   = Var {
        varName    :: Name,
-       realUnique :: Int#,             -- Key for fast comparison
+       realUnique :: FastInt,          -- Key for fast comparison
                                        -- Identical to the Unique in the name,
                                        -- cached here for speed
        varType    :: Type,
@@ -170,24 +169,23 @@ mkSysTyVar uniq kind = Var { varName    = name
                       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 False
-                , varInfo    = pprPanic "newMutTyVar" (ppr name)
-                })
+newMutTyVar name kind = newTyVar name kind False
 
 newSigTyVar :: Name -> Kind -> IO TyVar
-newSigTyVar name kind = 
-  do loc <- newIORef Nothing
-     return (Var { varName    = name 
-                , realUnique = getKey (nameUnique name)
-                , varType    = kind
-                , varDetails = MutTyVar loc True
-                , varInfo    = pprPanic "newSigTyVar" (ppr name)
-                })
+-- Type variables from type signatures are still mutable, because
+-- they may get unified with type variables from other signatures
+-- But they do contain a flag to distinguish them, so we can tell if
+-- we unify them with a non-type-variable.
+newSigTyVar name kind = newTyVar name kind True
+
+newTyVar name kind is_sig
+ = do loc <- newIORef Nothing
+      return (Var { varName    = name
+                 , realUnique = getKey (nameUnique name)
+                 , varType    = kind
+                 , varDetails = MutTyVar loc is_sig
+                 , varInfo    = pprPanic "newMutTyVar" (ppr name)
+                 })
 
 readMutTyVar :: TyVar -> IO (Maybe Type)
 readMutTyVar (Var {varDetails = MutTyVar loc _}) = readIORef loc