From e296ab05449e63e8a3003390c0d5622f53893b00 Mon Sep 17 00:00:00 2001 From: Esa Ilari Vuokko Date: Wed, 23 Aug 2006 22:18:28 +0000 Subject: [PATCH] Add dynCompileExpr --- compiler/main/GHC.hs | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/compiler/main/GHC.hs b/compiler/main/GHC.hs index 74959fe..5e75793 100644 --- a/compiler/main/GHC.hs +++ b/compiler/main/GHC.hs @@ -78,7 +78,7 @@ module GHC ( RunResult(..), runStmt, showModule, - compileExpr, HValue, + compileExpr, HValue, dynCompileExpr, lookupName, #endif @@ -175,6 +175,7 @@ module GHC ( #ifdef GHCI import qualified Linker +import Data.Dynamic ( Dynamic ) import Linker ( HValue, extendLinkEnv ) import TcRnDriver ( tcRnLookupRdrName, tcRnGetInfo, tcRnLookupName, getModuleExports ) @@ -230,7 +231,7 @@ import SysTools ( initSysTools, cleanTempFiles, cleanTempFilesExcept, cleanTempDirs ) import Module import UniqFM -import PackageConfig ( PackageId ) +import PackageConfig ( PackageId, stringToPackageId ) import FiniteMap import Panic import Digraph @@ -2021,6 +2022,27 @@ compileExpr s expr = withSession s $ \hsc_env -> do _ -> panic "compileExpr" -- ----------------------------------------------------------------------------- +-- Compile an expression into a dynamic + +dynCompileExpr :: Session -> String -> IO (Maybe Dynamic) +dynCompileExpr ses expr = do + (full,exports) <- getContext ses + setContext ses full $ + (mkModule + (stringToPackageId "base") (mkModuleName "Data.Dynamic") + ):exports + let stmt = "let __dynCompileExpr = Data.Dynamic.toDyn (" ++ expr ++ ")" + res <- withSession ses (flip hscStmt stmt) + setContext ses full exports + case res of + Nothing -> return Nothing + Just (_, names, hvals) -> do + vals <- (unsafeCoerce# hvals :: IO [Dynamic]) + case (names,vals) of + (_:[], v:[]) -> return (Just v) + _ -> panic "dynCompileExpr" + +-- ----------------------------------------------------------------------------- -- running a statement interactively data RunResult -- 1.7.10.4