X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=Debug%2FTrace.hs;h=7c9295f0ee848e9ce1cf38db9292d473c470da2e;hb=99a329d9b272925dcdf474ce2369e9421b51e51c;hp=c287a4dc5ac7418481d39833eaf2af43afa9ee4c;hpb=5505736fa4594514aab2b3ea8b15171e8349b91e;p=ghc-base.git diff --git a/Debug/Trace.hs b/Debug/Trace.hs index c287a4d..7c9295f 100644 --- a/Debug/Trace.hs +++ b/Debug/Trace.hs @@ -14,81 +14,44 @@ module Debug.Trace ( -- * Tracing - - -- ** Tracers - -- | The tracer is a function that monitors the trace messages. - fileTracer, -- :: Handle -> String -> IO () -#ifdef mingw32_HOST_OS - winDebugTracer, -- :: String -> IO () -#endif - addTracer, -- :: String -> (String -> IO ()) -> IO () - removeTracer, -- :: String -> IO () - - -- ** Messages putTraceMsg, -- :: String -> IO () trace -- :: String -> a -> a ) where import Prelude -import Data.IORef import System.IO.Unsafe -import System.IO +#ifdef __GLASGOW_HASKELL__ #ifdef mingw32_HOST_OS import Foreign.C.String #endif - -{-# NOINLINE tracers #-} -tracers :: IORef [(String, String -> IO ())] -tracers = unsafePerformIO (newIORef [("defaultTracer", fileTracer stderr)]) - --- | A tracer function that outputs the message to a file -fileTracer :: Handle -- ^ file handle - -> String -- ^ trace message - -> IO () -fileTracer handle msg = do - hPutStr handle msg - hPutChar handle '\n' - -#ifdef mingw32_HOST_OS --- | A tracer function that outputs the message to the debuger (Windows only) -winDebugTracer :: String -- ^ trace message - -> IO () -winDebugTracer msg = do - withCString (msg++"\n") outputDebugString - -foreign import ccall unsafe "OutputDebugStringA" - outputDebugString :: CString -> IO () #endif --- | Registering a new tracer -addTracer :: String -- ^ the tracer name - -> (String -> IO ()) -- ^ tracer - -> IO () -addTracer name tracer = do - ts <- readIORef tracers - writeIORef tracers ((name,tracer):filter (\(n,l) -> n /= name) ts) - --- | Removing the tracer with the given name -removeTracer :: String -> IO () -removeTracer name = do - ts <- readIORef tracers - writeIORef tracers (filter (\(n,l) -> n /= name) ts) - -- | 'putTraceMsg' function outputs the trace message from IO monad. +-- Usually the output stream is 'stderr' but if the function is called +-- from Windows GUI application then the output will be directed to the Windows +-- debug console. putTraceMsg :: String -> IO () putTraceMsg msg = do - ts <- readIORef tracers - mapM_ (\(n,l) -> l msg) ts +#ifndef __GLASGOW_HASKELL__ + hPutStr handle msg + hPutChar handle '\n' +#else + withCString "%s\n" $ \cfmt -> + withCString msg $ \cmsg -> + debugBelch cfmt cmsg + +foreign import ccall unsafe debugBelch :: CString -> CString -> IO () +#endif {-# NOINLINE trace #-} {-| -When called, 'trace' outputs the string in its first argument using the -installed tracers, before returning the second argument as its result. -The 'trace' function is not referentially transparent, and should only -be used for debugging, or for monitoring execution. Some -implementations of 'trace' may decorate the string that\'s output to -indicate that you\'re tracing. +When called, 'trace' outputs the string in its first argument, before +returning the second argument as its result. The 'trace' function is not +referentially transparent, and should only be used for debugging, or for +monitoring execution. Some implementations of 'trace' may decorate the string +that\'s output to indicate that you\'re tracing. The function is implemented on +top of 'putTraceMsg'. -} trace :: String -> a -> a trace string expr = unsafePerformIO $ do