X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Fmain%2FInteractiveEval.hs;h=be7aa0a85b87b45f43ac34bb74ee3f3b99eb13c2;hp=3173278e4833e6f7d7d5bc8cf9649500b704d0a7;hb=17b297d97d327620ed6bfab942f8992b2446f1bf;hpb=99794f66b568709176dd9fc2248a57a21a165556 diff --git a/compiler/main/InteractiveEval.hs b/compiler/main/InteractiveEval.hs index 3173278..be7aa0a 100644 --- a/compiler/main/InteractiveEval.hs +++ b/compiler/main/InteractiveEval.hs @@ -6,6 +6,13 @@ -- -- ----------------------------------------------------------------------------- +{-# OPTIONS_GHC -w #-} +-- The above warning supression flag is a temporary kludge. +-- While working on this module you are encouraged to remove it and fix +-- any warnings in the module. See +-- http://hackage.haskell.org/trac/ghc/wiki/WorkingConventions#Warnings +-- for details + module InteractiveEval ( #ifdef GHCI RunResult(..), Status(..), Resume(..), History(..), @@ -29,7 +36,7 @@ module InteractiveEval ( isModuleInterpreted, compileExpr, dynCompileExpr, lookupName, - obtainTerm, obtainTerm1, reconstructType, + Term(..), obtainTerm, obtainTerm1, obtainTermB, reconstructType, skolemiseSubst, skolemiseTy #endif ) where @@ -78,6 +85,7 @@ import GHC.Exts import Data.Array import Control.Exception as Exception import Control.Concurrent +import Data.List (sortBy) import Data.IORef import Foreign.StablePtr @@ -131,7 +139,7 @@ data History = History { historyApStack :: HValue, historyBreakInfo :: BreakInfo, - historyEnclosingDecl :: Name + historyEnclosingDecl :: Id -- ^^ A cache of the enclosing top level declaration, for convenience } @@ -154,23 +162,18 @@ getHistorySpan hsc_env hist = _ -> panic "getHistorySpan" -- | Finds the enclosing top level function name -findEnclosingDecl :: HscEnv -> Module -> SrcSpan -> Name +findEnclosingDecl :: HscEnv -> Module -> SrcSpan -> Id findEnclosingDecl hsc_env mod span = case lookupUFM (hsc_HPT hsc_env) (moduleName mod) of Nothing -> panic "findEnclosingDecl" Just hmi -> let - globals = typeEnvIds (md_types (hm_details hmi)) - Just decl = find (\n -> nameSrcSpan n < span) - (reverse $ map idName globals) - -- ^^ assumes md_types is sorted - in decl - --- | Find the Module corresponding to a FilePath -findModuleFromFile :: HscEnv -> FilePath -> Maybe Module -findModuleFromFile hsc_env fp = - listToMaybe $ [ms_mod ms | ms <- hsc_mod_graph hsc_env - , ml_hs_file(ms_location ms) == Just (read fp)] - + globals = typeEnvIds (md_types (hm_details hmi)) + Just decl = + find (\id -> let n = idName id in + nameSrcSpan n < span && isExternalName n) + (reverse$ sortBy (compare `on` (nameSrcSpan.idName)) + globals) + in decl -- | Run a statement in the current interactive context. Statement -- may bind multple values. @@ -516,8 +519,7 @@ bindLocalsAtBreakpoint hsc_env apStack (Just info) = do -- So that we don't fall over in a heap when this happens, just don't -- bind any free variables instead, and we emit a warning. mb_hValues <- mapM (getIdValFromApStack apStack) offsets - let (filtered_hvs, filtered_ids) = - unzip [ (hv, id) | (id, Just hv) <- zip ids mb_hValues ] + let filtered_ids = [ id | (id, Just hv) <- zip ids mb_hValues ] when (any isNothing mb_hValues) $ debugTraceMsg (hsc_dflags hsc_env) 1 $ text "Warning: _result has been evaluated, some bindings have been lost" @@ -564,7 +566,7 @@ bindLocalsAtBreakpoint hsc_env apStack (Just info) = do rttiEnvironment :: HscEnv -> IO HscEnv rttiEnvironment hsc_env@HscEnv{hsc_IC=ic} = do - let InteractiveContext{ic_tmp_ids=tmp_ids, ic_tyvars = tyvars} = ic + let InteractiveContext{ic_tmp_ids=tmp_ids} = ic incompletelyTypedIds = [id | id <- tmp_ids , not $ null [v | v <- varSetElems$ tyVarsOfType (idType id) @@ -907,12 +909,17 @@ isModuleInterpreted s mod_summary = withSession s $ \hsc_env -> obtainTerm1 :: HscEnv -> Bool -> Maybe Type -> a -> IO Term obtainTerm1 hsc_env force mb_ty x = - cvObtainTerm hsc_env force mb_ty (unsafeCoerce# x) + cvObtainTerm hsc_env maxBound force mb_ty (unsafeCoerce# x) + +obtainTermB :: HscEnv -> Int -> Bool -> Id -> IO Term +obtainTermB hsc_env bound force id = do + hv <- Linker.getHValue hsc_env (varName id) + cvObtainTerm hsc_env bound force (Just$ idType id) hv obtainTerm :: HscEnv -> Bool -> Id -> IO Term obtainTerm hsc_env force id = do hv <- Linker.getHValue hsc_env (varName id) - cvObtainTerm hsc_env force (Just$ idType id) hv + cvObtainTerm hsc_env maxBound force (Just$ idType id) hv -- Uses RTTI to reconstruct the type of an Id, making it less polymorphic reconstructType :: HscEnv -> Bool -> Id -> IO (Maybe Type)