ghc-heap-8.10.7: Functions for walking GHC's heap
Safe Haskell None
Language Haskell2010

GHC.Exts.Heap.Closures

Synopsis

Closures

data GenClosure b Source #

This is the representation of a Haskell value on the heap. It reflects https://gitlab.haskell.org/ghc/ghc/blob/master/includes/rts/storage/Closures.h

The data type is parametrized by the type to store references in. Usually this is a Box with the type synonym Closure .

All Heap objects have the same basic layout. A header containing a pointer to the info table and a payload with various fields. The info field below always refers to the info table pointed to by the header. The remaining fields are the payload.

See https://gitlab.haskell.org/ghc/ghc/wikis/commentary/rts/storage/heap-objects for more information.

Constructors

ConstrClosure

A data constructor

Fields

FunClosure

A function

Fields

ThunkClosure

A thunk, an expression not obviously in head normal form

Fields

SelectorClosure

A thunk which performs a simple selection operation

Fields

PAPClosure

An unsaturated function application

Fields

APClosure

A function application

Fields

APStackClosure

A suspended thunk evaluation

Fields

IndClosure

A pointer to another closure, introduced when a thunk is updated to point at its value

Fields

BCOClosure

A byte-code object (BCO) which can be interpreted by GHC's byte-code interpreter (e.g. as used by GHCi)

Fields

BlackholeClosure

A thunk under evaluation by another thread

Fields

ArrWordsClosure

A ByteArray#

Fields

MutArrClosure

A MutableByteArray#

Fields

SmallMutArrClosure

A SmallMutableArray#

Since: 8.10.1

Fields

MVarClosure

An MVar# , with a queue of thread state objects blocking on them

Fields

MutVarClosure

A MutVar#

Fields

BlockingQueueClosure

An STM blocking queue.

Fields

WeakClosure

Fields

IntClosure

Primitive Int

WordClosure

Primitive Word

Int64Closure

Primitive Int64

Word64Closure

Primitive Word64

AddrClosure

Primitive Addr

FloatClosure

Primitive Float

DoubleClosure

Primitive Double

OtherClosure

Another kind of closure

UnsupportedClosure

Instances

Instances details
Functor GenClosure Source #
Instance details

Defined in GHC.Exts.Heap.Closures

Foldable GenClosure Source #
Instance details

Defined in GHC.Exts.Heap.Closures

Traversable GenClosure Source #
Instance details

Defined in GHC.Exts.Heap.Closures

Show b => Show ( GenClosure b) Source #
Instance details

Defined in GHC.Exts.Heap.Closures

Generic ( GenClosure b) Source #
Instance details

Defined in GHC.Exts.Heap.Closures

Associated Types

type Rep ( GenClosure b) :: Type -> Type Source #

type Rep ( GenClosure b) Source #
Instance details

Defined in GHC.Exts.Heap.Closures

