X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FbasicTypes%2FUniqSupply.lhs;h=41ad5c0f60dadb5846cfe77716e77673443ab0e6;hb=10dd2a6d050e4779782800184014b8738fadc679;hp=a24a4c199613b3babe3d6b047e595ae4379779a1;hpb=0b62f53e6da34769aa1bf8409d9987a5311bb516;p=ghc-hetmet.git diff --git a/ghc/compiler/basicTypes/UniqSupply.lhs b/ghc/compiler/basicTypes/UniqSupply.lhs index a24a4c1..41ad5c0 100644 --- a/ghc/compiler/basicTypes/UniqSupply.lhs +++ b/ghc/compiler/basicTypes/UniqSupply.lhs @@ -24,12 +24,9 @@ module UniqSupply ( #include "HsVersions.h" import Unique -import GlaExts -#if __GLASGOW_HASKELL__ < 301 -import IOBase ( IO(..), IOResult(..) ) -#else -#endif +import GLAEXTS +import UNSAFE_IO ( unsafeInterleaveIO ) w2i x = word2Int# x i2w x = int2Word# x @@ -43,12 +40,6 @@ i2w_s x = (x :: Int#) %* * %************************************************************************ -%************************************************************************ -%* * -\subsubsection[UniqSupply-type]{@UniqSupply@ type and operations} -%* * -%************************************************************************ - A value of type @UniqSupply@ is unique, and it can supply {\em one} distinct @Unique@. Also, from the supply, one can also manufacture an arbitrary number of further @UniqueSupplies@, @@ -66,14 +57,17 @@ mkSplitUniqSupply :: Char -> IO UniqSupply splitUniqSupply :: UniqSupply -> (UniqSupply, UniqSupply) uniqFromSupply :: UniqSupply -> Unique -uniqsFromSupply :: Int -> UniqSupply -> [Unique] +uniqsFromSupply :: UniqSupply -> [Unique] -- Infinite \end{code} \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 @@ -85,22 +79,19 @@ mkSplitUniqSupply (C# c#) return (MkSplitUniqSupply uniq s1 s2) ) - mk_unique = _ccall_ genSymZh >>= \ (W# u#) -> + mk_unique = genSymZh >>= \ (W# u#) -> return (I# (w2i (mask# `or#` u#))) in mk_supply# +foreign import ccall unsafe "genSymZh" genSymZh :: IO Word + splitUniqSupply (MkSplitUniqSupply _ s1 s2) = (s1, s2) \end{code} \begin{code} -uniqFromSupply (MkSplitUniqSupply (I# n) _ _) = mkUniqueGrimily n - -uniqsFromSupply (I# i) supply = i `get_from` supply - where - get_from 0# _ = [] - get_from n (MkSplitUniqSupply (I# u) _ s2) - = mkUniqueGrimily u : get_from (n -# 1#) s2 +uniqFromSupply (MkSplitUniqSupply n _ _) = mkUniqueGrimily n +uniqsFromSupply (MkSplitUniqSupply n _ s2) = mkUniqueGrimily n : uniqsFromSupply s2 \end{code} %************************************************************************ @@ -157,9 +148,9 @@ getUniqueUs :: UniqSM Unique getUniqueUs us = case splitUniqSupply us of (us1,us2) -> (uniqFromSupply us1, us2) -getUniquesUs :: Int -> UniqSM [Unique] -getUniquesUs n us = case splitUniqSupply us of - (us1,us2) -> (uniqsFromSupply n us1, us2) +getUniquesUs :: UniqSM [Unique] +getUniquesUs us = case splitUniqSupply us of + (us1,us2) -> (uniqsFromSupply us1, us2) \end{code} \begin{code}