X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=GHC%2FST.lhs;h=909a8da338e287ec8219f6e2874457a141f9e066;hb=6ec8b4c5357f7b0eb3ee71e242cef6af903c0250;hp=cdccb18204d1637287b1bfe366d49a1576a40bd4;hpb=d9a0d6f44a930da4ae49678908e37793d693467c;p=ghc-base.git diff --git a/GHC/ST.lhs b/GHC/ST.lhs index cdccb18..909a8da 100644 --- a/GHC/ST.lhs +++ b/GHC/ST.lhs @@ -39,13 +39,18 @@ too many people got bitten by space leaks when it was lazy. -- by @s@, and returns a value of type @a@. -- The @s@ parameter is either -- --- * an unstantiated type variable (inside invocations of 'runST'), or +-- * an uninstantiated type variable (inside invocations of 'runST'), or -- -- * 'RealWorld' (inside invocations of 'Control.Monad.ST.stToIO'). -- -- It serves to keep the internal states of different invocations -- of 'runST' separate from each other and from invocations of -- 'Control.Monad.ST.stToIO'. +-- +-- The '>>=' and '>>' operations are strict in the state (though not in +-- values stored in the state). For example, +-- +-- @'runST' (writeSTRef _|_ v >>= f) = _|_@ newtype ST s a = ST (STRep s a) type STRep s a = State# s -> (# State# s, a #) @@ -145,7 +150,14 @@ runST st = runSTRep (case st of { ST st_rep -> st_rep }) -- I'm only letting runSTRep be inlined right at the end, in particular *after* full laziness -- That's what the "INLINE [0]" says. -- SLPJ Apr 99 -{-# INLINE [0] runSTRep #-} +-- {-# INLINE [0] runSTRep #-} + +-- SDM: further to the above, inline phase 0 is run *before* +-- full-laziness at the moment, which means that the above comment is +-- invalid. Inlining runSTRep doesn't make a huge amount of +-- difference, anyway. Hence: + +{-# NOINLINE runSTRep #-} runSTRep :: (forall s. STRep s a) -> a runSTRep st_rep = case st_rep realWorld# of (# _, r #) -> r