[project @ 2000-04-13 11:56:35 by simonpj]
[ghc-hetmet.git] / ghc / lib / std / PrelWeak.lhs
index 901a385..9548a19 100644 (file)
@@ -5,40 +5,46 @@
 \section[PrelWeak]{Module @PrelWeak@}
 
 \begin{code}
-{-# OPTIONS -fno-implicit-prelude #-}
+{-# OPTIONS -fcompiling-prelude -fno-implicit-prelude #-}
 
 module PrelWeak where
 
 import PrelGHC
 import PrelBase
-import PrelIOBase
-import PrelForeign
+import PrelMaybe
+-- NOTE: To break a cycle, ForeignObj is not in PrelForeign, but PrelIOBase!
+import PrelIOBase      ( IO(..), ForeignObj(..) )
+
+#ifndef __PARALLEL_HASKELL__
 
 data Weak v = Weak (Weak# v)
 
 mkWeak  :: k                           -- key
        -> v                            -- value
-       -> IO ()                        -- finaliser
+       -> Maybe (IO ())                -- finalizer
        -> IO (Weak v)                  -- weak pointer
 
-mkWeak key val finaliser = IO $ \s ->
-   case mkWeak# key val finaliser s of { (# s1, w #) ->
-   (# s1, Weak w #) }
+mkWeak key val (Just finalizer) = IO $ \s ->
+   case mkWeak# key val finalizer s of { (# s1, w #) -> (# s1, Weak w #) }
+mkWeak key val Nothing = IO $ \s ->
+   case mkWeak# key val (unsafeCoerce# 0#) s of { (# s1, w #) -> (# s1, Weak w #) }
 
-mkWeakPtr :: k -> IO () -> IO (Weak k)
-mkWeakPtr key finaliser = mkWeak key key finaliser
+mkWeakPtr :: k -> Maybe (IO ()) -> IO (Weak k)
+mkWeakPtr key finalizer = mkWeak key key finalizer
 
-addFinaliser :: key -> IO () -> IO ()
-addFinaliser key finaliser = do
-   mkWeakPtr key finaliser             -- throw it away
+addFinalizer :: key -> IO () -> IO ()
+addFinalizer key finalizer = do
+   mkWeakPtr key (Just finalizer)      -- throw it away
    return ()
 
-addForeignFinaliser :: ForeignObj -> IO () -> IO ()
-addForeignFinaliser (ForeignObj fo) finaliser = addFinaliser fo finaliser
+addForeignFinalizer :: ForeignObj -> IO () -> IO ()
+addForeignFinalizer (ForeignObj fo) finalizer = addFinalizer fo finalizer
 
 {-
 instance Eq (Weak v) where
   (Weak w1) == (Weak w2) = w1 `sameWeak#` w2
 -}
 
+#endif
+
 \end{code}