summaryrefslogtreecommitdiff
path: root/libraries
diff options
context:
space:
mode:
authorTamar Christina <tamar@zhox.com>2016-12-19 19:09:18 +0000
committerTamar Christina <tamar@zhox.com>2016-12-19 19:09:18 +0000
commitf1dfce1cb2a823696d6d3a9ea41c2bc73d949f12 (patch)
treeb14692ca8e33e8f925a1fa47542eb3499fc79f0e /libraries
parentbb74bc79daf8b91b21a1b68b0a406828d188ed92 (diff)
downloadhaskell-f1dfce1cb2a823696d6d3a9ea41c2bc73d949f12.tar.gz
Revert "Allow use of the external interpreter in stage1."
This reverts commit 52ba9470a7e85d025dc84a6789aa809cdd68b566.
Diffstat (limited to 'libraries')
-rw-r--r--libraries/ghci/GHCi/BreakArray.hs6
-rw-r--r--libraries/ghci/GHCi/InfoTable.hsc125
-rw-r--r--libraries/ghci/GHCi/Message.hs33
-rw-r--r--libraries/ghci/GHCi/Run.hs13
-rw-r--r--libraries/ghci/ghci.cabal.in21
5 files changed, 82 insertions, 116 deletions
diff --git a/libraries/ghci/GHCi/BreakArray.hs b/libraries/ghci/GHCi/BreakArray.hs
index bece43bdb9..311bbd6c5e 100644
--- a/libraries/ghci/GHCi/BreakArray.hs
+++ b/libraries/ghci/GHCi/BreakArray.hs
@@ -19,17 +19,14 @@
module GHCi.BreakArray
(
BreakArray
-#ifdef GHCI
(BA) -- constructor is exported only for ByteCodeGen
, newBreakArray
, getBreak
, setBreakOn
, setBreakOff
, showBreakArray
-#endif
) where
-#ifdef GHCI
import Control.Monad
import Data.Word
import GHC.Word
@@ -115,6 +112,3 @@ readBA# array i = IO $ \s ->
readBreakArray :: BreakArray -> Int -> IO Word8
readBreakArray (BA array) (I# i) = readBA# array i
-#else
-data BreakArray
-#endif
diff --git a/libraries/ghci/GHCi/InfoTable.hsc b/libraries/ghci/GHCi/InfoTable.hsc
index 8a9dfc2fa0..e4deb3b6ff 100644
--- a/libraries/ghci/GHCi/InfoTable.hsc
+++ b/libraries/ghci/GHCi/InfoTable.hsc
@@ -6,11 +6,9 @@
-- We use the RTS data structures directly via hsc2hs.
--
module GHCi.InfoTable
- ( peekItbl, StgInfoTable(..)
+ ( mkConInfoTable
+ , peekItbl, StgInfoTable(..)
, conInfoPtr
-#ifdef GHCI
- , mkConInfoTable
-#endif
) where
#if !defined(TABLES_NEXT_TO_CODE)
@@ -22,66 +20,6 @@ import GHC.Ptr
import GHC.Exts
import System.IO.Unsafe
-type ItblCodes = Either [Word8] [Word32]
-
--- Get definitions for the structs, constants & config etc.
-#include "Rts.h"
-
--- Ultra-minimalist version specially for constructors
-#if SIZEOF_VOID_P == 8
-type HalfWord = Word32
-#elif SIZEOF_VOID_P == 4
-type HalfWord = Word16
-#else
-#error Uknown SIZEOF_VOID_P
-#endif
-
-type EntryFunPtr = FunPtr (Ptr () -> IO (Ptr ()))
-
-data StgInfoTable = StgInfoTable {
- entry :: Maybe EntryFunPtr, -- Just <=> not ghciTablesNextToCode
- ptrs :: HalfWord,
- nptrs :: HalfWord,
- tipe :: HalfWord,
- srtlen :: HalfWord,
- code :: Maybe ItblCodes -- Just <=> ghciTablesNextToCode
- }
-
-peekItbl :: Ptr StgInfoTable -> IO StgInfoTable
-peekItbl a0 = do
-#if defined(TABLES_NEXT_TO_CODE)
- let entry' = Nothing
-#else
- entry' <- Just <$> (#peek StgInfoTable, entry) a0
-#endif
- ptrs' <- (#peek StgInfoTable, layout.payload.ptrs) a0
- nptrs' <- (#peek StgInfoTable, layout.payload.nptrs) a0
- tipe' <- (#peek StgInfoTable, type) a0
- srtlen' <- (#peek StgInfoTable, srt_bitmap) a0
- return StgInfoTable
- { entry = entry'
- , ptrs = ptrs'
- , nptrs = nptrs'
- , tipe = tipe'
- , srtlen = srtlen'
- , code = Nothing
- }
-
--- | Convert a pointer to an StgConInfo into an info pointer that can be
--- used in the header of a closure.
-conInfoPtr :: Ptr () -> Ptr ()
-conInfoPtr ptr
- | ghciTablesNextToCode = ptr `plusPtr` (#size StgConInfoTable)
- | otherwise = ptr
-
-ghciTablesNextToCode :: Bool
-#ifdef TABLES_NEXT_TO_CODE
-ghciTablesNextToCode = True
-#else
-ghciTablesNextToCode = False
-#endif
-
-#ifdef GHCI /* To end */
mkConInfoTable
:: Int -- ptr words
-> Int -- non-ptr words
@@ -114,6 +52,8 @@ mkConInfoTable ptr_words nonptr_words tag ptrtag con_desc =
-- -----------------------------------------------------------------------------
-- Building machine code fragments for a constructor's entry code
+type ItblCodes = Either [Word8] [Word32]
+
funPtrToInt :: FunPtr a -> Int
funPtrToInt (FunPtr a) = I## (addr2Int## a)
@@ -340,6 +280,9 @@ byte7 w = fromIntegral (w `shiftR` 56)
-- -----------------------------------------------------------------------------
-- read & write intfo tables
+-- Get definitions for the structs, constants & config etc.
+#include "Rts.h"
+
-- entry point for direct returns for created constr itbls
foreign import ccall "&stg_interp_constr1_entry" stg_interp_constr1_entry :: EntryFunPtr
foreign import ccall "&stg_interp_constr2_entry" stg_interp_constr2_entry :: EntryFunPtr
@@ -359,11 +302,30 @@ interpConstrEntry = [ error "pointer tag 0"
, stg_interp_constr6_entry
, stg_interp_constr7_entry ]
+-- Ultra-minimalist version specially for constructors
+#if SIZEOF_VOID_P == 8
+type HalfWord = Word32
+#elif SIZEOF_VOID_P == 4
+type HalfWord = Word16
+#else
+#error Uknown SIZEOF_VOID_P
+#endif
+
data StgConInfoTable = StgConInfoTable {
conDesc :: Ptr Word8,
infoTable :: StgInfoTable
}
+type EntryFunPtr = FunPtr (Ptr () -> IO (Ptr ()))
+
+data StgInfoTable = StgInfoTable {
+ entry :: Maybe EntryFunPtr, -- Just <=> not ghciTablesNextToCode
+ ptrs :: HalfWord,
+ nptrs :: HalfWord,
+ tipe :: HalfWord,
+ srtlen :: HalfWord,
+ code :: Maybe ItblCodes -- Just <=> ghciTablesNextToCode
+ }
pokeConItbl
:: Ptr StgConInfoTable -> Ptr StgConInfoTable -> StgConInfoTable
@@ -402,6 +364,26 @@ pokeItbl a0 itbl = do
Just (Right xs) -> pokeArray code_offset xs
#endif
+peekItbl :: Ptr StgInfoTable -> IO StgInfoTable
+peekItbl a0 = do
+#if defined(TABLES_NEXT_TO_CODE)
+ let entry' = Nothing
+#else
+ entry' <- Just <$> (#peek StgInfoTable, entry) a0
+#endif
+ ptrs' <- (#peek StgInfoTable, layout.payload.ptrs) a0
+ nptrs' <- (#peek StgInfoTable, layout.payload.nptrs) a0
+ tipe' <- (#peek StgInfoTable, type) a0
+ srtlen' <- (#peek StgInfoTable, srt_bitmap) a0
+ return StgInfoTable
+ { entry = entry'
+ , ptrs = ptrs'
+ , nptrs = nptrs'
+ , tipe = tipe'
+ , srtlen = srtlen'
+ , code = Nothing
+ }
+
newExecConItbl :: StgInfoTable -> [Word8] -> IO (FunPtr ())
newExecConItbl obj con_desc
= alloca $ \pcode -> do
@@ -426,6 +408,13 @@ foreign import ccall unsafe "allocateExec"
foreign import ccall unsafe "flushExec"
_flushExec :: CUInt -> Ptr a -> IO ()
+-- | Convert a pointer to an StgConInfo into an info pointer that can be
+-- used in the header of a closure.
+conInfoPtr :: Ptr () -> Ptr ()
+conInfoPtr ptr
+ | ghciTablesNextToCode = ptr `plusPtr` (#size StgConInfoTable)
+ | otherwise = ptr
+
-- -----------------------------------------------------------------------------
-- Constants and config
@@ -454,4 +443,10 @@ rtsIsProfiled = unsafeDupablePerformIO rtsIsProfiledIO /= 0
cONSTR :: Int -- Defined in ClosureTypes.h
cONSTR = (#const CONSTR)
-#endif /* GHCI */
+
+ghciTablesNextToCode :: Bool
+#ifdef TABLES_NEXT_TO_CODE
+ghciTablesNextToCode = True
+#else
+ghciTablesNextToCode = False
+#endif
diff --git a/libraries/ghci/GHCi/Message.hs b/libraries/ghci/GHCi/Message.hs
index fe4e95eb9e..4d0417e2da 100644
--- a/libraries/ghci/GHCi/Message.hs
+++ b/libraries/ghci/GHCi/Message.hs
@@ -1,6 +1,5 @@
-{-# LANGUAGE GADTs, DeriveGeneric, StandaloneDeriving, ScopedTypeVariables,
- GeneralizedNewtypeDeriving, ExistentialQuantification, RecordWildCards,
- CPP #-}
+{-# LANGUAGE GADTs, DeriveGeneric, StandaloneDeriving,
+ GeneralizedNewtypeDeriving, ExistentialQuantification, RecordWildCards #-}
{-# OPTIONS_GHC -fno-warn-name-shadowing -fno-warn-orphans #-}
-- |
@@ -15,7 +14,6 @@ module GHCi.Message
, QResult(..)
, EvalStatus_(..), EvalStatus, EvalResult(..), EvalOpts(..), EvalExpr(..)
, SerializableException(..)
- , toSerializableException, fromSerializableException
, THResult(..), THResultType(..)
, ResumeContext(..)
, QState(..)
@@ -42,11 +40,7 @@ import Data.Dynamic
import Data.IORef
import Data.Map (Map)
import GHC.Generics
-#if MIN_VERSION_base(4,9,0)
import GHC.Stack.CCS
-#else
-import GHC.Stack as GHC.Stack.CCS
-#endif
import qualified Language.Haskell.TH as TH
import qualified Language.Haskell.TH.Syntax as TH
import System.Exit
@@ -358,28 +352,7 @@ data SerializableException
| EOtherException String
deriving (Generic, Show)
-toSerializableException :: SomeException -> SerializableException
-toSerializableException ex
- | Just UserInterrupt <- fromException ex = EUserInterrupt
- | Just (ec::ExitCode) <- fromException ex = (EExitCode ec)
- | otherwise = EOtherException (show (ex :: SomeException))
-
-fromSerializableException :: SerializableException -> SomeException
-fromSerializableException EUserInterrupt = toException UserInterrupt
-fromSerializableException (EExitCode c) = toException c
-fromSerializableException (EOtherException str) = toException (ErrorCall str)
-
--- NB: Replace this with a derived instance once we depend on GHC 8.0
--- as the minimum
-instance Binary ExitCode where
- put ExitSuccess = putWord8 0
- put (ExitFailure ec) = putWord8 1 `mappend` put ec
- get = do
- w <- getWord8
- case w of
- 0 -> pure ExitSuccess
- _ -> ExitFailure <$> get
-
+instance Binary ExitCode
instance Binary SerializableException
data THResult a
diff --git a/libraries/ghci/GHCi/Run.hs b/libraries/ghci/GHCi/Run.hs
index 858b247f65..fefbdc32c1 100644
--- a/libraries/ghci/GHCi/Run.hs
+++ b/libraries/ghci/GHCi/Run.hs
@@ -10,6 +10,7 @@
--
module GHCi.Run
( run, redirectInterrupts
+ , toSerializableException, fromSerializableException
) where
import GHCi.CreateBCO
@@ -35,6 +36,7 @@ import Foreign
import Foreign.C
import GHC.Conc.Sync
import GHC.IO hiding ( bracket )
+import System.Exit
import System.Mem.Weak ( deRefWeak )
import Unsafe.Coerce
@@ -221,6 +223,17 @@ tryEval io = do
Left ex -> return (EvalException (toSerializableException ex))
Right a -> return (EvalSuccess a)
+toSerializableException :: SomeException -> SerializableException
+toSerializableException ex
+ | Just UserInterrupt <- fromException ex = EUserInterrupt
+ | Just (ec::ExitCode) <- fromException ex = (EExitCode ec)
+ | otherwise = EOtherException (show (ex :: SomeException))
+
+fromSerializableException :: SerializableException -> SomeException
+fromSerializableException EUserInterrupt = toException UserInterrupt
+fromSerializableException (EExitCode c) = toException c
+fromSerializableException (EOtherException str) = toException (ErrorCall str)
+
-- This function sets up the interpreter for catching breakpoints, and
-- resets everything when the computation has stopped running. This
-- is a not-very-good way to ensure that only the interactive
diff --git a/libraries/ghci/ghci.cabal.in b/libraries/ghci/ghci.cabal.in
index 87b2c4e2fd..9b622e1107 100644
--- a/libraries/ghci/ghci.cabal.in
+++ b/libraries/ghci/ghci.cabal.in
@@ -17,11 +17,6 @@ cabal-version: >=1.10
build-type: Simple
extra-source-files: changelog.md
-Flag ghci
- Description: Build GHCi support.
- Default: False
- Manual: True
-
source-repository head
type: git
location: http://git.haskell.org/ghc.git
@@ -46,28 +41,24 @@ library
TupleSections
UnboxedTuples
- if flag(ghci)
- CPP-Options: -DGHCI
- exposed-modules:
- GHCi.Run
- GHCi.CreateBCO
- GHCi.ObjLink
- GHCi.Signals
- GHCi.TH
-
exposed-modules:
GHCi.BreakArray
GHCi.Message
GHCi.ResolvedBCO
GHCi.RemoteTypes
+ GHCi.ObjLink
+ GHCi.CreateBCO
GHCi.FFI
GHCi.InfoTable
+ GHCi.Run
+ GHCi.Signals
+ GHCi.TH
GHCi.TH.Binary
SizedSeq
Build-Depends:
array == 0.5.*,
- base >= 4.8 && < 4.11,
+ base == 4.10.*,
binary == 0.8.*,
bytestring == 0.10.*,
containers == 0.5.*,