X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=Debug%2FTrace.hs;h=84de4d6b1ba96bcaec94ea24edaa0ccc658b0fc0;hb=b1f2e321ceac8fcfc1f0756e2f5c2585fbd00b3c;hp=993a72e412a338913c5f476ffe4fadeb0fdae52f;hpb=2c19d1a0efd17ab30b773ec3fd88f212af8317b6;p=ghc-base.git diff --git a/Debug/Trace.hs b/Debug/Trace.hs index 993a72e..84de4d6 100644 --- a/Debug/Trace.hs +++ b/Debug/Trace.hs @@ -1,41 +1,58 @@ ----------------------------------------------------------------------------- --- +-- | -- Module : Debug.Trace -- Copyright : (c) The University of Glasgow 2001 --- License : BSD-style (see the file libraries/core/LICENSE) +-- License : BSD-style (see the file libraries/base/LICENSE) -- -- Maintainer : libraries@haskell.org -- Stability : provisional -- Portability : portable -- --- $Id: Trace.hs,v 1.2 2002/04/24 16:01:51 simonmar Exp $ --- --- The trace function. +-- The 'trace' function. -- ----------------------------------------------------------------------------- module Debug.Trace ( - trace -- :: String -> a -> a + -- * Tracing + putTraceMsg, -- :: String -> IO () + trace -- :: String -> a -> a ) 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 + +-- | '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 + +foreign import ccall unsafe debugBelch :: CString -> CString -> IO () #endif -#ifdef __GLASGOW_HASKELL__ {-# NOINLINE trace #-} +{-| +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