+
+-----------------------------------------------------------------------------
+-- Linker for interactive mode
+
+#ifndef GHCI
+linkObjs = panic "CmLink.linkObjs: no interpreter"
+unload = panic "CmLink.unload: no interpreter"
+lookupClosure = panic "CmLink.lookupClosure: no interpreter"
+#else
+linkObjs [] pls = linkFinish pls []
+linkObjs (l@(LM _ m uls) : ls) pls
+ | all isObject uls = do
+ if isLoaded l pls then linkObjs ls pls else do
+ let objs = [ file | DotO file <- uls ]
+ mapM_ loadObj objs
+ linkObjs ls pls{objects_loaded = l : objects_loaded pls}
+ | all isInterpretable uls = linkInterpretedCode (l:ls) [] pls
+ | otherwise = invalidLinkable
+
+isLoaded :: Linkable -> PersistentLinkerState -> Bool
+isLoaded l pls =
+ case findModuleLinkable_maybe (objects_loaded pls) (linkableModName l) of
+ Nothing -> False
+ Just m -> linkableTime l == linkableTime m
+
+linkInterpretedCode [] ul_trees pls = linkFinish pls ul_trees
+linkInterpretedCode (l@(LM _ m uls) : ls) ul_trees pls
+ | all isInterpretable uls =
+ if isLoaded l pls then linkInterpretedCode ls ul_trees pls else
+ linkInterpretedCode ls (uls++ul_trees)
+ pls{objects_loaded = l : objects_loaded pls}
+ | any isObject uls
+ = throwDyn (OtherError
+ "can't link object code that depends on interpreted code")
+ | otherwise = invalidLinkable
+
+invalidLinkable = panic "CmLink: linkable doesn't contain entirely objects or interpreted code"
+
+
+-- link all the interpreted code in one go.
+linkFinish pls ul_bcos = do
+ resolveObjs
+
+ let stuff = [ (bcos,itbls) | BCOs bcos itbls <- ul_bcos ]
+
+ (ibinds, new_itbl_env, new_closure_env) <-
+ linkIModules (itbl_env pls) (closure_env pls) stuff
+
+ let new_pls = pls { closure_env = new_closure_env,
+ itbl_env = new_itbl_env
+ }
+ return (LinkOK new_pls)
+
+linkExpr :: PersistentLinkerState -> UnlinkedBCOExpr -> IO HValue
+linkExpr PersistentLinkerState{ itbl_env = ie, closure_env = ce } bcos
+ = linkIExpr ie ce bcos
+#endif