ghc-heap-9.10.1: GHC/Exts/Stack.hs
{-# LANGUAGE CPP #-}
#if MIN_TOOL_VERSION_ghc(9,9,0)
{-# LANGUAGE RecordWildCards #-}
module GHC.Exts.Stack
( -- * Stack inspection
decodeStack,
stackFrameSize,
)
where
import GHC.Exts.Heap.Closures
import GHC.Exts.Stack.Constants
import GHC.Exts.Stack.Decode
import Prelude
-- | Get the size of the `StackFrame` in words.
--
-- Includes header and payload. Does not follow pointers.
stackFrameSize :: StackFrame -> Int
stackFrameSize (UpdateFrame {}) = sizeStgUpdateFrame
stackFrameSize (CatchFrame {}) = sizeStgCatchFrame
stackFrameSize (CatchStmFrame {}) = sizeStgCatchSTMFrame
stackFrameSize (CatchRetryFrame {}) = sizeStgCatchRetryFrame
stackFrameSize (AtomicallyFrame {}) = sizeStgAtomicallyFrame
stackFrameSize (RetSmall {..}) = sizeStgClosure + length stack_payload
stackFrameSize (RetBig {..}) = sizeStgClosure + length stack_payload
stackFrameSize (RetFun {..}) = sizeStgRetFunFrame + length retFunPayload
-- The one additional word is a pointer to the StgBCO in the closure's payload
stackFrameSize (RetBCO {..}) = sizeStgClosure + 1 + length bcoArgs
-- The one additional word is a pointer to the next stack chunk
stackFrameSize (UnderflowFrame {}) = sizeStgClosure + 1
stackFrameSize _ = error "Unexpected stack frame type"
#else
module GHC.Exts.Stack where
#endif