[project @ 2001-03-01 17:08:31 by simonpj]
[ghc-hetmet.git] / ghc / compiler / basicTypes / Var.lhs
index 54f010c..a7c4e3c 100644 (file)
@@ -17,11 +17,6 @@ module Var (
        newMutTyVar, newSigTyVar,
        readMutTyVar, writeMutTyVar, isMutTyVar, makeTyVarImmutable,
 
-        -- UVars
-        UVar,
-        isUVar,
-        mkUVar, mkNamedUVar,
-
        -- Ids
        Id, DictId,
        idName, idType, idUnique, idInfo, modifyIdInfo, maybeModifyIdInfo,
@@ -39,14 +34,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 +57,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,
@@ -77,7 +71,6 @@ data VarDetails
   | MutTyVar (IORef (Maybe Type))      -- Used during unification;
             Bool                       -- True <=> this is a type signature variable, which
                                        --          should not be unified with a non-tyvar type
-  | UVar                                -- Usage variable
 
 -- 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.
@@ -170,24 +163,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
@@ -216,43 +208,6 @@ isSigTyVar other                             = False
 
 %************************************************************************
 %*                                                                     *
-\subsection{Usage variables}
-%*                                                                     *
-%************************************************************************
-
-\begin{code}
-type UVar = Var
-\end{code}
-
-\begin{code}
-mkUVar :: Unique -> UVar
-mkUVar unique = Var { varName    = name
-                   , realUnique = getKey unique
-                   , varDetails = UVar
-                   , varType    = pprPanic "mkUVar (varType)" (ppr name)
-                   , varInfo    = pprPanic "mkUVar (varInfo)" (ppr name)
-                   }
-             where name = mkSysLocalName unique SLIT("u")
-
-mkNamedUVar :: Name -> UVar
-mkNamedUVar name = Var { varName    = name
-                      , realUnique = getKey (nameUnique name)
-                      , varDetails = UVar
-                      , varType    = pprPanic "mkNamedUVar (varType)" (ppr name)
-                      , varInfo    = pprPanic "mkNamedUVar (varInfo)" (ppr name)
-                      }
-\end{code}
-
-\begin{code}
-isUVar :: Var -> Bool
-isUVar (Var {varDetails = details}) = case details of
-                                       UVar       -> True
-                                       other      -> False
-\end{code}
-
-
-%************************************************************************
-%*                                                                     *
 \subsection{Id Construction}
 %*                                                                     *
 %************************************************************************
@@ -295,8 +250,8 @@ modifyIdInfo fn var@(Var {varInfo = info})
 -- maybeModifyIdInfo tries to avoid unnecesary thrashing
 maybeModifyIdInfo :: (IdInfo -> Maybe IdInfo) -> Id -> Id
 maybeModifyIdInfo fn var@(Var {varInfo = info}) = case fn info of
-                                               Nothing       -> var
-                                               Just new_info -> var {varInfo = new_info}
+                                                       Nothing       -> var
+                                                       Just new_info -> var {varInfo = new_info}
 \end{code}
 
 \begin{code}