X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FbasicTypes%2FUniqSupply.lhs;h=98e288860fb57d582ba355c182dc1479e83d95e0;hb=fcfa1c6f92dcb9d0e1fbe0563944c76739259612;hp=81fec960964dff9c8e73d46c833f83503dbf3abb;hpb=0596517a9b4b2b32e5d375a986351102ac4540fc;p=ghc-hetmet.git diff --git a/ghc/compiler/basicTypes/UniqSupply.lhs b/ghc/compiler/basicTypes/UniqSupply.lhs index 81fec96..98e2888 100644 --- a/ghc/compiler/basicTypes/UniqSupply.lhs +++ b/ghc/compiler/basicTypes/UniqSupply.lhs @@ -12,24 +12,32 @@ 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, mkSplitUniqSupply, - splitUniqSupply, - - -- and the access functions for the `builtin' UniqueSupply - getBuiltinUniques, mkBuiltinUnique, - mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3 + splitUniqSupply ) where -import Ubiq{-uitous-} +IMP_Ubiq(){-uitous-} import Unique import Util + +#if __GLASGOW_HASKELL__ == 201 import PreludeGlaST +# define WHASH GHCbase.W# +#elif __GLASGOW_HASKELL__ >= 202 +import GlaExts +import STBase +# define WHASH GlaExts.W# +#else +import PreludeGlaST +# define WHASH W# +#endif w2i x = word2Int# x i2w x = int2Word# x @@ -62,7 +70,7 @@ data UniqSupply \end{code} \begin{code} -mkSplitUniqSupply :: Char -> PrimIO UniqSupply +mkSplitUniqSupply :: Char -> IO UniqSupply splitUniqSupply :: UniqSupply -> (UniqSupply, UniqSupply) getUnique :: UniqSupply -> Unique @@ -70,7 +78,7 @@ getUniques :: Int -> UniqSupply -> [Unique] \end{code} \begin{code} -mkSplitUniqSupply (MkChar c#) +mkSplitUniqSupply (C# c#) = let mask# = (i2w (ord# c#)) `shiftL#` (i2w_s 24#) @@ -84,31 +92,42 @@ 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.... - 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#))) + -- Too bad it's not 1.3-portable... + unsafe_interleave m = + MkST ( \ s -> + let + (MkST m') = m + (r, new_s) = m' s + in + (r, s)) +-- + + mk_unique = _ccall_ genSymZh `thenPrimIO` \ (WHASH u#) -> + returnPrimIO (I# (w2i (mask# `or#` u#))) in - mk_supply# +#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 -# 1#) s2 \end{code} %************************************************************************ @@ -122,11 +141,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 #-} @@ -135,6 +152,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 @@ -169,29 +190,22 @@ mapAndUnzip3Us f (x:xs) = f x `thenUs` \ (r1, r2, r3) -> mapAndUnzip3Us f xs `thenUs` \ (rs1, rs2, rs3) -> returnUs (r1:rs1, r2:rs2, r3:rs3) -\end{code} - -%************************************************************************ -%* * -\subsubsection[UniqueSupplies-compiler]{@UniqueSupplies@ specific to the compiler} -%* * -%************************************************************************ - -\begin{code} -mkPseudoUnique1, mkPseudoUnique2, mkPseudoUnique3, - mkBuiltinUnique :: Int -> Unique -mkBuiltinUnique i = mkUnique 'B' i -mkPseudoUnique1 i = mkUnique 'C' i -- used for getItsUnique on Regs -mkPseudoUnique2 i = mkUnique 'D' i -- ditto -mkPseudoUnique3 i = mkUnique 'E' i -- ditto - -getBuiltinUniques :: Int -> [Unique] -getBuiltinUniques n = map (mkUnique 'B') [1 .. n] -\end{code} - -The following runs a uniq monad expression, using builtin uniq values: -\begin{code} ---runBuiltinUs :: UniqSM a -> a ---runBuiltinUs m = snd (initUs uniqSupply_B m) +thenMaybeUs :: UniqSM (Maybe a) -> (a -> UniqSM (Maybe b)) -> UniqSM (Maybe b) +thenMaybeUs m k + = m `thenUs` \ result -> + case result of + Nothing -> returnUs Nothing + Just x -> k x + +mapAccumLUs :: (acc -> x -> UniqSM (acc, y)) + -> acc + -> [x] + -> UniqSM (acc, [y]) + +mapAccumLUs f b [] = returnUs (b, []) +mapAccumLUs f b (x:xs) + = f b x `thenUs` \ (b__2, x__2) -> + mapAccumLUs f b__2 xs `thenUs` \ (b__3, xs__2) -> + returnUs (b__3, x__2:xs__2) \end{code}