X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FbasicTypes%2FUniqSupply.lhs;h=8dcf595da004124b75fbee654b2b0da9c2aede9a;hb=fe3321f99f4d9c9ff40429a7ac290f8ef7ca3297;hp=05b565fe2e423d538fd730241261d35485edcaf2;hpb=0d7c6cea4af4ac1137f40b8e35348744e80a23b9;p=ghc-hetmet.git diff --git a/compiler/basicTypes/UniqSupply.lhs b/compiler/basicTypes/UniqSupply.lhs index 05b565f..8dcf595 100644 --- a/compiler/basicTypes/UniqSupply.lhs +++ b/compiler/basicTypes/UniqSupply.lhs @@ -1,7 +1,7 @@ % +% (c) The University of Glasgow 2006 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998 % -\section[UniqSupply]{The @UniqueSupply@ data type and a (monadic) supply thereof} \begin{code} module UniqSupply ( @@ -18,15 +18,15 @@ module UniqSupply ( lazyThenUs, lazyMapUs, mkSplitUniqSupply, - splitUniqSupply + splitUniqSupply, listSplitUniqSupply ) where #include "HsVersions.h" import Unique -import GLAEXTS -import UNSAFE_IO ( unsafeInterleaveIO ) +import GHC.Exts +import System.IO.Unsafe ( unsafeInterleaveIO ) w2i x = word2Int# x i2w x = int2Word# x @@ -56,6 +56,7 @@ data UniqSupply mkSplitUniqSupply :: Char -> IO UniqSupply splitUniqSupply :: UniqSupply -> (UniqSupply, UniqSupply) +listSplitUniqSupply :: UniqSupply -> [UniqSupply] -- Infinite uniqFromSupply :: UniqSupply -> Unique uniqsFromSupply :: UniqSupply -> [Unique] -- Infinite \end{code} @@ -63,27 +64,24 @@ uniqsFromSupply :: UniqSupply -> [Unique] -- Infinite \begin{code} mkSplitUniqSupply (C# c#) = let -#if __GLASGOW_HASKELL__ >= 503 mask# = (i2w (ord# c#)) `uncheckedShiftL#` (i2w_s 24#) -#else - mask# = (i2w (ord# c#)) `shiftL#` (i2w_s 24#) -#endif -- here comes THE MAGIC: -- This is one of the most hammered bits in the whole compiler mk_supply# = unsafeInterleaveIO ( - genSymZh >>= \ (W# u#) -> + genSymZh >>= \ (I# u#) -> mk_supply# >>= \ s1 -> mk_supply# >>= \ s2 -> - return (MkSplitUniqSupply (w2i (mask# `or#` u#)) s1 s2) + return (MkSplitUniqSupply (w2i (mask# `or#` (i2w u#))) s1 s2) ) in mk_supply# -foreign import ccall unsafe "genSymZh" genSymZh :: IO Word +foreign import ccall unsafe "genSymZh" genSymZh :: IO Int splitUniqSupply (MkSplitUniqSupply _ s1 s2) = (s1, s2) +listSplitUniqSupply (MkSplitUniqSupply _ s1 s2) = s1 : listSplitUniqSupply s2 \end{code} \begin{code}