stgi-1.1: src/Stg/Machine/GarbageCollection.hs
{-# LANGUAGE FlexibleInstances #-}
-- | Remove unused heap objects.
module Stg.Machine.GarbageCollection (
garbageCollect,
-- * Algorithms
GarbageCollectionAlgorithm,
triStateTracing,
twoSpaceCopying,
) where
import qualified Data.Set as S
import Stg.Machine.GarbageCollection.Common
import Stg.Machine.GarbageCollection.TriStateTracing
import Stg.Machine.GarbageCollection.TwoSpaceCopying
import Stg.Machine.Types
-- | Apply a garbage collection algorithm to the heap of the current machine
-- state, and return the resulting cleaned state.
garbageCollect :: GarbageCollectionAlgorithm -> StgState -> StgState
garbageCollect algorithm@(GarbageCollectionAlgorithm name _) state
= let (deadAddrs, forwards, state') = splitHeapWith algorithm state
in if S.size deadAddrs > 0
then state' { stgSteps = stgSteps state + 1
, stgInfo = Info GarbageCollection
[Detail_GarbageCollected name deadAddrs forwards] }
else state