X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Futils%2FFastString.lhs;h=29c7788c2fbc3114eabb2cf35ea116306cdd9ac9;hb=4fa44a3ae9c36222ccb460ba3ed24e46bf7c70ae;hp=cd93c78a47d1071e1564051563647e6bcfe62787;hpb=f5d4c3239e57b0396672ffc302961f84398d730e;p=ghc-hetmet.git diff --git a/compiler/utils/FastString.lhs b/compiler/utils/FastString.lhs index cd93c78..29c7788 100644 --- a/compiler/utils/FastString.lhs +++ b/compiler/utils/FastString.lhs @@ -2,26 +2,38 @@ % (c) The University of Glasgow, 1997-2006 % \begin{code} -{- -FastString: A compact, hash-consed, representation of character strings. - Comparison is O(1), and you can get a Unique from them. - Generated by fsLit - Turn into SDoc with Outputable.ftext - -LitString: Just a wrapper for the Addr# of a C string (Ptr CChar). - Practically no operations - Outputing them is fast - Generated by sLit - Turn into SDoc with Outputable.ptext - -Use LitString unless you want the facilities of FastString --} +{-# OPTIONS -fno-warn-unused-imports #-} +-- XXX GHC 6.9 seems to be confused by unpackCString# being used only in +-- a RULE + +{-# OPTIONS_GHC -O -funbox-strict-fields #-} +-- We always optimise this, otherwise performance of a non-optimised +-- compiler is severely affected + +-- | +-- There are two principal string types used internally by GHC: +-- +-- 'FastString': +-- * A compact, hash-consed, representation of character strings. +-- * Comparison is O(1), and you can get a 'Unique.Unique' from them. +-- * Generated by 'fsLit'. +-- * Turn into 'Outputable.SDoc' with 'Outputable.ftext'. +-- +-- 'LitString': +-- * Just a wrapper for the @Addr#@ of a C string (@Ptr CChar@). +-- * Practically no operations. +-- * Outputing them is fast. +-- * Generated by 'sLit'. +-- * Turn into 'Outputable.SDoc' with 'Outputable.ptext' +-- +-- Use 'LitString' unless you want the facilities of 'FastString'. module FastString ( -- * FastStrings FastString(..), -- not abstract, for now. -- ** Construction + fsLit, mkFastString, mkFastStringBytes, mkFastStringByteList, @@ -60,17 +72,19 @@ module FastString -- * LitStrings LitString, + + -- ** Construction + sLit, #if defined(__GLASGOW_HASKELL__) mkLitString#, #endif mkLitString, + + -- ** Deconstruction unpackLitString, - strLength, - - ptrStrLength, - - sLit, - fsLit, + + -- ** Operations + lengthLS ) where #include "HsVersions.h" @@ -89,7 +103,12 @@ import Data.IORef ( IORef, newIORef, readIORef, writeIORef ) import Data.Maybe ( isJust ) import Data.Char ( ord ) -import GHC.IOBase ( IO(..) ) +#if __GLASGOW_HASKELL__ >= 611 +import GHC.IO ( IO(..) ) +#else +import GHC.IOBase ( IO(..) ) +#endif + import GHC.Ptr ( Ptr(..) ) #if defined(__GLASGOW_HASKELL__) import GHC.Base ( unpackCString# ) @@ -366,9 +385,9 @@ hashStr (Ptr a#) (I# len#) = loop 0# 0# where loop h n | n GHC.Exts.==# len# = I# h | otherwise = loop h2 (n GHC.Exts.+# 1#) - where c = ord# (indexCharOffAddr# a# n) - h2 = (c GHC.Exts.+# (h GHC.Exts.*# 128#)) `remInt#` - hASH_TBL_SIZE# + where !c = ord# (indexCharOffAddr# a# n) + !h2 = (c GHC.Exts.+# (h GHC.Exts.*# 128#)) `remInt#` + hASH_TBL_SIZE# -- ----------------------------------------------------------------------------- -- Operations @@ -377,12 +396,12 @@ hashStr (Ptr a#) (I# len#) = loop 0# 0# lengthFS :: FastString -> Int lengthFS f = n_chars f --- | Returns 'True' if the 'FastString' is Z-encoded +-- | Returns @True@ if the 'FastString' is Z-encoded isZEncoded :: FastString -> Bool isZEncoded fs | ZEncoded <- enc fs = True | otherwise = False --- | Returns 'True' if this 'FastString' is not Z-encoded but already has +-- | Returns @True@ if this 'FastString' is not Z-encoded but already has -- a Z-encoding cached (used in producing stats). hasZEncoding :: FastString -> Bool hasZEncoding (FastString _ _ _ _ enc) = @@ -393,11 +412,11 @@ hasZEncoding (FastString _ _ _ _ enc) = m <- readIORef ref return (isJust m) --- | Returns 'True' if the 'FastString' is empty +-- | Returns @True@ if the 'FastString' is empty nullFS :: FastString -> Bool nullFS f = n_bytes f == 0 --- | unpacks and decodes the FastString +-- | Unpacks and decodes the FastString unpackFS :: FastString -> String unpackFS (FastString _ n_bytes _ buf enc) = inlinePerformIO $ withForeignPtr buf $ \ptr -> @@ -410,7 +429,7 @@ bytesFS (FastString _ n_bytes _ buf _) = inlinePerformIO $ withForeignPtr buf $ \ptr -> peekArray n_bytes ptr --- | returns a Z-encoded version of a 'FastString'. This might be the +-- | Returns a Z-encoded version of a 'FastString'. This might be the -- original, if it was already Z-encoded. The first time this -- function is applied to a particular 'FastString', the results are -- memoized. @@ -537,8 +556,8 @@ unpackLitString p_ = case pUnbox p_ of ch -> if ch `eqFastChar` _CLIT('\0') then [] else cBox ch : unpack (n +# _ILIT(1)) -strLength :: LitString -> Int -strLength = ptrStrLength +lengthLS :: LitString -> Int +lengthLS = ptrStrLength -- for now, use a simple String representation --no, let's not do that right now - it's work in other places @@ -551,8 +570,8 @@ mkLitString = id unpackLitString :: LitString -> String unpackLitString = id -strLength :: LitString -> Int -strLength = length +lengthLS :: LitString -> Int +lengthLS = length #endif @@ -573,10 +592,6 @@ pokeCAString ptr str = in go str 0 -#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ <= 602 -peekCAStringLen = peekCStringLen -#endif - {-# NOINLINE sLit #-} sLit :: String -> LitString sLit x = mkLitString x