newMutTyVar, newSigTyVar,
readMutTyVar, writeMutTyVar, isMutTyVar, makeTyVarImmutable,
- -- UVars
- UVar,
- isUVar,
- mkUVar, mkNamedUVar,
-
-- Ids
Id, DictId,
idName, idType, idUnique, idInfo, modifyIdInfo, maybeModifyIdInfo,
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}
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,
| 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.
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
%************************************************************************
%* *
-\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}
%* *
%************************************************************************
-- 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}