X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Futils%2FStringBuffer.lhs;h=d7cfdddc2e31c1319aabdc5bd92baaec74acc564;hb=e83fa2eba7ef2302fae8a6be86a9f495b4144387;hp=2ab170bbe37119c39ef93c0b5c2c98ec326fcf58;hpb=0e8e53db37d75d506d3a5b2804342442a5142d59;p=ghc-hetmet.git diff --git a/ghc/compiler/utils/StringBuffer.lhs b/ghc/compiler/utils/StringBuffer.lhs index 2ab170b..d7cfddd 100644 --- a/ghc/compiler/utils/StringBuffer.lhs +++ b/ghc/compiler/utils/StringBuffer.lhs @@ -32,9 +32,9 @@ module StringBuffer lexemeIndex, -- :: StringBuffer -> Int# -- moving the end point of the current lexeme. - setCurrentPos#, -- :: StringBuffer -> Int# -> StringBuffer - incLexeme, -- :: StringBuffer -> StringBuffer - decLexeme, -- :: StringBuffer -> StringBuffer + addToCurrentPos, -- :: StringBuffer -> Int# -> StringBuffer + incCurrentPos, -- :: StringBuffer -> StringBuffer + decCurrentPos, -- :: StringBuffer -> StringBuffer -- move the start and end lexeme pointer on by x units. stepOn, -- :: StringBuffer -> StringBuffer @@ -65,12 +65,14 @@ module StringBuffer #include "HsVersions.h" -#if __GLASGOW_HASKELL__ < 411 -import PrelAddr ( Addr(..) ) +#if __GLASGOW_HASKELL__ < 502 import Panic ( panic ) #else -import Addr ( Addr(..) ) +#if __GLASGOW_HASKELL__ < 503 import Ptr ( Ptr(..) ) +#else +import GHC.Ptr ( Ptr(..) ) +#endif #endif #if __GLASGOW_HASKELL__ < 501 @@ -84,13 +86,16 @@ import GHC.IO ( hGetcBuffered ) import PrimPacked import FastString -import GlaExts +import GLAEXTS + import Foreign -import IO ( openFile, isEOFError ) -import Addr -import Exception ( bracket ) -import CString ( unpackCStringBA ) +#if __GLASGOW_HASKELL__ >= 502 +import CString ( newCString ) +#endif + +import IO ( openFile, isEOFError ) +import EXCEPTION ( bracket ) #if __GLASGOW_HASKELL__ < 503 import PrelIOBase @@ -114,7 +119,7 @@ data StringBuffer \begin{code} instance Show StringBuffer where - showsPrec _ s = showString "" + showsPrec _ s = showString "" \end{code} \begin{code} @@ -126,20 +131,14 @@ hGetStringBuffer fname = do -- the sentinel. Assume it has a final newline for now, and overwrite -- that with the sentinel. slurpFileExpandTabs (below) leaves room -- for the sentinel. - let (A# a#) = a; + let (Ptr a#) = a; (I# read#) = read; end# = read# -# 1# - -- add sentinel '\NUL' - _casm_ `` ((char *)%0)[(int)%1]=(char)0; '' (A# a#) (I# end#) - return (StringBuffer a# end# 0# 0#) + -- add sentinel '\NUL' + writeCharOffPtr a (I# end#) '\0' -unsafeWriteBuffer :: StringBuffer -> Int# -> Char# -> StringBuffer -unsafeWriteBuffer s@(StringBuffer a _ _ _) i# ch# = - unsafePerformIO ( - _casm_ `` ((char *)%0)[(int)%1]=(char)%2; '' (A# a) (I# i#) (C# ch#) >>= \ () -> - return s - ) + return (StringBuffer a# end# 0# 0#) \end{code} ----------------------------------------------------------------------------- @@ -149,18 +148,11 @@ unsafeWriteBuffer s@(StringBuffer a _ _ _) i# ch# = stringToStringBuffer :: String -> IO StringBuffer freeStringBuffer :: StringBuffer -> IO () -#if __GLASGOW_HASKELL__ >= 411 -stringToStringBuffer str = - do let sz@(I# sz#) = length str - (Ptr a#) <- mallocBytes (sz+1) - fill_in str (A# a#) - writeCharOffAddr (A# a#) sz '\0' -- sentinel - return (StringBuffer a# sz# 0# 0#) - where - fill_in [] _ = return () - fill_in (c:cs) a = do - writeCharOffAddr a 0 c - fill_in cs (a `plusAddr` 1) +#if __GLASGOW_HASKELL__ >= 502 +stringToStringBuffer str = do + let sz@(I# sz#) = length str + Ptr a# <- newCString str + return (StringBuffer a# sz# 0# 0#) freeStringBuffer (StringBuffer a# _ _ _) = Foreign.free (Ptr a#) #else @@ -181,10 +173,12 @@ We guess the size of the buffer required as 20% extra for expanded tabs, and enlarge it if necessary. \begin{code} +#if __GLASGOW_HASKELL__ < 501 getErrType :: IO Int getErrType = _ccall_ getErrType__ +#endif -slurpFileExpandTabs :: FilePath -> IO (Addr,Int) +slurpFileExpandTabs :: FilePath -> IO (Ptr (),Int) slurpFileExpandTabs fname = do bracket (openFile fname ReadMode) (hClose) (\ handle -> @@ -196,14 +190,14 @@ slurpFileExpandTabs fname = do if sz_i == 0 -- empty file: just allocate a buffer containing '\0' then do chunk <- allocMem 1 - writeCharOffAddr chunk 0 '\0' + writeCharOffPtr chunk 0 '\0' return (chunk, 0) else do let sz_i' = (sz_i * 12) `div` 10 -- add 20% for tabs chunk <- allocMem sz_i' trySlurp handle sz_i' chunk ) -trySlurp :: Handle -> Int -> Addr -> IO (Addr, Int) +trySlurp :: Handle -> Int -> Ptr () -> IO (Ptr (), Int) trySlurp handle sz_i chunk = #if __GLASGOW_HASKELL__ < 501 wantReadableHandle "hGetChar" handle $ \ handle_ -> @@ -217,11 +211,11 @@ trySlurp handle sz_i chunk = tAB_SIZE = 8# - slurpFile :: Int# -> Int# -> Addr -> Int# -> Int# -> IO (Addr, Int) + slurpFile :: Int# -> Int# -> Ptr () -> Int# -> Int# -> IO (Ptr (), Int) slurpFile c off chunk chunk_sz max_off = slurp c off where - slurp :: Int# -> Int# -> IO (Addr, Int) + slurp :: Int# -> Int# -> IO (Ptr (), Int) slurp c off | off >=# max_off = do let new_sz = chunk_sz *# 2# chunk' <- reAllocMem chunk (I# new_sz) @@ -253,16 +247,16 @@ trySlurp handle sz_i chunk = '\xFFFF' -> return (chunk, I# off) #endif '\t' -> tabIt c off - ch -> do writeCharOffAddr chunk (I# off) ch + ch -> do writeCharOffPtr chunk (I# off) ch let c' | ch == '\n' = 0# | otherwise = c +# 1# slurp c' (off +# 1#) - tabIt :: Int# -> Int# -> IO (Addr, Int) + tabIt :: Int# -> Int# -> IO (Ptr (), Int) -- can't run out of buffer in here, because we reserved an -- extra tAB_SIZE bytes at the end earlier. tabIt c off = do - writeCharOffAddr chunk (I# off) ' ' + writeCharOffPtr chunk (I# off) ' ' let c' = c +# 1# off' = off +# 1# if c' `remInt#` tAB_SIZE ==# 0# @@ -278,17 +272,17 @@ trySlurp handle sz_i chunk = return (chunk', rc+1 {- room for sentinel -}) -reAllocMem :: Addr -> Int -> IO Addr +reAllocMem :: Ptr () -> Int -> IO (Ptr ()) reAllocMem ptr sz = do - chunk <- _ccall_ realloc ptr sz - if chunk == nullAddr + chunk <- c_realloc ptr sz + if chunk == nullPtr then fail "reAllocMem" else return chunk -allocMem :: Int -> IO Addr +allocMem :: Int -> IO (Ptr ()) allocMem sz = do - chunk <- _ccall_ malloc sz - if chunk == nullAddr + chunk <- c_malloc sz + if chunk == nullPtr #if __GLASGOW_HASKELL__ < 501 then constructErrorAndFail "allocMem" #else @@ -296,6 +290,22 @@ allocMem sz = do "out of memory" Nothing) #endif else return chunk + +#if __GLASGOW_HASKELL__ <= 408 +c_malloc sz = do A# a <- c_malloc' sz; return (Ptr a) +foreign import ccall "malloc" unsafe + c_malloc' :: Int -> IO Addr + +c_realloc (Ptr a) sz = do A# a <- c_realloc' (A# a) sz; return (Ptr a) +foreign import ccall "realloc" unsafe + c_realloc' :: Addr -> Int -> IO Addr +#else +foreign import ccall "malloc" unsafe + c_malloc :: Int -> IO (Ptr a) + +foreign import ccall "realloc" unsafe + c_realloc :: Ptr a -> Int -> IO (Ptr a) +#endif \end{code} Lookup @@ -330,16 +340,16 @@ lexemeIndex (StringBuffer fo# _ c# _) = c# \begin{code} -- moving the end point of the current lexeme. -setCurrentPos# :: StringBuffer -> Int# -> StringBuffer -setCurrentPos# (StringBuffer fo l# s# c#) i# = +addToCurrentPos :: StringBuffer -> Int# -> StringBuffer +addToCurrentPos (StringBuffer fo l# s# c#) i# = StringBuffer fo l# s# (c# +# i#) -- augmenting the current lexeme by one. -incLexeme :: StringBuffer -> StringBuffer -incLexeme (StringBuffer fo l# s# c#) = StringBuffer fo l# s# (c# +# 1#) +incCurrentPos :: StringBuffer -> StringBuffer +incCurrentPos (StringBuffer fo l# s# c#) = StringBuffer fo l# s# (c# +# 1#) -decLexeme :: StringBuffer -> StringBuffer -decLexeme (StringBuffer fo l# s# c#) = StringBuffer fo l# s# (c# -# 1#) +decCurrentPos :: StringBuffer -> StringBuffer +decCurrentPos (StringBuffer fo l# s# c#) = StringBuffer fo l# s# (c# -# 1#) \end{code} @@ -490,16 +500,17 @@ stepOnUntilChar# (StringBuffer fo l# s# c#) x# = -- conversion lexemeToString :: StringBuffer -> String -lexemeToString (StringBuffer fo _ start_pos# current#) = +lexemeToString (StringBuffer fo len# start_pos# current#) = if start_pos# ==# current# then "" else - unpackCStringBA (copySubStr (A# fo) (I# start_pos#) (I# (current# -# start_pos#))) - + let len = I# (current# -# start_pos#) in + unpackNBytesBA (copySubStr fo (I# start_pos#) len) len + lexemeToFastString :: StringBuffer -> FastString lexemeToFastString (StringBuffer fo l# start_pos# current#) = if start_pos# ==# current# then mkFastString "" else - mkFastSubString (A# fo) (I# start_pos#) (I# (current# -# start_pos#)) + mkFastSubString fo (I# start_pos#) (I# (current# -# start_pos#)) \end{code}