Use the right set of linkables in unload_wkr
[ghc-hetmet.git] / compiler / ghci / Linker.lhs
index 804d6c0..697cbc8 100644 (file)
@@ -230,13 +230,12 @@ dataConInfoPtrToName x = do
    -}
 
    getConDescAddress :: Ptr StgInfoTable -> IO (Ptr Word8)
-   getConDescAddress ptr = do
-#ifdef GHCI_TABLES_NEXT_TO_CODE
+   getConDescAddress ptr
+    | ghciTablesNextToCode = do
        offsetToString <- peek $ ptr `plusPtr` (- wORD_SIZE)
        return $ (ptr `plusPtr` stdInfoTableSizeB) `plusPtr` (fromIntegral (offsetToString :: StgWord))
-#else
+    | otherwise =
        peek $ intPtrToPtr $ (ptrToIntPtr ptr) + fromIntegral stdInfoTableSizeB
-#endif
 
    -- parsing names is a little bit fiddly because we have a string in the form: 
    -- pkg:A.B.C.foo, and we want to split it into three parts: ("pkg", "A.B.C", "foo").
@@ -294,22 +293,22 @@ linkDependencies hsc_env span needed_mods = do
 
 withExtendedLinkEnv :: [(Name,HValue)] -> IO a -> IO a
 withExtendedLinkEnv new_env action
-    = bracket set_new_env
-              reset_old_env
-              (const action)
+    = bracket_ set_new_env
+               reset_old_env
+               action
     where set_new_env = do 
             pls <- readIORef v_PersistentLinkerState
             let new_closure_env = extendClosureEnv (closure_env pls) new_env
                 new_pls = pls { closure_env = new_closure_env }
             writeIORef v_PersistentLinkerState new_pls
-            return (closure_env pls)
+            return ()
 
         -- Remember that the linker state might be side-effected
         -- during the execution of the IO action, and we don't want to
         -- lose those changes (we might have linked a new module or
         -- package), so the reset action only removes the names we
         -- added earlier.
-          reset_old_env env = do
+          reset_old_env = do
             modifyIORef v_PersistentLinkerState $ \pls ->
                 let cur = closure_env pls
                     new = delListFromNameEnv cur (map fst new_env)
@@ -447,13 +446,14 @@ preloadLib dflags lib_paths framework_paths lib_spec
                       Nothing -> maybePutStrLn dflags "done"
                       Just mm -> preloadFailed mm lib_paths lib_spec
 
-#ifdef darwin_TARGET_OS
          Framework framework
+           | isDarwinTarget
              -> do maybe_errstr <- loadFramework framework_paths framework
                    case maybe_errstr of
                       Nothing -> maybePutStrLn dflags "done"
                       Just mm -> preloadFailed mm framework_paths lib_spec
-#endif
+           | otherwise -> panic "preloadLib Framework"
+
   where
     preloadFailed :: String -> [String] -> LibrarySpec -> IO ()
     preloadFailed sys_errmsg paths spec
@@ -901,7 +901,7 @@ unload_wkr dflags linkables pls
   where
     maybeUnload :: [Linkable] -> Linkable -> IO Bool
     maybeUnload keep_linkables lnk
-      | linkableInSet lnk linkables = return True
+      | linkableInSet lnk keep_linkables = return True
       | otherwise                  
       = do mapM_ unloadObj [f | DotO f <- linkableUnlinked lnk]
                -- The components of a BCO linkable may contain
@@ -1052,10 +1052,10 @@ load_dyn dirs dll = do r <- loadDynamic dirs dll
                         Nothing  -> return ()
                         Just err -> throwDyn (CmdLineError ("can't load .so/.DLL for: " 
                                                              ++ dll ++ " (" ++ err ++ ")" ))
-#ifndef darwin_TARGET_OS
-loadFrameworks pkg = return ()
-#else
-loadFrameworks pkg = mapM_ load frameworks
+
+loadFrameworks pkg
+ | isDarwinTarget = mapM_ load frameworks
+ | otherwise = return ()
   where
     fw_dirs    = Packages.frameworkDirs pkg
     frameworks = Packages.frameworks pkg
