X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FbasicTypes%2FVar.lhs;h=793cfc99547acf11dfadcbf3af072edbc016d864;hb=397858e2648824c5d71b3ddd365be8c5129cddc7;hp=3a070e7f346dcce1e1c06af3a3b4797c1a9aa69d;hpb=9d787ef5a8072b6c1f576f2de1b66edfa59813ed;p=ghc-hetmet.git diff --git a/ghc/compiler/basicTypes/Var.lhs b/ghc/compiler/basicTypes/Var.lhs index 3a070e7..793cfc9 100644 --- a/ghc/compiler/basicTypes/Var.lhs +++ b/ghc/compiler/basicTypes/Var.lhs @@ -1,15 +1,14 @@ -s% +% % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998 % \section{@Vars@: Variables} \begin{code} module Var ( - Var, IdOrTyVar, VarDetails, -- Abstract + Var, VarDetails, -- Abstract varName, varUnique, varInfo, varType, setVarName, setVarUnique, setVarType, setVarOcc, - -- TyVars TyVar, tyVarName, tyVarKind, @@ -26,14 +25,14 @@ module Var ( -- Ids Id, DictId, idName, idType, idUnique, idInfo, modifyIdInfo, maybeModifyIdInfo, - setIdName, setIdUnique, setIdInfo, lazySetIdInfo, + setIdName, setIdUnique, setIdInfo, lazySetIdInfo, zapIdInfo, mkIdVar, isId, externallyVisibleId ) where #include "HsVersions.h" import {-# SOURCE #-} TypeRep( Type, Kind ) -import {-# SOURCE #-} IdInfo( IdInfo, seqIdInfo ) +import {-# SOURCE #-} IdInfo( IdInfo, seqIdInfo, vanillaIdInfo ) import Unique ( Unique, Uniquable(..), mkUniqueGrimily, getKey ) import Name ( Name, OccName, NamedThing(..), @@ -61,8 +60,6 @@ strictness). The essential info about different kinds of @Vars@ is in its @VarDetails@. \begin{code} -type IdOrTyVar = Var - data Var = Var { varName :: Name, @@ -159,9 +156,7 @@ mkTyVar name kind = Var { varName = name , realUnique = getKey (nameUnique name) , varType = kind , varDetails = TyVar -#ifdef DEBUG - , varInfo = pprPanic "looking at IdInfo of a tyvar" (ppr name) -#endif + , varInfo = pprPanic "mkTyVar" (ppr name) } mkSysTyVar :: Unique -> Kind -> TyVar @@ -169,28 +164,25 @@ mkSysTyVar uniq kind = Var { varName = name , realUnique = getKey uniq , varType = kind , varDetails = TyVar -#ifdef DEBUG - , varInfo = pprPanic "mkSysTyVar" (ppr name) -#endif + , varInfo = pprPanic "mkSysTyVar" (ppr name) } where 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}) +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}) +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 @@ -229,18 +221,20 @@ type UVar = Var \begin{code} mkUVar :: Unique -> UVar -mkUVar unique = Var { varName = mkSysLocalName unique SLIT("u"), - realUnique = getKey unique, - varDetails = 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 -#ifdef DEBUG - , varType = pprPanic "looking at Type of a uvar" (ppr name) - , varInfo = pprPanic "looking at IdInfo of a uvar" (ppr name) -#endif + , varType = pprPanic "mkNamedUVar (varType)" (ppr name) + , varInfo = pprPanic "mkNamedUVar (varInfo)" (ppr name) } \end{code} @@ -284,6 +278,9 @@ setIdInfo :: Id -> IdInfo -> Id setIdInfo var info = seqIdInfo info `seq` var {varInfo = info} -- Try to avoid spack leaks by seq'ing +zapIdInfo :: Id -> Id +zapIdInfo var = var {varInfo = vanillaIdInfo} + modifyIdInfo :: (IdInfo -> IdInfo) -> Id -> Id modifyIdInfo fn var@(Var {varInfo = info}) = seqIdInfo new_info `seq` var {varInfo = new_info}