[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