@@ -1065,15 +1065,14 @@ loadFrameworks pkg = mapM_ load frameworks
                    Nothing  -> return ()
                    Just err -> throwDyn (CmdLineError ("can't load framework: " 
                                                                ++ fw ++ " (" ++ err ++ ")" ))
-#endif
 
 -- Try to find an object file for a given library in the given paths.
 -- If it isn't present, we assume it's a dynamic library.
-#ifndef __PIC__
--- When the GHC package was not compiled as dynamic library (=__PIC__ not set),
--- we search for .o libraries first.
 locateOneObj :: [FilePath] -> String -> IO LibrarySpec
 locateOneObj dirs lib
+ | not picIsOn
+    -- When the GHC package was not compiled as dynamic library 
+    -- (=__PIC__ not set), we search for .o libraries first.
   = do { mb_obj_path <- findFile mk_obj_path dirs 
        ; case mb_obj_path of
            Just obj_path -> return (Object obj_path)
@@ -1082,14 +1081,9 @@ locateOneObj dirs lib
                    ; case mb_lib_path of
                        Just lib_path -> return (DLL (lib ++ "-ghc" ++ cProjectVersion))
                        Nothing       -> return (DLL lib) }}            -- We assume
-   where
-     mk_obj_path dir = dir </> lib <.> "o"
-     mk_dyn_lib_path dir = dir </> mkSOName (lib ++ "-ghc" ++ cProjectVersion)
-#else
--- When the GHC package was compiled as dynamic library (=__PIC__ set),
--- we search for .so libraries first.
-locateOneObj :: [FilePath] -> String -> IO LibrarySpec
-locateOneObj dirs lib
+ | otherwise
+    -- When the GHC package was compiled as dynamic library (=__PIC__ set),
+    -- we search for .so libraries first.
   = do { mb_lib_path <- findFile mk_dyn_lib_path dirs
        ; case mb_lib_path of
            Just lib_path -> return (DLL (lib ++ "-ghc" ++ cProjectVersion))
@@ -1101,7 +1095,6 @@ locateOneObj dirs lib
    where
      mk_obj_path dir = dir </> (lib <.> "o")
      mk_dyn_lib_path dir = dir </> mkSOName (lib ++ "-ghc" ++ cProjectVersion)
-#endif
 
 -- ----------------------------------------------------------------------------
 -- Loading a dyanmic library (dlopen()-ish on Unix, LoadLibrary-ish on Win32)
@@ -1117,20 +1110,16 @@ loadDynamic paths rootname
   where
     mk_dll_path dir = dir </> mkSOName rootname
 
-#if defined(darwin_TARGET_OS)
-mkSOName root = ("lib" ++ root) <.> "dylib"
-#elif defined(mingw32_TARGET_OS)
--- Win32 DLLs have no .dll extension here, because addDLL tries
--- both foo.dll and foo.drv
-mkSOName root = root
-#else
-mkSOName root = ("lib" ++ root) <.> "so"
-#endif
+mkSOName root
+ | isDarwinTarget  = ("lib" ++ root) <.> "dylib"
+ | isWindowsTarget = -- Win32 DLLs have no .dll extension here, because
+                     -- addDLL tries both foo.dll and foo.drv
+                     root
+ | otherwise       = ("lib" ++ root) <.> "so"
 
 -- Darwin / MacOS X only: load a framework
 -- a framework is a dynamic library packaged inside a directory of the same
 -- name. They are searched for in different paths than normal libraries.
-#ifdef darwin_TARGET_OS
 loadFramework extraPaths rootname
    = do { either_dir <- Control.Exception.try getHomeDirectory
         ; let homeFrameworkPath = case either_dir of
@@ -1147,7 +1136,6 @@ loadFramework extraPaths rootname
      mk_fwk dir = dir </> (rootname ++ ".framework/" ++ rootname)
         -- sorry for the hardcoded paths, I hope they won't change anytime soon:
      defaultFrameworkPaths = ["/Library/Frameworks", "/System/Library/Frameworks"]
-#endif
 \end{code}
 
 %************************************************************************