[GHC] #8628: dynCompileExpr breaks repeated runDecls of the same name
GHC
ghc-devs at haskell.org
Tue Dec 24 21:49:19 UTC 2013
#8628: dynCompileExpr breaks repeated runDecls of the same name
------------------------------------+-------------------------------------
Reporter: agibiansky | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: GHC API | Version: 7.6.3
Keywords: | Operating System: Unknown/Multiple
Architecture: Unknown/Multiple | Type of failure: None/Unknown
Difficulty: Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: |
------------------------------------+-------------------------------------
Using `dynCompileExpr` with `runDecls` from `InteractiveEval` seems to be
incredibly problematic when evaluating declarations for the same name. For
instance, consider the following code:
{{{
runDecls "data X = Y Int"
gtry $ runStmt "print (Y 3)" RunToCompletion :: GhcMonad m => m (Either
SomeException RunResult)
runDecls "data X = Y Int deriving Show"
runStmt "print (Y 8)" RunToCompletion
}}}
As expected, this prints `Y 8` once (the first one fails because `X` is
not an instance of `Show`).
However, if we insert an arbitrary `dynCompileExpr`, things begin to
break:
{{{
runDecls "data X = Y Int"
gtry $ runStmt "print (Y 3)" RunToCompletion :: GhcMonad m => m (Either
SomeException RunResult)
runDecls "data X = Y Int deriving Show"
_ <- dynCompileExpr "'x'"
runStmt "print (Y 8)" RunToCompletion
}}}
We then get:
{{{
No instance for (GHC.Show.Show :Interactive.X)
arising from a use of `System.IO.print'
Possible fix:
add an instance declaration for (GHC.Show.Show :Interactive.X)
}}}
Which is clearly incorrect - we haven't done anything to change the data
declaration.
I'm not sure what's going on, but I've tried to investigate into the
source of `dynCompileExpr`. It loads `Data.Dynamic` via a `setContext` and
then unloads it, and that may be the issue.
If we do the following (very similar to the `dynCompileExpr` source),
things work fine:
{{{
runDecls "data X = Y Int"
gtry $ runStmt "print (Y 3)" RunToCompletion :: GhcMonad m => m (Either
SomeException RunResult)
runDecls "data X = Y Int deriving Show"
let stmt = "let __expr = 'x'"
Just (ids, hval, fixenv) <- withSession $ \hsc_env ->
liftIO $ hscStmt hsc_env stmt
vals <- liftIO (unsafeCoerce hval :: IO [Char])
liftIO $ print vals -- thish prints "x", as expected
runStmt "print (Y 8)" RunToCompletion
}}}
I have not tested with GHC API other than 7.6.3, and could not find a bug
that was similar to this.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8628>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list