diff options
author | Ben Gamari <ben@smart-cactus.org> | 2015-09-18 17:54:22 +0200 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2015-09-23 11:56:17 +0200 |
commit | c6bdf4fb0b06ac55a7bb200f0ef31ea9a7a830ec (patch) | |
tree | 7077de0aa1bf4769d878c9fc26331a59b62cd706 /libraries/base/GHC/ForeignPtr.hs | |
parent | 79f57325dca4d1ce4601d01c4fab50f7bcfc9b9b (diff) | |
download | haskell-c6bdf4fb0b06ac55a7bb200f0ef31ea9a7a830ec.tar.gz |
Remove references to () from types of mkWeak# and friends
Previously the types needlessly used (), which is defined ghc-prim,
leading to unfortunate import cycles. See #10867 for details.
Updates stm submodule.
Diffstat (limited to 'libraries/base/GHC/ForeignPtr.hs')
-rw-r--r-- | libraries/base/GHC/ForeignPtr.hs | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/libraries/base/GHC/ForeignPtr.hs b/libraries/base/GHC/ForeignPtr.hs index 6e288483ea..0b9118ea07 100644 --- a/libraries/base/GHC/ForeignPtr.hs +++ b/libraries/base/GHC/ForeignPtr.hs @@ -291,16 +291,26 @@ addForeignPtrConcFinalizer_ (PlainForeignPtr r) finalizer = do if noFinalizers then IO $ \s -> case r of { IORef (STRef r#) -> - case mkWeak# r# () (foreignPtrFinalizer r) s of { (# s1, _ #) -> + case mkWeak# r# () finalizer' s of { (# s1, _ #) -> (# s1, () #) }} else return () + where + finalizer' :: State# RealWorld -> State# RealWorld + finalizer' s = + case unIO (foreignPtrFinalizer r) s of + (# s', () #) -> s' addForeignPtrConcFinalizer_ f@(MallocPtr fo r) finalizer = do noFinalizers <- insertHaskellFinalizer r finalizer if noFinalizers then IO $ \s -> - case mkWeak# fo () (do foreignPtrFinalizer r; touch f) s of + case mkWeak# fo () finalizer' s of (# s1, _ #) -> (# s1, () #) else return () + where + finalizer' :: State# RealWorld -> State# RealWorld + finalizer' s = + case unIO (foreignPtrFinalizer r >> touch f) s of + (# s', () #) -> s' addForeignPtrConcFinalizer_ _ _ = error "GHC.ForeignPtr: attempt to add a finalizer to plain pointer" @@ -359,7 +369,7 @@ foreignPtrFinalizer r = do case fs of NoFinalizers -> return () CFinalizers w -> IO $ \s -> case finalizeWeak# w s of - (# s1, 1#, f #) -> f s1 + (# s1, 1#, f #) -> case f s1 of s2 -> (# s2, () #) (# s1, _, _ #) -> (# s1, () #) HaskellFinalizers actions -> sequence_ actions |