X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fmain%2FInteractiveEval.hs;h=bf7c7b47dc92de6b2f5636bea924f06e8a1d97cd;hb=1168a37f6bfad3d7025ecb21b9917799937936f3;hp=6e6580e2487cd727e74099180a3d15c33e9fabca;hpb=0c45d82423fcff64b43b95ab4882b26e7de560bf;p=ghc-hetmet.git diff --git a/compiler/main/InteractiveEval.hs b/compiler/main/InteractiveEval.hs index 6e6580e..bf7c7b4 100644 --- a/compiler/main/InteractiveEval.hs +++ b/compiler/main/InteractiveEval.hs @@ -64,6 +64,7 @@ import ByteCodeInstr import Linker import DynFlags import Unique +import UniqSupply import Module import Panic import UniqFM @@ -208,10 +209,10 @@ runStmt (Session ref) expr step Nothing -> return RunFailed Just (ids, hval) -> do - withBreakAction (isStep step) dflags' breakMVar statusMVar $ do - - let thing_to_run = unsafeCoerce# hval :: IO [HValue] - status <- sandboxIO dflags' statusMVar thing_to_run + status <- + withBreakAction (isStep step) dflags' breakMVar statusMVar $ do + let thing_to_run = unsafeCoerce# hval :: IO [HValue] + sandboxIO dflags' statusMVar thing_to_run let ic = hsc_IC hsc_env bindings = (ic_tmp_ids ic, ic_tyvars ic) @@ -315,7 +316,7 @@ foreign import ccall "&rts_breakpoint_io_action" -- thread. ToDo: we might want a way to continue even if the target -- thread doesn't die when it receives the exception... "this thread -- is not responding". --- sandboxIO :: MVar Status -> IO [HValue] -> IO Status +sandboxIO :: DynFlags -> MVar Status -> IO [HValue] -> IO Status sandboxIO dflags statusMVar thing = withInterruptsSentTo (forkIO (do res <- Exception.try (rethrow dflags thing) @@ -330,7 +331,7 @@ sandboxIO dflags statusMVar thing = -- to :continue twice, which looks strange). So if the exception is -- not "Interrupted", we unset the exception flag before throwing. -- --- rethrow :: IO a -> IO a +rethrow :: DynFlags -> IO a -> IO a rethrow dflags io = Exception.catch io $ \e -> do -- NB. not catchDyn case e of -- If -fbreak-on-error, we break unconditionally, @@ -440,7 +441,6 @@ resume (Session ref) step handleRunStatus expr ref bindings final_ids breakMVar statusMVar status hist' - back :: Session -> IO ([Name], Int, SrcSpan) back = moveHist (+1) @@ -582,7 +582,13 @@ bindLocalsAtBreakpoint hsc_env apStack (Just info) = do where mkNewId :: OccName -> Id -> IO Id mkNewId occ id = do - let uniq = idUnique id + us <- mkSplitUniqSupply 'I' + -- we need a fresh Unique for each Id we bind, because the linker + -- state is single-threaded and otherwise we'd spam old bindings + -- whenever we stop at a breakpoint. The InteractveContext is properly + -- saved/restored, but not the linker state. See #1743, test break026. + let + uniq = uniqFromSupply us loc = nameSrcSpan (idName id) name = mkInternalName uniq occ loc ty = idType id @@ -603,7 +609,7 @@ rttiEnvironment hsc_env@HscEnv{hsc_IC=ic} = do let substs = [computeRTTIsubst ty ty' | (ty, Just ty') <- zip (map idType incompletelyTypedIds) tys] ic' = foldr (flip substInteractiveContext) ic - (map skolemiseSubst $ catMaybes substs) + (map skolemiseSubst substs) return hsc_env{hsc_IC=ic'} skolemiseSubst subst = subst `setTvSubstEnv`