base 4.2.0.0 → 4.2.0.1
raw patch · 15 files changed
+152/−84 lines, 15 files
Files
- Control/Exception/Base.hs +2/−2
- Data/Data.hs +3/−2
- Data/Typeable.hs +52/−29
- Data/Unique.hs +15/−8
- GHC/Conc.lhs +17/−7
- GHC/ForeignPtr.hs +11/−3
- GHC/Handle.hs +1/−1
- GHC/IO/Exception.hs +2/−3
- GHC/IO/Handle.hs +17/−7
- GHC/List.lhs +1/−1
- System/CPUTime.hsc +1/−1
- System/Exit.hs +3/−3
- System/IO.hs +15/−5
- base.cabal +1/−1
- include/HsBaseConfig.h +11/−11
Control/Exception/Base.hs view
@@ -340,8 +340,8 @@ -- -- Note that we have to give a type signature to @e@, or the program -- will not typecheck as the type is ambiguous. While it is possible--- to catch exceptions of any type, see $catchall for an explanation--- of the problems with doing so.+-- to catch exceptions of any type, see the previous section \"Catching all+-- exceptions\" for an explanation of the problems with doing so. -- -- For catching exceptions in pure (non-'IO') expressions, see the -- function 'evaluate'.
Data/Data.hs view
@@ -480,8 +480,9 @@ deriving Show ---- | Representation of constructors+-- | Representation of constructors. Note that equality on constructors+-- with different types may not work -- i.e. the constructors for 'False' and+-- 'Nothing' may compare equal. data Constr = Constr { conrep :: ConstrRep , constring :: String
Data/Typeable.hs view
@@ -302,6 +302,22 @@ -- ------------------------------------------------------------- +{- Note [Memoising typeOf]+~~~~~~~~~~~~~~~~~~~~~~~~~~+IMPORTANT: we don't want to recalculate the type-rep once per+call to the dummy argument. This is what went wrong in Trac #3245+So we help GHC by manually keeping the 'rep' *outside* the value +lambda, thus+ + typeOfDefault :: forall t a. (Typeable1 t, Typeable a) => t a -> TypeRep+ typeOfDefault = \_ -> rep+ where+ rep = typeOf1 (undefined :: t a) `mkAppTy` + typeOf (undefined :: a)++Notice the crucial use of scoped type variables here!+-}+ -- | The class 'Typeable' allows a concrete representation of a type to -- be calculated. class Typeable a where@@ -316,77 +332,84 @@ typeOf1 :: t a -> TypeRep -- | For defining a 'Typeable' instance from any 'Typeable1' instance.-typeOfDefault :: (Typeable1 t, Typeable a) => t a -> TypeRep-typeOfDefault x = typeOf1 x `mkAppTy` typeOf (argType x)+typeOfDefault :: forall t a. (Typeable1 t, Typeable a) => t a -> TypeRep+typeOfDefault = \_ -> rep where- argType :: t a -> a- argType = undefined+ rep = typeOf1 (undefined :: t a) `mkAppTy` + typeOf (undefined :: a)+ -- Note [Memoising typeOf] -- | Variant for binary type constructors class Typeable2 t where typeOf2 :: t a b -> TypeRep -- | For defining a 'Typeable1' instance from any 'Typeable2' instance.-typeOf1Default :: (Typeable2 t, Typeable a) => t a b -> TypeRep-typeOf1Default x = typeOf2 x `mkAppTy` typeOf (argType x)+typeOf1Default :: forall t a b. (Typeable2 t, Typeable a) => t a b -> TypeRep+typeOf1Default = \_ -> rep where- argType :: t a b -> a- argType = undefined+ rep = typeOf2 (undefined :: t a b) `mkAppTy` + typeOf (undefined :: a)+ -- Note [Memoising typeOf] -- | Variant for 3-ary type constructors class Typeable3 t where typeOf3 :: t a b c -> TypeRep -- | For defining a 'Typeable2' instance from any 'Typeable3' instance.-typeOf2Default :: (Typeable3 t, Typeable a) => t a b c -> TypeRep-typeOf2Default x = typeOf3 x `mkAppTy` typeOf (argType x)+typeOf2Default :: forall t a b c. (Typeable3 t, Typeable a) => t a b c -> TypeRep+typeOf2Default = \_ -> rep where- argType :: t a b c -> a- argType = undefined+ rep = typeOf3 (undefined :: t a b c) `mkAppTy` + typeOf (undefined :: a)+ -- Note [Memoising typeOf] -- | Variant for 4-ary type constructors class Typeable4 t where typeOf4 :: t a b c d -> TypeRep -- | For defining a 'Typeable3' instance from any 'Typeable4' instance.-typeOf3Default :: (Typeable4 t, Typeable a) => t a b c d -> TypeRep-typeOf3Default x = typeOf4 x `mkAppTy` typeOf (argType x)+typeOf3Default :: forall t a b c d. (Typeable4 t, Typeable a) => t a b c d -> TypeRep+typeOf3Default = \_ -> rep where- argType :: t a b c d -> a- argType = undefined-+ rep = typeOf4 (undefined :: t a b c d) `mkAppTy` + typeOf (undefined :: a)+ -- Note [Memoising typeOf]+ -- | Variant for 5-ary type constructors class Typeable5 t where typeOf5 :: t a b c d e -> TypeRep -- | For defining a 'Typeable4' instance from any 'Typeable5' instance.-typeOf4Default :: (Typeable5 t, Typeable a) => t a b c d e -> TypeRep-typeOf4Default x = typeOf5 x `mkAppTy` typeOf (argType x)+typeOf4Default :: forall t a b c d e. (Typeable5 t, Typeable a) => t a b c d e -> TypeRep+typeOf4Default = \_ -> rep where- argType :: t a b c d e -> a- argType = undefined+ rep = typeOf5 (undefined :: t a b c d e) `mkAppTy` + typeOf (undefined :: a)+ -- Note [Memoising typeOf] -- | Variant for 6-ary type constructors class Typeable6 t where typeOf6 :: t a b c d e f -> TypeRep -- | For defining a 'Typeable5' instance from any 'Typeable6' instance.-typeOf5Default :: (Typeable6 t, Typeable a) => t a b c d e f -> TypeRep-typeOf5Default x = typeOf6 x `mkAppTy` typeOf (argType x)+typeOf5Default :: forall t a b c d e f. (Typeable6 t, Typeable a) => t a b c d e f -> TypeRep+typeOf5Default = \_ -> rep where- argType :: t a b c d e f -> a- argType = undefined+ rep = typeOf6 (undefined :: t a b c d e f) `mkAppTy` + typeOf (undefined :: a)+ -- Note [Memoising typeOf] -- | Variant for 7-ary type constructors class Typeable7 t where typeOf7 :: t a b c d e f g -> TypeRep -- | For defining a 'Typeable6' instance from any 'Typeable7' instance.-typeOf6Default :: (Typeable7 t, Typeable a) => t a b c d e f g -> TypeRep-typeOf6Default x = typeOf7 x `mkAppTy` typeOf (argType x)+typeOf6Default :: forall t a b c d e f g. (Typeable7 t, Typeable a) => t a b c d e f g -> TypeRep+typeOf6Default = \_ -> rep where- argType :: t a b c d e f g -> a- argType = undefined+ rep = typeOf7 (undefined :: t a b c d e f g) `mkAppTy` + typeOf (undefined :: a)+ -- Note [Memoising typeOf] #ifdef __GLASGOW_HASKELL__ -- Given a @Typeable@/n/ instance for an /n/-ary type constructor,
Data/Unique.hs view
@@ -21,20 +21,20 @@ import Prelude -import Control.Concurrent.MVar import System.IO.Unsafe (unsafePerformIO) #ifdef __GLASGOW_HASKELL__ import GHC.Base import GHC.Num+import GHC.Conc #endif -- | An abstract unique object. Objects of type 'Unique' may be -- compared for equality and ordering and hashed into 'Int'. newtype Unique = Unique Integer deriving (Eq,Ord) -uniqSource :: MVar Integer-uniqSource = unsafePerformIO (newMVar 0)+uniqSource :: TVar Integer+uniqSource = unsafePerformIO (newTVarIO 0) {-# NOINLINE uniqSource #-} -- | Creates a new object of type 'Unique'. The value returned will@@ -42,11 +42,18 @@ -- previous calls to 'newUnique'. There is no limit on the number of -- times 'newUnique' may be called. newUnique :: IO Unique-newUnique = do- val <- takeMVar uniqSource- let next = val+1- putMVar uniqSource next- return (Unique next)+newUnique = atomically $ do+ val <- readTVar uniqSource+ let next = val+1+ writeTVar uniqSource $! next+ return (Unique next)++-- SDM (18/3/2010): changed from MVar to STM. This fixes+-- 1. there was no async exception protection+-- 2. there was a space leak (now new value is strict)+-- 3. using atomicModifyIORef would be slightly quicker, but can+-- suffer from adverse scheduling issues (see #3838)+-- 4. also, the STM version is faster. -- | Hashes a 'Unique' into an 'Int'. Two 'Unique's may hash to the -- same value, although in practice this is unlikely. The 'Int'
GHC/Conc.lhs view
@@ -215,7 +215,7 @@ (see 'Control.Exception.block'). The newly created thread has an exception handler that discards the-exceptions 'BlockedOnDeadMVar', 'BlockedIndefinitely', and+exceptions 'BlockedIndefinitelyOnMVar', 'BlockedIndefinitelyOnSTM', and 'ThreadKilled', and passes all other exceptions to the uncaught exception handler (see 'setUncaughtExceptionHandler'). -}@@ -837,10 +837,11 @@ prodServiceThread :: IO () prodServiceThread = do- was_set <- readIORef prodding- writeIORef prodding True- -- no need for atomicModifyIORef, extra prods are harmless.- if (not (was_set)) then wakeupIOManager else return ()+ -- NB. use atomicModifyIORef here, otherwise there are race+ -- conditions in which prodding is left at True but the server is+ -- blocked in select().+ was_set <- atomicModifyIORef prodding $ \b -> (True,b)+ if (not (was_set)) then wakeupIOManager else return () -- Machinery needed to ensure that we only have one copy of certain -- CAFs in this module even when the base package is present twice, as@@ -1014,6 +1015,17 @@ -> IO () service_loop wakeup readfds writefds ptimeval old_reqs old_delays = do + -- reset prodding before we look at the new requests. If a new+ -- client arrives after this point they will send a wakup which will+ -- cause the server to loop around again, so we can be sure to not+ -- miss any requests.+ --+ -- NB. it's important to do this in the *first* iteration of+ -- service_loop, rather than after calling select(), since a client+ -- may have set prodding to True without sending a wakeup byte down+ -- the pipe, because the pipe wasn't set up.+ atomicModifyIORef prodding (\_ -> (False, ()))+ -- pick up new IO requests new_reqs <- atomicModifyIORef pendingEvents (\a -> ([],a)) let reqs = new_reqs ++ old_reqs@@ -1083,8 +1095,6 @@ return False unless exit $ do-- atomicModifyIORef prodding (\_ -> (False, ())) reqs' <- if wakeup_all then do wakeupAll reqs; return [] else completeRequests reqs readfds writefds []
GHC/ForeignPtr.hs view
@@ -42,11 +42,11 @@ import GHC.Show import GHC.List ( null ) import GHC.Base--- import GHC.IO import GHC.IORef import GHC.STRef ( STRef(..) ) import GHC.Ptr ( Ptr(..), FunPtr(..) ) import GHC.Err+import GHC.Num ( fromInteger ) #include "Typeable.h" @@ -150,7 +150,9 @@ -- mallocForeignPtr = doMalloc undefined where doMalloc :: Storable b => b -> IO (ForeignPtr b)- doMalloc a = do+ doMalloc a+ | I# size < 0 = error "mallocForeignPtr: size must be >= 0"+ | otherwise = do r <- newIORef (NoFinalizers, []) IO $ \s -> case newAlignedPinnedByteArray# size align s of { (# s', mbarr# #) ->@@ -163,6 +165,8 @@ -- | This function is similar to 'mallocForeignPtr', except that the -- size of the memory required is given explicitly as a number of bytes. mallocForeignPtrBytes :: Int -> IO (ForeignPtr a)+mallocForeignPtrBytes size | size < 0 =+ error "mallocForeignPtrBytes: size must be >= 0" mallocForeignPtrBytes (I# size) = do r <- newIORef (NoFinalizers, []) IO $ \s ->@@ -187,7 +191,9 @@ mallocPlainForeignPtr :: Storable a => IO (ForeignPtr a) mallocPlainForeignPtr = doMalloc undefined where doMalloc :: Storable b => b -> IO (ForeignPtr b)- doMalloc a = IO $ \s ->+ doMalloc a+ | I# size < 0 = error "mallocForeignPtr: size must be >= 0"+ | otherwise = IO $ \s -> case newAlignedPinnedByteArray# size align s of { (# s', mbarr# #) -> (# s', ForeignPtr (byteArrayContents# (unsafeCoerce# mbarr#)) (PlainPtr mbarr#) #)@@ -200,6 +206,8 @@ -- finalizer is used. Attempts to add a finalizer will cause an -- exception to be thrown. mallocPlainForeignPtrBytes :: Int -> IO (ForeignPtr a)+mallocPlainForeignPtrBytes size | size < 0 =+ error "mallocPlainForeignPtrBytes: size must be >= 0" mallocPlainForeignPtrBytes (I# size) = IO $ \s -> case newPinnedByteArray# size s of { (# s', mbarr# #) -> (# s', ForeignPtr (byteArrayContents# (unsafeCoerce# mbarr#))
GHC/Handle.hs view
@@ -15,7 +15,7 @@ -- #hide -module GHC.Handle {-# DEPRECATED "use GHC.IO.Handle.Base instead" #-} (+module GHC.Handle {-# DEPRECATED "use GHC.IO.Handle instead" #-} ( withHandle, withHandle', withHandle_, wantWritableHandle, wantReadableHandle, wantSeekableHandle,
GHC/IO/Exception.hs view
@@ -64,7 +64,7 @@ ----- --- |The thread is awiting to retry an STM transaction, but there are no+-- |The thread is waiting to retry an STM transaction, but there are no -- other references to any @TVar@s involved, so it can't ever continue. data BlockedIndefinitelyOnSTM = BlockedIndefinitelyOnSTM deriving Typeable@@ -91,8 +91,7 @@ ----- --- |There are no runnable threads, so the program is deadlocked.--- The @Deadlock@ exception is raised in the main thread only.+-- |'assert' was applied to 'False'. data AssertionFailed = AssertionFailed String deriving Typeable
GHC/IO/Handle.hs view
@@ -51,7 +51,7 @@ import GHC.IO.Handle.Types import GHC.IO.Handle.Internals import GHC.IO.Handle.Text-import System.IO.Error+import qualified GHC.IO.BufferedIO as Buffered import GHC.Base import GHC.Exception@@ -140,14 +140,24 @@ -- physical file, if the current I\/O position is equal to the length of -- the file. Otherwise, it returns 'False'. ----- NOTE: 'hIsEOF' may block, because it is the same as calling--- 'hLookAhead' and checking for an EOF exception.+-- NOTE: 'hIsEOF' may block, because it has to attempt to read from+-- the stream to determine whether there is any more data to be read. hIsEOF :: Handle -> IO Bool-hIsEOF handle =- catch- (hLookAhead handle >> return False)- (\e -> if isEOFError e then return True else ioError e)+hIsEOF handle = wantReadableHandle_ "hIsEOF" handle $ \Handle__{..} -> do++ cbuf <- readIORef haCharBuffer+ if not (isEmptyBuffer cbuf) then return False else do++ bbuf <- readIORef haByteBuffer+ if not (isEmptyBuffer bbuf) then return False else do++ -- NB. do no decoding, just fill the byte buffer; see #3808+ (r,bbuf') <- Buffered.fillReadBuffer haDevice bbuf+ if r == 0+ then return True+ else do writeIORef haByteBuffer bbuf'+ return False -- --------------------------------------------------------------------------- -- Looking ahead
GHC/List.lhs view
@@ -108,7 +108,7 @@ null [] = True null (_:_) = False --- | 'length' returns the length of a finite list as an 'Int'.+-- | /O(n)/. 'length' returns the length of a finite list as an 'Int'. -- It is an instance of the more general 'Data.List.genericLength', -- the result type of which may be any kind of number. length :: [a] -> Int
System/CPUTime.hsc view
@@ -108,7 +108,7 @@ #else # if defined(HAVE_TIMES) allocaBytes (#const sizeof(struct tms)) $ \ p_tms -> do- times p_tms+ _ <- times p_tms u_ticks <- (#peek struct tms,tms_utime) p_tms :: IO CClock s_ticks <- (#peek struct tms,tms_stime) p_tms :: IO CClock return (( (realToInteger u_ticks + realToInteger s_ticks) * 1000000000000)
System/Exit.hs view
@@ -42,7 +42,7 @@ -- --------------------------------------------------------------------------- -- exitWith --- | Computation 'exitWith' @code@ throws 'ExitException' @code@.+-- | Computation 'exitWith' @code@ throws 'ExitCode' @code@. -- Normally this terminates the program, returning @code@ to the -- program's caller. Before the program terminates, any open or -- semi-closed handles are first closed.@@ -52,9 +52,9 @@ -- A program that terminates successfully without calling 'exitWith' -- explicitly is treated as it it had called 'exitWith' 'ExitSuccess'. ----- As an 'ExitException' is not an 'IOError', 'exitWith' bypasses+-- As an 'ExitCode' is not an 'IOError', 'exitWith' bypasses -- the error handling in the 'IO' monad and cannot be intercepted by--- 'catch' from the "Prelude". However it is an 'Exception', and can+-- 'catch' from the "Prelude". However it is a 'SomeException', and can -- be caught using the functions of "Control.Exception". This means -- that cleanup computations added with 'Control.Exception.bracket' -- (from "Control.Exception") are also executed properly on 'exitWith'.
System/IO.hs view
@@ -234,9 +234,11 @@ #ifdef __GLASGOW_HASKELL__ import GHC.Base+import GHC.Real import GHC.IO hiding ( onException ) import GHC.IO.IOMode import GHC.IO.Handle.FD+import qualified GHC.IO.FD as FD import GHC.IO.Handle import GHC.IORef import GHC.IO.Exception ( userError )@@ -543,10 +545,10 @@ oflags = oflags1 .|. binary_flags #endif -#ifdef __NHC__+#if defined(__NHC__) findTempName x = do h <- openFile filepath ReadWriteMode return (filepath, h)-#else+#elif defined(__GLASGOW_HASKELL__) findTempName x = do fd <- withFilePath filepath $ \ f -> c_open f oflags mode@@ -557,12 +559,20 @@ then findTempName (x+1) else ioError (errnoToIOError loc errno Nothing (Just tmp_dir)) else do- -- XXX We want to tell fdToHandle what the filepath is,- -- as any exceptions etc will only be able to report the- -- fd currently++ (fD,fd_type) <- FD.mkFD (fromIntegral fd) ReadWriteMode Nothing{-no stat-}+ False{-is_socket-} + True{-is_nonblock-}++ h <- mkHandleFromFD fD fd_type filepath ReadWriteMode False{-set non-block-}+ (Just localeEncoding)++ return (filepath, h)+#else h <- fdToHandle fd `onException` c_close fd return (filepath, h) #endif+ where filename = prefix ++ show x ++ suffix filepath = tmp_dir `combine` filename
base.cabal view
@@ -1,5 +1,5 @@ name: base-version: 4.2.0.0+version: 4.2.0.1 license: BSD3 license-file: LICENSE maintainer: libraries@haskell.org
include/HsBaseConfig.h view
@@ -425,7 +425,7 @@ #define HTYPE_CHAR Int8 /* Define to Haskell type for clock_t */-#define HTYPE_CLOCK_T Int64+#define HTYPE_CLOCK_T Int32 /* Define to Haskell type for dev_t */ #define HTYPE_DEV_T Word64@@ -449,10 +449,10 @@ #define HTYPE_INTMAX_T Int64 /* Define to Haskell type for intptr_t */-#define HTYPE_INTPTR_T Int64+#define HTYPE_INTPTR_T Int32 /* Define to Haskell type for long */-#define HTYPE_LONG Int64+#define HTYPE_LONG Int32 /* Define to Haskell type for long long */ #define HTYPE_LONG_LONG Int64@@ -461,7 +461,7 @@ #define HTYPE_MODE_T Word32 /* Define to Haskell type for nlink_t */-#define HTYPE_NLINK_T Word64+#define HTYPE_NLINK_T Word32 /* Define to Haskell type for off_t */ #define HTYPE_OFF_T Int64@@ -470,7 +470,7 @@ #define HTYPE_PID_T Int32 /* Define to Haskell type for ptrdiff_t */-#define HTYPE_PTRDIFF_T Int64+#define HTYPE_PTRDIFF_T Int32 /* Define to Haskell type for rlim_t */ #define HTYPE_RLIM_T Word64@@ -485,19 +485,19 @@ #define HTYPE_SIG_ATOMIC_T Int32 /* Define to Haskell type for size_t */-#define HTYPE_SIZE_T Word64+#define HTYPE_SIZE_T Word32 /* Define to Haskell type for speed_t */ #define HTYPE_SPEED_T Word32 /* Define to Haskell type for ssize_t */-#define HTYPE_SSIZE_T Int64+#define HTYPE_SSIZE_T Int32 /* Define to Haskell type for tcflag_t */ #define HTYPE_TCFLAG_T Word32 /* Define to Haskell type for time_t */-#define HTYPE_TIME_T Int64+#define HTYPE_TIME_T Int32 /* Define to Haskell type for uid_t */ #define HTYPE_UID_T Word32@@ -506,7 +506,7 @@ #define HTYPE_UINTMAX_T Word64 /* Define to Haskell type for uintptr_t */-#define HTYPE_UINTPTR_T Word64+#define HTYPE_UINTPTR_T Word32 /* Define to Haskell type for unsigned char */ #define HTYPE_UNSIGNED_CHAR Word8@@ -515,7 +515,7 @@ #define HTYPE_UNSIGNED_INT Word32 /* Define to Haskell type for unsigned long */-#define HTYPE_UNSIGNED_LONG Word64+#define HTYPE_UNSIGNED_LONG Word32 /* Define to Haskell type for unsigned long long */ #define HTYPE_UNSIGNED_LONG_LONG Word64@@ -548,7 +548,7 @@ #define STDC_HEADERS 1 /* Number of bits in a file offset, on hosts where this is settable. */-/* #undef _FILE_OFFSET_BITS */+#define _FILE_OFFSET_BITS 64 /* Define for large files, on AIX-style hosts. */ /* #undef _LARGE_FILES */