X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Debug%2FTrace.hs;h=ebacb6c3d7fa28d37e385a2d240c97b2bd4d8d78;hb=HEAD;hp=05809a06b1cb5ca84878aa2f3d102a9bdfdf4f54;hpb=9812e0a321ec0ed8f9e53eb2febfb14c79564200;p=ghc-base.git diff --git a/Debug/Trace.hs b/Debug/Trace.hs index 05809a0..ebacb6c 100644 --- a/Debug/Trace.hs +++ b/Debug/Trace.hs @@ -1,3 +1,5 @@ +{-# LANGUAGE CPP, ForeignFunctionInterface #-} + ----------------------------------------------------------------------------- -- | -- Module : Debug.Trace @@ -13,40 +15,58 @@ ----------------------------------------------------------------------------- module Debug.Trace ( - -- * Tracing - trace -- :: String -> a -> a + -- * Tracing + putTraceMsg, -- :: String -> IO () + trace, -- :: String -> a -> a + traceShow ) where import Prelude import System.IO.Unsafe -import System.IO #ifdef __GLASGOW_HASKELL__ -import GHC.IOBase -import GHC.Handle +import Foreign.C.String +#else +import System.IO (hPutStrLn,stderr) #endif -#ifdef __HUGS__ -import Hugs.IOExts +-- | 'putTraceMsg' function outputs the trace message from IO monad. +-- Usually the output stream is 'System.IO.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 +#ifndef __GLASGOW_HASKELL__ + hPutStrLn stderr msg +#else + withCString "%s\n" $ \cfmt -> + withCString msg $ \cmsg -> + debugBelch cfmt cmsg + +-- don't use debugBelch() directly, because we cannot call varargs functions +-- using the FFI. +foreign import ccall unsafe "HsBase.h debugBelch2" + debugBelch :: CString -> CString -> IO () #endif -#ifdef __GLASGOW_HASKELL__ {-# NOINLINE trace #-} {-| -When called, 'trace' prints the string in its first argument to -standard error, 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 - hPutStr stderr string - hPutChar stderr '\n' - fd <- withHandle_ "trace" stderr $ (return.haFD) - postTraceHook fd + putTraceMsg string return expr -foreign import ccall "PostTraceHook" postTraceHook :: Int -> IO () -#endif +{-| +Like 'trace', but uses 'show' on the argument to convert it to a 'String'. + +> traceShow = trace . show +-} +traceShow :: (Show a) => a -> b -> b +traceShow = trace . show