Replace association list in AddressEnv for a FiniteMap
authorPepe Iborra <mnislaih@gmail.com>
Mon, 18 Dec 2006 14:17:15 +0000 (14:17 +0000)
committerPepe Iborra <mnislaih@gmail.com>
Mon, 18 Dec 2006 14:17:15 +0000 (14:17 +0000)
compiler/ghci/Linker.lhs
compiler/ghci/RtClosureInspect.hs

index e105bb2..8ff654e 100644 (file)
@@ -730,7 +730,7 @@ linkSomeBCOs toplevs_only ie ce_in de_in ul_bcos
         let de_additions = [(address, name) | (address, name) <- zip addresses names
                                             , not(address `elemAddressEnv` de_in) 
                            ]
-            de_out = extendAddressEnvList' de_in de_additions
+            de_out = extendAddressEnvList de_in de_additions
         return ( ce_out, de_out, hvals)
     where 
           goForRefs = getRefs []
index a4d853e..ae97423 100644 (file)
@@ -13,7 +13,6 @@ module RtClosureInspect(
      AddressEnv(..), \r
      DataConEnv,\r
      extendAddressEnvList, \r
-     extendAddressEnvList', \r
      elemAddressEnv, \r
      delFromAddressEnv, \r
      emptyAddressEnv, \r
@@ -78,6 +77,7 @@ import FastString       ( mkFastString )
 import Outputable\r
 import Maybes\r
 import Panic\r
+import FiniteMap\r
 \r
 import GHC.Arr          ( Array(..) )\r
 import GHC.Ptr          ( Ptr(..), castPtr )\r
@@ -87,8 +87,8 @@ import GHC.Word         ( Word32(..), Word64(..) )
 \r
 import Control.Monad    ( liftM, liftM2, msum )\r
 import Data.Maybe\r
-import Data.List\r
 import Data.Array.Base\r
+import Data.List        ( partition )\r
 import Foreign.Storable\r
 import Foreign          ( unsafePerformIO )\r
 \r
@@ -606,28 +606,25 @@ NOTE: (Num t) contexts have been manually replaced by Integer for clarity
 type DataConEnv   = AddressEnv StgInfoTable\r
 \r
 -- Note that this AddressEnv and DataConEnv I wrote trying to follow \r
--- conventions in ghc, but probably they make no sense. Should \r
--- probably be replaced by a plain Data.Map\r
+-- conventions in ghc, but probably they make not much sense.\r
 \r
-newtype AddressEnv a = AE {outAE::[(Ptr a, Name)]}\r
+newtype AddressEnv a = AE {aenv:: FiniteMap (Ptr a) Name}\r
+  deriving (Outputable)\r
 \r
-emptyAddressEnv = AE []\r
+emptyAddressEnv = AE emptyFM\r
 \r
 extendAddressEnvList  :: AddressEnv a -> [(Ptr a, Name)] -> AddressEnv a\r
-extendAddressEnvList' :: AddressEnv a -> [(Ptr a, Name)] -> AddressEnv a\r
 elemAddressEnv        :: Ptr a -> AddressEnv a -> Bool\r
 delFromAddressEnv     :: AddressEnv a -> Ptr a -> AddressEnv a\r
 nullAddressEnv        :: AddressEnv a -> Bool\r
 lookupAddressEnv       :: AddressEnv a -> Ptr a -> Maybe Name\r
 \r
-extendAddressEnvList  (AE env) = AE . nub . (++ env) \r
-extendAddressEnvList' (AE env) = AE . (++ env)\r
-elemAddressEnv ptr    (AE env) = ptr `elem` fst (unzip env) \r
-delFromAddressEnv (AE env) ptr = AE [(ptr', n) | (ptr', n) <- env, ptr' /= ptr]\r
-nullAddressEnv                 = null . outAE\r
-lookupAddressEnv       (AE env) = flip lookup env\r
-\r
-instance Outputable (AddressEnv a) where\r
- ppr (AE ae) = vcat [text (show ptr) <> comma <> ppr a | (ptr,a) <- ae] \r
+extendAddressEnvList  (AE env) = AE . addListToFM env \r
+elemAddressEnv   ptr  (AE env) = ptr `elemFM` env\r
+delFromAddressEnv     (AE env) = AE . delFromFM env\r
+nullAddressEnv                 = isEmptyFM . aenv\r
+lookupAddressEnv      (AE env) = lookupFM env\r
 \r
 \r
+instance Outputable (Ptr a) where\r
+  ppr = text . show
\ No newline at end of file