module UHC.Light.Compiler.CodeGen.ValAccess ( module UHC.Light.Compiler.CodeGen.BasicAnnot , patNmL2DepL , AltFetch (..) , HsName2RefMp, HsName2RefMpMp , HsName2FldMpMp, HsName2FldMp , offMpKeysSorted, offMpMpKeysSet ) where import UHC.Light.Compiler.Base.Common import UHC.Light.Compiler.Base.HsName.Builtin import UHC.Light.Compiler.CodeGen.RefGenerator import UHC.Util.Utils import UHC.Util.Pretty as Pretty import Data.Bits import Data.Maybe import qualified UHC.Util.FastSeq as Seq import qualified Data.Map as Map import qualified Data.Set as Set import Control.Monad import Control.Monad.State import UHC.Light.Compiler.CodeGen.BasicAnnot {-# LINE 126 "src/ehc/CodeGen/ValAccess.chs" #-} -- | Generate references starting at offset 0 with additional direction tweaking patNmL2DepL :: RefGenerator r => (Int -> Int) -> ([HsName] -> [HsName]) -> [HsName] -> AssocL HsName r patNmL2DepL fd fl nmL = refGen 0 (fd 1) (fl nmL) {-# LINE 136 "src/ehc/CodeGen/ValAccess.chs" #-} type HsName2RefMp meref = Map.Map HsName meref type HsName2RefMpMp mref meref = Map.Map HsName (mref, HsName2RefMp meref) {-# LINE 141 "src/ehc/CodeGen/ValAccess.chs" #-} type HsName2FldMp = HsName2RefMp Fld type HsName2FldMpMp = HsName2RefMpMp Fld Fld {-# LINE 146 "src/ehc/CodeGen/ValAccess.chs" #-} -- | Module names, sorted on import order, which is included as 0-based offset (used as index in import entry table) offMpKeysSorted :: (Ord mref, RefOfFld Fld mref) => HsName2FldMpMp -> AssocL HsName mref offMpKeysSorted m = sortOnLazy snd [ (n, refOfFld o) | (n,(o,_)) <- Map.toList m ] offMpMpKeysSet :: HsName2RefMpMp mref meref -> HsNameS offMpMpKeysSet m = Set.unions [ Map.keysSet m' | (_,m') <- Map.elems m ] {-# LINE 159 "src/ehc/CodeGen/ValAccess.chs" #-} data AltFetch lref = AltFetch_Many [HsName] -- multiple introduced names | AltFetch_One HsName lref -- single introduced name, field ref in node (excluding header) | AltFetch_Zero deriving Eq