@@ -895,6 +895,7 @@ findAndReadIface hsc_env doc_str mod wanted_mod hi_boot_file = do
895
895
mhome_unit = hsc_home_unit_maybe hsc_env
896
896
dflags = hsc_dflags hsc_env
897
897
logger = hsc_logger hsc_env
898
+ hooks = hsc_hooks hsc_env
898
899
899
900
900
901
trace_if logger (sep [hsep [text " Reading" ,
@@ -905,59 +906,51 @@ findAndReadIface hsc_env doc_str mod wanted_mod hi_boot_file = do
905
906
ppr mod <> semi],
906
907
nest 4 (text " reason:" <+> doc_str)])
907
908
908
- -- Check for GHC.Prim, and return its static interface
909
- -- See Note [GHC.Prim] in primops.txt.pp.
910
- -- TODO: make this check a function
911
- if mod `installedModuleEq` gHC_PRIM
912
- then do
913
- let iface = getGhcPrimIface hsc_env
914
- return (Succeeded (iface, panic " GHC.Prim ModLocation (findAndReadIface)" ))
915
- else do
916
- -- Look for the file
917
- mb_found <- liftIO (findExactModule hsc_env mod hi_boot_file)
918
- case mb_found of
919
- InstalledFound loc -> do
920
- -- See Note [Home module load error]
921
- if HUG. memberHugUnitId (moduleUnit mod ) (hsc_HUG hsc_env)
922
- && not (isOneShot (ghcMode dflags))
923
- then return (Failed (HomeModError mod loc))
924
- else do
925
- r <- read_file logger name_cache unit_state dflags wanted_mod (ml_hi_file loc)
926
- case r of
927
- Failed err
928
- -> return (Failed $ BadIfaceFile err)
929
- Succeeded (iface,_fp)
930
- -> do
931
- r2 <- load_dynamic_too_maybe logger name_cache unit_state
932
- (setDynamicNow dflags) wanted_mod
933
- iface loc
934
- case r2 of
935
- Failed sdoc -> return (Failed sdoc)
936
- Succeeded {} -> return $ Succeeded (iface, loc)
937
- err -> do
938
- trace_if logger (text " ...not found" )
939
- return $ Failed $ cannotFindInterface
940
- unit_state
941
- mhome_unit
942
- profile
943
- (moduleName mod )
944
- err
909
+ -- Look for the file
910
+ mb_found <- liftIO (findExactModule hsc_env mod hi_boot_file)
911
+ case mb_found of
912
+ InstalledFound loc -> do
913
+ -- See Note [Home module load error]
914
+ if HUG. memberHugUnitId (moduleUnit mod ) (hsc_HUG hsc_env)
915
+ && not (isOneShot (ghcMode dflags))
916
+ then return (Failed (HomeModError mod loc))
917
+ else do
918
+ r <- read_file hooks logger name_cache unit_state dflags wanted_mod (ml_hi_file loc)
919
+ case r of
920
+ Failed err
921
+ -> return (Failed $ BadIfaceFile err)
922
+ Succeeded (iface,_fp)
923
+ -> do
924
+ r2 <- load_dynamic_too_maybe hooks logger name_cache unit_state
925
+ (setDynamicNow dflags) wanted_mod
926
+ iface loc
927
+ case r2 of
928
+ Failed sdoc -> return (Failed sdoc)
929
+ Succeeded {} -> return $ Succeeded (iface, loc)
930
+ err -> do
931
+ trace_if logger (text " ...not found" )
932
+ return $ Failed $ cannotFindInterface
933
+ unit_state
934
+ mhome_unit
935
+ profile
936
+ (moduleName mod )
937
+ err
945
938
946
939
-- | Check if we need to try the dynamic interface for -dynamic-too
947
- load_dynamic_too_maybe :: Logger -> NameCache -> UnitState -> DynFlags
940
+ load_dynamic_too_maybe :: Hooks -> Logger -> NameCache -> UnitState -> DynFlags
948
941
-> Module -> ModIface -> ModLocation
949
942
-> IO (MaybeErr MissingInterfaceError () )
950
- load_dynamic_too_maybe logger name_cache unit_state dflags wanted_mod iface loc
943
+ load_dynamic_too_maybe hooks logger name_cache unit_state dflags wanted_mod iface loc
951
944
-- Indefinite interfaces are ALWAYS non-dynamic.
952
945
| not (moduleIsDefinite (mi_module iface)) = return (Succeeded () )
953
- | gopt Opt_BuildDynamicToo dflags = load_dynamic_too logger name_cache unit_state dflags wanted_mod iface loc
946
+ | gopt Opt_BuildDynamicToo dflags = load_dynamic_too hooks logger name_cache unit_state dflags wanted_mod iface loc
954
947
| otherwise = return (Succeeded () )
955
948
956
- load_dynamic_too :: Logger -> NameCache -> UnitState -> DynFlags
949
+ load_dynamic_too :: Hooks -> Logger -> NameCache -> UnitState -> DynFlags
957
950
-> Module -> ModIface -> ModLocation
958
951
-> IO (MaybeErr MissingInterfaceError () )
959
- load_dynamic_too logger name_cache unit_state dflags wanted_mod iface loc = do
960
- read_file logger name_cache unit_state dflags wanted_mod (ml_dyn_hi_file loc) >>= \ case
952
+ load_dynamic_too hooks logger name_cache unit_state dflags wanted_mod iface loc = do
953
+ read_file hooks logger name_cache unit_state dflags wanted_mod (ml_dyn_hi_file loc) >>= \ case
961
954
Succeeded (dynIface, _)
962
955
| mi_mod_hash iface == mi_mod_hash dynIface
963
956
-> return (Succeeded () )
@@ -971,10 +964,10 @@ load_dynamic_too logger name_cache unit_state dflags wanted_mod iface loc = do
971
964
972
965
973
966
974
- read_file :: Logger -> NameCache -> UnitState -> DynFlags
967
+ read_file :: Hooks -> Logger -> NameCache -> UnitState -> DynFlags
975
968
-> Module -> FilePath
976
969
-> IO (MaybeErr ReadInterfaceError (ModIface , FilePath ))
977
- read_file logger name_cache unit_state dflags wanted_mod file_path = do
970
+ read_file hooks logger name_cache unit_state dflags wanted_mod file_path = do
978
971
979
972
-- Figure out what is recorded in mi_module. If this is
980
973
-- a fully definite interface, it'll match exactly, but
@@ -985,7 +978,7 @@ read_file logger name_cache unit_state dflags wanted_mod file_path = do
985
978
(_, Just indef_mod) ->
986
979
instModuleToModule unit_state
987
980
(uninstantiateInstantiatedModule indef_mod)
988
- read_result <- readIface logger dflags name_cache wanted_mod' file_path
981
+ read_result <- readIface hooks logger dflags name_cache wanted_mod' file_path
989
982
case read_result of
990
983
Failed err -> return (Failed err)
991
984
Succeeded iface -> return (Succeeded (iface, file_path))
@@ -1012,29 +1005,37 @@ flagsToIfCompression dflags
1012
1005
-- Failed err <=> file not found, or unreadable, or illegible
1013
1006
-- Succeeded iface <=> successfully found and parsed
1014
1007
readIface
1015
- :: Logger
1008
+ :: Hooks
1009
+ -> Logger
1016
1010
-> DynFlags
1017
1011
-> NameCache
1018
1012
-> Module
1019
1013
-> FilePath
1020
1014
-> IO (MaybeErr ReadInterfaceError ModIface )
1021
- readIface logger dflags name_cache wanted_mod file_path = do
1015
+ readIface hooks logger dflags name_cache wanted_mod file_path = do
1022
1016
trace_if logger (text " readIFace" <+> text file_path)
1023
- let profile = targetProfile dflags
1024
- res <- tryMost $ readBinIface profile name_cache CheckHiWay QuietBinIFace file_path
1025
- case res of
1026
- Right iface
1027
- -- NB: This check is NOT just a sanity check, it is
1028
- -- critical for correctness of recompilation checking
1029
- -- (it lets us tell when -this-unit-id has changed.)
1030
- | wanted_mod == actual_mod
1031
- -> return (Succeeded iface)
1032
- | otherwise -> return (Failed err)
1033
- where
1034
- actual_mod = mi_module iface
1035
- err = HiModuleNameMismatchWarn file_path wanted_mod actual_mod
1036
-
1037
- Left exn -> return (Failed (ExceptionOccurred file_path exn))
1017
+ -- Check for GHC.Prim, and return its static interface
1018
+ -- See Note [GHC.Prim] in primops.txt.pp.
1019
+ if wanted_mod == gHC_PRIM
1020
+ then do
1021
+ -- TODO: should we check for the existence of the file?
1022
+ return (Succeeded (getGhcPrimIface hooks))
1023
+ else do
1024
+ let profile = targetProfile dflags
1025
+ res <- tryMost $ readBinIface profile name_cache CheckHiWay QuietBinIFace file_path
1026
+ case res of
1027
+ Right iface
1028
+ -- NB: This check is NOT just a sanity check, it is
1029
+ -- critical for correctness of recompilation checking
1030
+ -- (it lets us tell when -this-unit-id has changed.)
1031
+ | wanted_mod == actual_mod
1032
+ -> return (Succeeded iface)
1033
+ | otherwise -> return (Failed err)
1034
+ where
1035
+ actual_mod = mi_module iface
1036
+ err = HiModuleNameMismatchWarn file_path wanted_mod actual_mod
1037
+
1038
+ Left exn -> return (Failed (ExceptionOccurred file_path exn))
1038
1039
1039
1040
{-
1040
1041
*********************************************************
@@ -1245,8 +1246,8 @@ instance Outputable WhereFrom where
1245
1246
-- This is a helper function that takes into account the hook allowing ghc-prim
1246
1247
-- interface to be extended via the ghc-api. Afaik it was introduced for GHCJS
1247
1248
-- so that it can add its own primitive types.
1248
- getGhcPrimIface :: HscEnv -> ModIface
1249
- getGhcPrimIface hsc_env =
1250
- case ghcPrimIfaceHook (hsc_hooks hsc_env) of
1249
+ getGhcPrimIface :: Hooks -> ModIface
1250
+ getGhcPrimIface hooks =
1251
+ case ghcPrimIfaceHook hooks of
1251
1252
Nothing -> ghcPrimIface
1252
1253
Just h -> h
0 commit comments