diff options
author | Edward Z. Yang <ezyang@cs.stanford.edu> | 2015-09-11 17:13:30 -0700 |
---|---|---|
committer | Edward Z. Yang <ezyang@cs.stanford.edu> | 2015-09-21 11:11:48 -0700 |
commit | 3f13c20e0c29d3db974c2a0d7d5ec15abd5a434b (patch) | |
tree | 0beb42ce43328983d54718bf835e82ea48c8d2db /compiler/ghci/Linker.hs | |
parent | c234acbe76da85556befad3eaa0c7c6b31e9e1c3 (diff) | |
download | haskell-3f13c20e0c29d3db974c2a0d7d5ec15abd5a434b.tar.gz |
Revert "Revert "Revert "Support for multiple signature files in scope."""
This reverts commit 214596de224afa576a9c295bcf53c6941d6892e0.
Diffstat (limited to 'compiler/ghci/Linker.hs')
-rw-r--r-- | compiler/ghci/Linker.hs | 46 |
1 files changed, 16 insertions, 30 deletions
diff --git a/compiler/ghci/Linker.hs b/compiler/ghci/Linker.hs index c5fe7139fc..8c2a07c07f 100644 --- a/compiler/ghci/Linker.hs +++ b/compiler/ghci/Linker.hs @@ -562,29 +562,23 @@ getLinkDeps hsc_env hpt pls replace_osuf span mods -- 3. For each dependent module, find its linkable -- This will either be in the HPT or (in the case of one-shot - -- compilation) we may need to use maybe_getFileLinkable. - -- If the module is actually a signature, there won't be a - -- linkable (thus catMaybes) + -- compilation) we may need to use maybe_getFileLinkable ; let { osuf = objectSuf dflags } - ; lnks_needed <- fmap Maybes.catMaybes - $ mapM (get_linkable osuf) mods_needed + ; lnks_needed <- mapM (get_linkable osuf) mods_needed ; return (lnks_needed, pkgs_needed) } where dflags = hsc_dflags hsc_env this_pkg = thisPackage dflags - -- | Given a list of modules @mods@, recursively discover all external - -- package and local module (according to @this_pkg@) dependencies. - -- - -- The 'ModIface' contains the transitive closure of the module dependencies - -- within the current package, *except* for boot modules: if we encounter - -- a boot module, we have to find its real interface and discover the - -- dependencies of that. Hence we need to traverse the dependency - -- tree recursively. See bug #936, testcase ghci/prog007. - follow_deps :: [Module] -- modules to follow - -> UniqSet ModuleName -- accum. module dependencies - -> UniqSet PackageKey -- accum. package dependencies + -- The ModIface contains the transitive closure of the module dependencies + -- within the current package, *except* for boot modules: if we encounter + -- a boot module, we have to find its real interface and discover the + -- dependencies of that. Hence we need to traverse the dependency + -- tree recursively. See bug #936, testcase ghci/prog007. + follow_deps :: [Module] -- modules to follow + -> UniqSet ModuleName -- accum. module dependencies + -> UniqSet PackageKey -- accum. package dependencies -> IO ([ModuleName], [PackageKey]) -- result follow_deps [] acc_mods acc_pkgs = return (uniqSetToList acc_mods, uniqSetToList acc_pkgs) @@ -607,7 +601,6 @@ getLinkDeps hsc_env hpt pls replace_osuf span mods where is_boot (m,True) = Left m is_boot (m,False) = Right m - -- Boot module dependencies which must be processed recursively boot_deps' = filter (not . (`elementOfUniqSet` acc_mods)) boot_deps acc_mods' = addListToUniqSet acc_mods (moduleName mod : mod_deps) acc_pkgs' = addListToUniqSet acc_pkgs $ map fst pkg_deps @@ -638,37 +631,30 @@ getLinkDeps hsc_env hpt pls replace_osuf span mods get_linkable osuf mod_name -- A home-package module | Just mod_info <- lookupUFM hpt mod_name - = adjust_linkable (hm_iface mod_info) - (Maybes.expectJust "getLinkDeps" (hm_linkable mod_info)) + = adjust_linkable (Maybes.expectJust "getLinkDeps" (hm_linkable mod_info)) | otherwise = do -- It's not in the HPT because we are in one shot mode, -- so use the Finder to get a ModLocation... - -- ezyang: I don't actually know how to trigger this codepath, - -- seeing as this is GHCi logic. Template Haskell, maybe? mb_stuff <- findHomeModule hsc_env mod_name case mb_stuff of - FoundExact loc mod -> found loc mod + Found loc mod -> found loc mod _ -> no_obj mod_name where found loc mod = do { -- ...and then find the linkable for it mb_lnk <- findObjectLinkableMaybe mod loc ; - iface <- initIfaceCheck hsc_env $ - loadUserInterface False (text "getLinkDeps2") mod ; case mb_lnk of { Nothing -> no_obj mod ; - Just lnk -> adjust_linkable iface lnk + Just lnk -> adjust_linkable lnk }} - adjust_linkable iface lnk - -- Signatures have no linkables! Don't return one. - | mi_hsc_src iface == HsigFile = return Nothing + adjust_linkable lnk | Just new_osuf <- replace_osuf = do new_uls <- mapM (adjust_ul new_osuf) (linkableUnlinked lnk) - return (Just lnk{ linkableUnlinked=new_uls }) + return lnk{ linkableUnlinked=new_uls } | otherwise = - return (Just lnk) + return lnk adjust_ul new_osuf (DotO file) = do MASSERT(osuf `isSuffixOf` file) |