Safe Haskell | None |
---|---|
Language | GHC2021 |
Interacting with the iserv interpreter, whether it is running on an external process or in the current process.
Synopsis
- module GHC.Runtime.Interpreter.Types
- evalStmt :: Interp -> EvalOpts -> EvalExpr ForeignHValue -> IO (EvalStatus_ [ForeignHValue] [HValueRef])
- data EvalStatus_ a b
- type EvalStatus a = EvalStatus_ a a
- data EvalResult a
- data EvalExpr a
- resumeStmt :: Interp -> EvalOpts -> ForeignRef (ResumeContext [HValueRef]) -> IO (EvalStatus_ [ForeignHValue] [HValueRef])
- abandonStmt :: Interp -> ForeignRef (ResumeContext [HValueRef]) -> IO ()
- evalIO :: Interp -> ForeignHValue -> IO ()
- evalString :: Interp -> ForeignHValue -> IO String
- evalStringToIOString :: Interp -> ForeignHValue -> String -> IO String
- mallocData :: Interp -> ByteString -> IO (RemotePtr ())
- createBCOs :: Interp -> [ResolvedBCO] -> IO [HValueRef]
- addSptEntry :: Interp -> Fingerprint -> ForeignHValue -> IO ()
- mkCostCentres :: Interp -> String -> [(String, String)] -> IO [RemotePtr CostCentre]
- costCentreStackInfo :: Interp -> RemotePtr CostCentreStack -> IO [String]
- newBreakArray :: Interp -> Int -> IO (ForeignRef BreakArray)
- newModuleName :: Interp -> ModuleName -> IO (RemotePtr ModuleName)
- storeBreakpoint :: Interp -> ForeignRef BreakArray -> Int -> Int -> IO ()
- breakpointStatus :: Interp -> ForeignRef BreakArray -> Int -> IO Bool
- getBreakpointVar :: Interp -> ForeignHValue -> Int -> IO (Maybe ForeignHValue)
- getClosure :: Interp -> ForeignHValue -> IO (GenClosure ForeignHValue)
- getModBreaks :: HomeModInfo -> ModBreaks
- seqHValue :: Interp -> UnitEnv -> ForeignHValue -> IO (EvalResult ())
- evalBreakpointToId :: HomePackageTable -> EvalBreakpoint -> InternalBreakpointId
- interpreterDynamic :: Interp -> Bool
- interpreterProfiled :: Interp -> Bool
- initObjLinker :: Interp -> IO ()
- lookupSymbol :: Interp -> FastString -> IO (Maybe (Ptr ()))
- lookupSymbolInDLL :: Interp -> RemotePtr LoadedDLL -> FastString -> IO (Maybe (Ptr ()))
- lookupClosure :: Interp -> String -> IO (Maybe HValueRef)
- loadDLL :: Interp -> String -> IO (Either String (RemotePtr LoadedDLL))
- loadArchive :: Interp -> String -> IO ()
- loadObj :: Interp -> String -> IO ()
- unloadObj :: Interp -> String -> IO ()
- addLibrarySearchPath :: Interp -> String -> IO (Ptr ())
- removeLibrarySearchPath :: Interp -> Ptr () -> IO Bool
- resolveObjs :: Interp -> IO SuccessFlag
- findSystemLibrary :: Interp -> String -> IO (Maybe String)
- interpCmd :: Binary a => Interp -> Message a -> IO a
- withExtInterp :: ExceptionMonad m => ExtInterp -> (forall d. ExtInterpInstance d -> m a) -> m a
- withExtInterpStatus :: forall {k} m (a :: k). ExtInterp -> (forall d. ExtInterpStatusVar d -> m a) -> m a
- withIServ :: ExceptionMonad m => IServ -> (ExtInterpInstance () -> m a) -> m a
- withJSInterp :: ExceptionMonad m => JSInterp -> (ExtInterpInstance JSInterpExtra -> m a) -> m a
- stopInterp :: Interp -> IO ()
- purgeLookupSymbolCache :: Interp -> IO ()
- freeReallyRemoteRef :: ExtInterpInstance d -> RemoteRef a -> IO ()
- freeHValueRefs :: Interp -> [HValueRef] -> IO ()
- mkFinalizedHValue :: Interp -> RemoteRef a -> IO (ForeignRef a)
- wormhole :: Interp -> ForeignRef a -> IO a
- wormholeRef :: Interp -> RemoteRef a -> IO a
- fromEvalResult :: EvalResult a -> IO a
- data Message a where
- Shutdown :: Message ()
- RtsRevertCAFs :: Message ()
- InitLinker :: Message ()
- LookupSymbol :: String -> Message (Maybe (RemotePtr ()))
- LookupSymbolInDLL :: RemotePtr LoadedDLL -> String -> Message (Maybe (RemotePtr ()))
- LookupClosure :: String -> Message (Maybe HValueRef)
- LoadDLL :: String -> Message (Either String (RemotePtr LoadedDLL))
- LoadArchive :: String -> Message ()
- LoadObj :: String -> Message ()
- UnloadObj :: String -> Message ()
- AddLibrarySearchPath :: String -> Message (RemotePtr ())
- RemoveLibrarySearchPath :: RemotePtr () -> Message Bool
- ResolveObjs :: Message Bool
- FindSystemLibrary :: String -> Message (Maybe String)
- CreateBCOs :: [ResolvedBCO] -> Message [HValueRef]
- FreeHValueRefs :: [HValueRef] -> Message ()
- AddSptEntry :: Fingerprint -> HValueRef -> Message ()
- MallocData :: ByteString -> Message (RemotePtr ())
- MallocStrings :: [ByteString] -> Message [RemotePtr ()]
- PrepFFI :: [FFIType] -> FFIType -> Message (RemotePtr C_ffi_cif)
- FreeFFI :: RemotePtr C_ffi_cif -> Message ()
- MkConInfoTable :: Bool -> Int -> Int -> Int -> Int -> ByteString -> Message (RemotePtr StgInfoTable)
- EvalStmt :: EvalOpts -> EvalExpr HValueRef -> Message (EvalStatus_ [HValueRef] [HValueRef])
- ResumeStmt :: EvalOpts -> RemoteRef (ResumeContext [HValueRef]) -> Message (EvalStatus_ [HValueRef] [HValueRef])
- AbandonStmt :: RemoteRef (ResumeContext [HValueRef]) -> Message ()
- EvalString :: HValueRef -> Message (EvalResult String)
- EvalStringToString :: HValueRef -> String -> Message (EvalResult String)
- EvalIO :: HValueRef -> Message (EvalResult ())
- MkCostCentres :: String -> [(String, String)] -> Message [RemotePtr CostCentre]
- CostCentreStackInfo :: RemotePtr CostCentreStack -> Message [String]
- NewBreakArray :: Int -> Message (RemoteRef BreakArray)
- SetupBreakpoint :: RemoteRef BreakArray -> Int -> Int -> Message ()
- BreakpointStatus :: RemoteRef BreakArray -> Int -> Message Bool
- GetBreakpointVar :: HValueRef -> Int -> Message (Maybe HValueRef)
- StartTH :: Message (RemoteRef (IORef QState))
- RunTH :: RemoteRef (IORef QState) -> HValueRef -> THResultType -> Maybe Loc -> Message (QResult ByteString)
- RunModFinalizers :: RemoteRef (IORef QState) -> [RemoteRef (Q ())] -> Message (QResult ())
- GetClosure :: HValueRef -> Message (GenClosure HValueRef)
- Seq :: HValueRef -> Message (EvalStatus_ () ())
- ResumeSeq :: RemoteRef (ResumeContext ()) -> Message (EvalStatus_ () ())
- NewBreakModule :: String -> Message (RemotePtr BreakModule)
- module GHC.Runtime.Interpreter.Process
Documentation
High-level interface to the interpreter
evalStmt :: Interp -> EvalOpts -> EvalExpr ForeignHValue -> IO (EvalStatus_ [ForeignHValue] [HValueRef]) Source #
Execute an action of type IO [a]
, returning ForeignHValue
s for
each of the results.
data EvalStatus_ a b Source #
EvalComplete Word64 (EvalResult a) | |
EvalBreak HValueRef (Maybe EvalBreakpoint) (RemoteRef (ResumeContext b)) (RemotePtr CostCentreStack) |
Instances
type EvalStatus a = EvalStatus_ a a Source #
data EvalResult a Source #
Instances
Binary a => Binary (EvalResult a) Source # | |||||
Defined in GHCi.Message put :: EvalResult a -> Put Source # get :: Get (EvalResult a) Source # putList :: [EvalResult a] -> Put Source # | |||||
Generic (EvalResult a) Source # | |||||
Defined in GHCi.Message
from :: EvalResult a -> Rep (EvalResult a) x # to :: Rep (EvalResult a) x -> EvalResult a # | |||||
Show a => Show (EvalResult a) Source # | |||||
Defined in GHCi.Message showsPrec :: Int -> EvalResult a -> ShowS # show :: EvalResult a -> String # showList :: [EvalResult a] -> ShowS # | |||||
type Rep (EvalResult a) Source # | |||||
Defined in GHCi.Message type Rep (EvalResult a) = D1 ('MetaData "EvalResult" "GHCi.Message" "ghci-9.13-inplace" 'False) (C1 ('MetaCons "EvalException" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 SerializableException)) :+: C1 ('MetaCons "EvalSuccess" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a))) |
We can pass simple expressions to EvalStmt, consisting of values and application. This allows us to wrap the statement to be executed in another function, which is used by GHCi to implement :set args and :set prog. It might be worthwhile to extend this little language in the future.
Instances
Binary a => Binary (EvalExpr a) Source # | |||||
Generic (EvalExpr a) Source # | |||||
Defined in GHCi.Message
| |||||
Show a => Show (EvalExpr a) Source # | |||||
type Rep (EvalExpr a) Source # | |||||
Defined in GHCi.Message type Rep (EvalExpr a) = D1 ('MetaData "EvalExpr" "GHCi.Message" "ghci-9.13-inplace" 'False) (C1 ('MetaCons "EvalThis" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a)) :+: C1 ('MetaCons "EvalApp" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (EvalExpr a)) :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (EvalExpr a)))) |
resumeStmt :: Interp -> EvalOpts -> ForeignRef (ResumeContext [HValueRef]) -> IO (EvalStatus_ [ForeignHValue] [HValueRef]) Source #
abandonStmt :: Interp -> ForeignRef (ResumeContext [HValueRef]) -> IO () Source #
evalString :: Interp -> ForeignHValue -> IO String Source #
Execute an action of type IO String
evalStringToIOString :: Interp -> ForeignHValue -> String -> IO String Source #
Execute an action of type String -> IO String
mallocData :: Interp -> ByteString -> IO (RemotePtr ()) Source #
Allocate and store the given bytes in memory, returning a pointer to the memory in the remote process.
createBCOs :: Interp -> [ResolvedBCO] -> IO [HValueRef] Source #
Create a set of BCOs that may be mutually recursive.
addSptEntry :: Interp -> Fingerprint -> ForeignHValue -> IO () Source #
mkCostCentres :: Interp -> String -> [(String, String)] -> IO [RemotePtr CostCentre] Source #
costCentreStackInfo :: Interp -> RemotePtr CostCentreStack -> IO [String] Source #
newBreakArray :: Interp -> Int -> IO (ForeignRef BreakArray) Source #
newModuleName :: Interp -> ModuleName -> IO (RemotePtr ModuleName) Source #
storeBreakpoint :: Interp -> ForeignRef BreakArray -> Int -> Int -> IO () Source #
breakpointStatus :: Interp -> ForeignRef BreakArray -> Int -> IO Bool Source #
getBreakpointVar :: Interp -> ForeignHValue -> Int -> IO (Maybe ForeignHValue) Source #
getClosure :: Interp -> ForeignHValue -> IO (GenClosure ForeignHValue) Source #
getModBreaks :: HomeModInfo -> ModBreaks Source #
seqHValue :: Interp -> UnitEnv -> ForeignHValue -> IO (EvalResult ()) Source #
Send a Seq message to the iserv process to force a value #2950
interpreterDynamic :: Interp -> Bool Source #
Interpreter uses Dynamic way
interpreterProfiled :: Interp -> Bool Source #
Interpreter uses Profiling way
The object-code linker
initObjLinker :: Interp -> IO () Source #
lookupSymbol :: Interp -> FastString -> IO (Maybe (Ptr ())) Source #
lookupSymbolInDLL :: Interp -> RemotePtr LoadedDLL -> FastString -> IO (Maybe (Ptr ())) Source #
loadDLL :: Interp -> String -> IO (Either String (RemotePtr LoadedDLL)) Source #
loadDLL loads a dynamic library using the OS's native linker (i.e. dlopen() on Unix, LoadLibrary() on Windows). It takes either an absolute pathname to the file, or a relative filename (e.g. "libfoo.so" or "foo.dll"). In the latter case, loadDLL searches the standard locations for the appropriate library.
resolveObjs :: Interp -> IO SuccessFlag Source #
interpCmd :: Binary a => Interp -> Message a -> IO a Source #
Run a command in the interpreter's context. With
-fexternal-interpreter
, the command is serialized and sent to an
external iserv process, and the response is deserialized (hence the
Binary
constraint). With -fno-external-interpreter
we execute
the command directly here.
withExtInterp :: ExceptionMonad m => ExtInterp -> (forall d. ExtInterpInstance d -> m a) -> m a Source #
withExtInterpStatus :: forall {k} m (a :: k). ExtInterp -> (forall d. ExtInterpStatusVar d -> m a) -> m a Source #
withIServ :: ExceptionMonad m => IServ -> (ExtInterpInstance () -> m a) -> m a Source #
Grab a lock on the IServ
and do something with it.
Overloaded because this is used from TcM as well as IO.
withJSInterp :: ExceptionMonad m => JSInterp -> (ExtInterpInstance JSInterpExtra -> m a) -> m a Source #
Spawn JS interpreter if it isn't already running and execute the given action
Update the interpreter state.
stopInterp :: Interp -> IO () Source #
Stop the interpreter
purgeLookupSymbolCache :: Interp -> IO () Source #
freeReallyRemoteRef :: ExtInterpInstance d -> RemoteRef a -> IO () Source #
mkFinalizedHValue :: Interp -> RemoteRef a -> IO (ForeignRef a) Source #
Creates a ForeignRef
that will automatically release the
RemoteRef
when it is no longer referenced.
wormhole :: Interp -> ForeignRef a -> IO a Source #
Convert a ForeignRef
to the value it references directly. This
only works when the interpreter is running in the same process as
the compiler, so it fails when -fexternal-interpreter
is on.
wormholeRef :: Interp -> RemoteRef a -> IO a Source #
Convert an RemoteRef
to the value it references directly. This
only works when the interpreter is running in the same process as
the compiler, so it fails when -fexternal-interpreter
is on.
fromEvalResult :: EvalResult a -> IO a Source #
Reexport for convenience
A Message a
is a message that returns a value of type a
.
These are requests sent from GHC to the server.
Shutdown :: Message () | Exit the iserv process |
RtsRevertCAFs :: Message () | |
InitLinker :: Message () | |
LookupSymbol :: String -> Message (Maybe (RemotePtr ())) | |
LookupSymbolInDLL :: RemotePtr LoadedDLL -> String -> Message (Maybe (RemotePtr ())) | |
LookupClosure :: String -> Message (Maybe HValueRef) | |
LoadDLL :: String -> Message (Either String (RemotePtr LoadedDLL)) | |
LoadArchive :: String -> Message () | |
LoadObj :: String -> Message () | |
UnloadObj :: String -> Message () | |
AddLibrarySearchPath :: String -> Message (RemotePtr ()) | |
RemoveLibrarySearchPath :: RemotePtr () -> Message Bool | |
ResolveObjs :: Message Bool | |
FindSystemLibrary :: String -> Message (Maybe String) | |
CreateBCOs :: [ResolvedBCO] -> Message [HValueRef] | Create a set of BCO objects, and return HValueRefs to them
See |
FreeHValueRefs :: [HValueRef] -> Message () | Release |
AddSptEntry :: Fingerprint -> HValueRef -> Message () | Add entries to the Static Pointer Table |
MallocData :: ByteString -> Message (RemotePtr ()) | Malloc some data and return a |
MallocStrings :: [ByteString] -> Message [RemotePtr ()] | |
PrepFFI :: [FFIType] -> FFIType -> Message (RemotePtr C_ffi_cif) | Calls |
FreeFFI :: RemotePtr C_ffi_cif -> Message () | Free data previously created by |
MkConInfoTable :: Bool -> Int -> Int -> Int -> Int -> ByteString -> Message (RemotePtr StgInfoTable) | Create an info table for a constructor |
EvalStmt :: EvalOpts -> EvalExpr HValueRef -> Message (EvalStatus_ [HValueRef] [HValueRef]) | Evaluate a statement |
ResumeStmt :: EvalOpts -> RemoteRef (ResumeContext [HValueRef]) -> Message (EvalStatus_ [HValueRef] [HValueRef]) | Resume evaluation of a statement after a breakpoint |
AbandonStmt :: RemoteRef (ResumeContext [HValueRef]) -> Message () | Abandon evaluation of a statement after a breakpoint |
EvalString :: HValueRef -> Message (EvalResult String) | Evaluate something of type |
EvalStringToString :: HValueRef -> String -> Message (EvalResult String) | Evaluate something of type |
EvalIO :: HValueRef -> Message (EvalResult ()) | Evaluate something of type |
MkCostCentres :: String -> [(String, String)] -> Message [RemotePtr CostCentre] | Create a set of CostCentres with the same module name |
CostCentreStackInfo :: RemotePtr CostCentreStack -> Message [String] | Show a |
NewBreakArray :: Int -> Message (RemoteRef BreakArray) | Create a new array of breakpoint flags |
SetupBreakpoint :: RemoteRef BreakArray -> Int -> Int -> Message () | Set how many times a breakpoint should be ignored also used for enable/disable |
BreakpointStatus :: RemoteRef BreakArray -> Int -> Message Bool | Query the status of a breakpoint (True = enabled) |
GetBreakpointVar :: HValueRef -> Int -> Message (Maybe HValueRef) | Get a reference to a free variable at a breakpoint |
StartTH :: Message (RemoteRef (IORef QState)) | Start a new TH module, return a state token that should be |
RunTH :: RemoteRef (IORef QState) -> HValueRef -> THResultType -> Maybe Loc -> Message (QResult ByteString) | Evaluate a TH computation. Returns a ByteString, because we have to force the result before returning it to ensure there are no errors lurking in it. The TH types don't have NFData instances, and even if they did, we have to serialize the value anyway, so we might as well serialize it to force it. |
RunModFinalizers :: RemoteRef (IORef QState) -> [RemoteRef (Q ())] -> Message (QResult ()) | Run the given mod finalizers. |
GetClosure :: HValueRef -> Message (GenClosure HValueRef) | Remote interface to GHC.Exts.Heap.getClosureData. This is used by the GHCi debugger to inspect values in the heap for :print and type reconstruction. |
Seq :: HValueRef -> Message (EvalStatus_ () ()) | Evaluate something. This is used to support :force in GHCi. |
ResumeSeq :: RemoteRef (ResumeContext ()) -> Message (EvalStatus_ () ()) | Resume forcing a free variable in a breakpoint (#2950) |
NewBreakModule :: String -> Message (RemotePtr BreakModule) | Allocate a string for a breakpoint module name.
This uses an empty dummy type because |