X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FbasicTypes%2FUniqSupply.lhs;h=c60a989edd8f1da937817e22f9b5a56a5ed0cbf1;hb=b435b77395f8fd9a214a9bc7c25735c6f798896a;hp=7c155f326cc4a41ac5d54457707eaefc5c435e44;hpb=f01a8e8c9c53bfb5ab3393ed3457ebf25390efa1;p=ghc-hetmet.git diff --git a/ghc/compiler/basicTypes/UniqSupply.lhs b/ghc/compiler/basicTypes/UniqSupply.lhs index 7c155f3..c60a989 100644 --- a/ghc/compiler/basicTypes/UniqSupply.lhs +++ b/ghc/compiler/basicTypes/UniqSupply.lhs @@ -12,8 +12,8 @@ module UniqSupply ( getUnique, getUniques, -- basic ops - UniqSM(..), -- type: unique supply monad - initUs, thenUs, returnUs, + SYN_IE(UniqSM), -- type: unique supply monad + initUs, thenUs, returnUs, fixUs, mapUs, mapAndUnzipUs, mapAndUnzip3Us, thenMaybeUs, mapAccumLUs, @@ -21,13 +21,19 @@ module UniqSupply ( splitUniqSupply ) where -import Ubiq{-uitous-} +IMP_Ubiq(){-uitous-} import Unique import Util import PreludeGlaST +#if __GLASGOW_HASKELL__ >= 200 +# define WHASH GHCbase.W# +#else +# define WHASH W# +#endif + w2i x = word2Int# x i2w x = int2Word# x i2w_s x = (x :: Int#) @@ -67,7 +73,7 @@ getUniques :: Int -> UniqSupply -> [Unique] \end{code} \begin{code} -mkSplitUniqSupply (MkChar c#) +mkSplitUniqSupply (C# c#) = let mask# = (i2w (ord# c#)) `shiftL#` (i2w_s 24#) @@ -81,32 +87,40 @@ mkSplitUniqSupply (MkChar c#) returnPrimIO (MkSplitUniqSupply uniq s1 s2) ) where +-- -- inlined copy of unsafeInterleavePrimIO; -- this is the single-most-hammered bit of code -- in the compiler.... + -- Too bad it's not 1.3-portable... unsafe_interleave m s = let (r, new_s) = m s in (r, s) +-- - mk_unique = _ccall_ genSymZh `thenPrimIO` \ (W# u#) -> - returnPrimIO (MkInt (w2i (mask# `or#` u#))) + mk_unique = _ccall_ genSymZh `thenPrimIO` \ (WHASH u#) -> + returnPrimIO (I# (w2i (mask# `or#` u#))) in +#if __GLASGOW_HASKELL__ >= 200 + primIOToIO mk_supply# >>= \ s -> + return s +#else mk_supply# `thenPrimIO` \ s -> return s +#endif splitUniqSupply (MkSplitUniqSupply _ s1 s2) = (s1, s2) \end{code} \begin{code} -getUnique (MkSplitUniqSupply (MkInt n) _ _) = mkUniqueGrimily n +getUnique (MkSplitUniqSupply (I# n) _ _) = mkUniqueGrimily n -getUniques i@(MkInt i#) supply = i# `get_from` supply +getUniques (I# i) supply = i `get_from` supply where get_from 0# _ = [] - get_from n# (MkSplitUniqSupply (MkInt u#) _ s2) - = mkUniqueGrimily u# : get_from (n# `minusInt#` 1#) s2 + get_from n (MkSplitUniqSupply (I# u) _ s2) + = mkUniqueGrimily u : get_from (n `minusInt#` 1#) s2 \end{code} %************************************************************************ @@ -120,11 +134,9 @@ type UniqSM result = UniqSupply -> result -- the initUs function also returns the final UniqSupply -initUs :: UniqSupply -> UniqSM a -> (UniqSupply, a) +initUs :: UniqSupply -> UniqSM a -> a -initUs init_us m - = case (splitUniqSupply init_us) of { (s1, s2) -> - (s2, m s1) } +initUs init_us m = m init_us {-# INLINE thenUs #-} {-# INLINE returnUs #-} @@ -133,6 +145,10 @@ initUs init_us m @thenUs@ is where we split the @UniqSupply@. \begin{code} +fixUs :: (a -> UniqSM a) -> UniqSM a +fixUs m us + = r where r = m r us + thenUs :: UniqSM a -> (a -> UniqSM b) -> UniqSM b thenUs expr cont us