type Rep ( GenClosure b) = D1 (' MetaData "GenClosure" "GHC.Exts.Heap.Closures" "ghc-heap-8.10.7-IUP7BK823zx9GcxXynNXv1" ' False ) (((( C1 (' MetaCons "ConstrClosure" ' PrefixI ' True ) (( S1 (' MetaSel (' Just "info") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 StgInfoTable ) :*: ( S1 (' MetaSel (' Just "ptrArgs") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 [b]) :*: S1 (' MetaSel (' Just "dataArgs") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 [ Word ]))) :*: ( S1 (' MetaSel (' Just "pkg") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 String ) :*: ( S1 (' MetaSel (' Just "modl") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 String ) :*: S1 (' MetaSel (' Just "name") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 String )))) :+: ( C1 (' MetaCons "FunClosure" ' PrefixI ' True ) ( S1 (' MetaSel (' Just "info") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 StgInfoTable ) :*: ( S1 (' MetaSel (' Just "ptrArgs") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 [b]) :*: S1 (' MetaSel (' Just "dataArgs") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 [ Word ]))) :+: C1 (' MetaCons "ThunkClosure" ' PrefixI ' True ) ( S1 (' MetaSel (' Just "info") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 StgInfoTable ) :*: ( S1 (' MetaSel (' Just "ptrArgs") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 [b]) :*: S1 (' MetaSel (' Just "dataArgs") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 [ Word ]))))) :+: ( C1 (' MetaCons "SelectorClosure" ' PrefixI ' True ) ( S1 (' MetaSel (' Just "info") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 StgInfoTable ) :*: S1 (' MetaSel (' Just "selectee") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 b)) :+: ( C1 (' MetaCons "PAPClosure" ' PrefixI ' True ) (( S1 (' MetaSel (' Just "info") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 StgInfoTable ) :*: S1 (' MetaSel (' Just "arity") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 HalfWord )) :*: ( S1 (' MetaSel (' Just "n_args") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 HalfWord ) :*: ( S1 (' MetaSel (' Just "fun") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 b) :*: S1 (' MetaSel (' Just "payload") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 [b])))) :+: C1 (' MetaCons "APClosure" ' PrefixI ' True ) (( S1 (' MetaSel (' Just "info") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 StgInfoTable ) :*: S1 (' MetaSel (' Just "arity") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 HalfWord )) :*: ( S1 (' MetaSel (' Just "n_args") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 HalfWord ) :*: ( S1 (' MetaSel (' Just "fun") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 b) :*: S1 (' MetaSel (' Just "payload") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 [b]))))))) :+: (( C1 (' MetaCons "APStackClosure" ' PrefixI ' True ) ( S1 (' MetaSel (' Just "info") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 StgInfoTable ) :*: ( S1 (' MetaSel (' Just "fun") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 b) :*: S1 (' MetaSel (' Just "payload") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 [b]))) :+: ( C1 (' MetaCons "IndClosure" ' PrefixI ' True ) ( S1 (' MetaSel (' Just "info") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 StgInfoTable ) :*: S1 (' MetaSel (' Just "indirectee") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 b)) :+: C1 (' MetaCons "BCOClosure" ' PrefixI ' True ) (( S1 (' MetaSel (' Just "info") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 StgInfoTable ) :*: ( S1 (' MetaSel (' Just "instrs") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 b) :*: S1 (' MetaSel (' Just "literals") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 b))) :*: (( S1 (' MetaSel (' Just "bcoptrs") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 b) :*: S1 (' MetaSel (' Just "arity") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 HalfWord )) :*: ( S1 (' MetaSel (' Just "size") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 HalfWord ) :*: S1 (' MetaSel (' Just "bitmap") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 [ Word ])))))) :+: (( C1 (' MetaCons "BlackholeClosure" ' PrefixI ' True ) ( S1 (' MetaSel (' Just "info") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 StgInfoTable ) :*: S1 (' MetaSel (' Just "indirectee") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 b)) :+: C1 (' MetaCons "ArrWordsClosure" ' PrefixI ' True ) ( S1 (' MetaSel (' Just "info") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 StgInfoTable ) :*: ( S1 (' MetaSel (' Just "bytes") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 Word ) :*: S1 (' MetaSel (' Just "arrWords") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 [ Word ])))) :+: ( C1 (' MetaCons "MutArrClosure" ' PrefixI ' True ) (( S1 (' MetaSel (' Just "info") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 StgInfoTable ) :*: S1 (' MetaSel (' Just "mccPtrs") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 Word )) :*: ( S1 (' MetaSel (' Just "mccSize") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 Word ) :*: S1 (' MetaSel (' Just "mccPayload") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 [b]))) :+: C1 (' MetaCons "SmallMutArrClosure" ' PrefixI ' True ) ( S1 (' MetaSel (' Just "info") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 StgInfoTable ) :*: ( S1 (' MetaSel (' Just "mccPtrs") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 Word ) :*: S1 (' MetaSel (' Just "mccPayload") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 [b]))))))) :+: ((( C1 (' MetaCons "MVarClosure" ' PrefixI ' True ) (( S1 (' MetaSel (' Just "info") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 StgInfoTable ) :*: S1 (' MetaSel (' Just "queueHead") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 b)) :*: ( S1 (' MetaSel (' Just "queueTail") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 b) :*: S1 (' MetaSel (' Just "value") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 b))) :+: ( C1 (' MetaCons "MutVarClosure" ' PrefixI ' True ) ( S1 (' MetaSel (' Just "info") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 StgInfoTable ) :*: S1 (' MetaSel (' Just "var") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 b)) :+: C1 (' MetaCons "BlockingQueueClosure" ' PrefixI ' True ) (( S1 (' MetaSel (' Just "info") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 StgInfoTable ) :*: S1 (' MetaSel (' Just "link") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 b)) :*: ( S1 (' MetaSel (' Just "blackHole") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 b) :*: ( S1 (' MetaSel (' Just "owner") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 b) :*: S1 (' MetaSel (' Just "queue") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 b)))))) :+: ( C1 (' MetaCons "WeakClosure" ' PrefixI ' True ) (( S1 (' MetaSel (' Just "info") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 StgInfoTable ) :*: ( S1 (' MetaSel (' Just "cfinalizers") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 b) :*: S1 (' MetaSel (' Just "key") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 b))) :*: ( S1 (' MetaSel (' Just "value") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 b) :*: ( S1 (' MetaSel (' Just "finalizer") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 b) :*: S1 (' MetaSel (' Just "link") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 b)))) :+: ( C1 (' MetaCons "IntClosure" ' PrefixI ' True ) ( S1 (' MetaSel (' Just "ptipe") ' NoSourceUnpackedness ' NoSourceStrictness ' DecidedLazy ) ( Rec0 PrimType ) :*: S1 (' MetaSel (' Just "intVal") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 Int )) :+: C1 (' MetaCons "WordClosure" ' PrefixI ' True ) ( S1 (' MetaSel (' Just "ptipe") ' NoSourceUnpackedness ' NoSourceStrictness ' DecidedLazy ) ( Rec0 PrimType ) :*: S1 (' MetaSel (' Just "wordVal") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 Word ))))) :+: (( C1 (' MetaCons "Int64Closure" ' PrefixI ' True ) ( S1 (' MetaSel (' Just "ptipe") ' NoSourceUnpackedness ' NoSourceStrictness ' DecidedLazy ) ( Rec0 PrimType ) :*: S1 (' MetaSel (' Just "int64Val") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 Int64 )) :+: ( C1 (' MetaCons "Word64Closure" ' PrefixI ' True ) ( S1 (' MetaSel (' Just "ptipe") ' NoSourceUnpackedness ' NoSourceStrictness ' DecidedLazy ) ( Rec0 PrimType ) :*: S1 (' MetaSel (' Just "word64Val") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 Word64 )) :+: C1 (' MetaCons "AddrClosure" ' PrefixI ' True ) ( S1 (' MetaSel (' Just "ptipe") ' NoSourceUnpackedness ' NoSourceStrictness ' DecidedLazy ) ( Rec0 PrimType ) :*: S1 (' MetaSel (' Just "addrVal") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 Int )))) :+: (( C1 (' MetaCons "FloatClosure" ' PrefixI ' True ) ( S1 (' MetaSel (' Just "ptipe") ' NoSourceUnpackedness ' NoSourceStrictness ' DecidedLazy ) ( Rec0 PrimType ) :*: S1 (' MetaSel (' Just "floatVal") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 Float )) :+: C1 (' MetaCons "DoubleClosure" ' PrefixI ' True ) ( S1 (' MetaSel (' Just "ptipe") ' NoSourceUnpackedness ' NoSourceStrictness ' DecidedLazy ) ( Rec0 PrimType ) :*: S1 (' MetaSel (' Just "doubleVal") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 Double ))) :+: ( C1 (' MetaCons "OtherClosure" ' PrefixI ' True ) ( S1 (' MetaSel (' Just "info") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 StgInfoTable ) :*: ( S1 (' MetaSel (' Just "hvalues") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 [b]) :*: S1 (' MetaSel (' Just "rawWords") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 [ Word ]))) :+: C1 (' MetaCons "UnsupportedClosure" ' PrefixI ' True ) ( S1 (' MetaSel (' Just "info") ' NoSourceUnpackedness ' SourceStrict ' DecidedStrict ) ( Rec0 StgInfoTable )))))))

allClosures :: GenClosure b -> [b] Source #

For generic code, this function returns all referenced closures.

closureSize :: Box -> Int Source #

Get the size of a closure in words.

Since: 8.10.1

Boxes

data Box Source #

An arbitrary Haskell value in a safe Box. The point is that even unevaluated thunks can safely be moved around inside the Box, and when required, e.g. in getBoxedClosureData , the function knows how far it has to evaluate the argument.

Constructors

Box Any

areBoxesEqual :: Box -> Box -> IO Bool Source #

Boxes can be compared, but this is not pure, as different heap objects can, after garbage collection, become the same object.

asBox :: a -> Box Source #

This takes an arbitrary value and puts it into a box. Note that calls like

asBox (head list)

will put the thunk "head list" into the box, not the element at the head of the list. For that, use careful case expressions:

case list of x:_ -> asBox x