X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Futils%2FFastString.lhs;h=8dbfefaa0b7690aae3b1a43b8814205c079e841e;hb=423d477bfecd490de1449c59325c8776f91d7aac;hp=ed81d7947e5267c3b8f5bdc7dc155048c397e7f2;hpb=931f16bbdcf82221a29fe404af604b9372dc60c4;p=ghc-hetmet.git diff --git a/ghc/compiler/utils/FastString.lhs b/ghc/compiler/utils/FastString.lhs index ed81d79..8dbfefa 100644 --- a/ghc/compiler/utils/FastString.lhs +++ b/ghc/compiler/utils/FastString.lhs @@ -3,8 +3,18 @@ % \section{Fast strings} -Compact representations of character strings with -unique identifiers (hash-cons'ish). +FastString: A compact, hash-consed, representation of character strings. + Comparison is O(1), and you can get a Unique from them. + Generated by the FSLIT macro + 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 the SLIT macro + Turn into SDoc with Outputable.ptext + +Use LitString unless you want the facilities of FastString \begin{code} module FastString @@ -106,6 +116,7 @@ instance Eq FastString where a /= b = case cmpFS a b of { LT -> True; EQ -> False; GT -> True } instance Ord FastString where + -- Compares lexicographically, not by unique a <= b = case cmpFS a b of { LT -> True; EQ -> True; GT -> False } a < b = case cmpFS a b of { LT -> True; EQ -> False; GT -> False } a >= b = case cmpFS a b of { LT -> False; EQ -> True; GT -> True } @@ -391,9 +402,9 @@ hashSubStrBA ba# start# len# = 2# -> ((ord# c0 *# 631#) +# (ord# c1 *# 217#) +# len#) `remInt#` hASH_TBL_SIZE# _ -> ((ord# c0 *# 631#) +# (ord# c1 *# 217#) +# (ord# c2 *# 43#) +# len#) `remInt#` hASH_TBL_SIZE# where - c0 = indexCharArray# ba# 0# - c1 = indexCharArray# ba# (len# `quotInt#` 2# -# 1#) - c2 = indexCharArray# ba# (len# -# 1#) + c0 = indexCharArray# ba# (start# +# 0#) + c1 = indexCharArray# ba# (start# +# (len# `quotInt#` 2# -# 1#)) + c2 = indexCharArray# ba# (start# +# (len# -# 1#)) -- c1 = indexCharArray# ba# 1# -- c2 = indexCharArray# ba# 2# @@ -422,7 +433,7 @@ cmpFS (FastString u1# l1# b1#) (FastString u2# l2# b2#) = if u1# ==# u2# then EQ else let l# = if l1# <=# l2# then l1# else l2# in unsafePerformIO ( - strncmp b1# b2# l# >>= \ (I# res) -> + memcmp b1# b2# l# >>= \ (I# res) -> return ( if res <# 0# then LT else if res ==# 0# then @@ -431,8 +442,8 @@ cmpFS (FastString u1# l1# b1#) (FastString u2# l2# b2#) = else GT )) -foreign import ccall "strncmp" unsafe - strncmp :: ByteArray# -> ByteArray# -> Int# -> IO Int +foreign import ccall "ghc_memcmp" unsafe + memcmp :: ByteArray# -> ByteArray# -> Int# -> IO Int -- ----------------------------------------------------------------------------- -- Outputting 'FastString's @@ -497,7 +508,6 @@ hPutFS handle (UnicodeStr _ is) -- LitStrings, here for convenience only. type LitString = Ptr () --- ToDo: make it a Ptr when we don't have to support 4.08 any more mkLitString# :: Addr# -> LitString mkLitString# a# = Ptr a#