import System.Exit
import Data.Char
-import Compat.RawSystem ( rawSystem )
-import Compat.Directory ( findExecutable )
+#ifdef USING_COMPAT
+import Compat.RawSystem ( rawSystem )
+import Compat.Directory ( findExecutable )
+#else
+import System.Cmd ( rawSystem )
+import System.Directory ( findExecutable )
+#endif
main = do
args <- getArgs
"-ignore-dot-ghci" : ghc_args ++
[ "-e","System.Environment.withProgName "++show filename++" (System.Environment.withArgs ["
++ concat (intersperse "," (map show prog_args))
- ++ "] Main.main)", filename])
+ ++ "] (GHC.TopHandler.runIOFastExit (Main.main Prelude.>> (Prelude.return ()))))", filename])
+ -- runIOFastExit: makes exceptions raised by Main.main
+ -- behave in the same way as for a compiled program.
+ -- The "fast exit" part just calls exit() directly
+ -- instead of doing an orderly runtime shutdown,
+ -- otherwise the main GHCi thread will complain about
+ -- being interrupted.
+ --
+ -- Why (main >> return ()) rather than just main? Because
+ -- otherwise GHCi by default tries to evaluate the result
+ -- of the IO in order to show it (see #1200).
exitWith res
notArg ('-':_) = False