From: Ian Lynagh Date: Sun, 29 Nov 2009 03:10:29 +0000 (+0000) Subject: Give more informative error messages X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=f9460db84b4eb145d1356435127cce0a1a775c70 Give more informative error messages We used to just get ghc: panic! (the 'impossible' happened) (GHC version 6.13.20091128 for x86_64-unknown-linux): too few bytes. Failed reading at byte position 32753 with no indication of what was being parsed. --- diff --git a/libraries/bin-package-db/Distribution/InstalledPackageInfo/Binary.hs b/libraries/bin-package-db/Distribution/InstalledPackageInfo/Binary.hs index 0f59929..387b78f 100644 --- a/libraries/bin-package-db/Distribution/InstalledPackageInfo/Binary.hs +++ b/libraries/bin-package-db/Distribution/InstalledPackageInfo/Binary.hs @@ -19,9 +19,24 @@ import Distribution.Package hiding (depends) import Distribution.License import Distribution.InstalledPackageInfo as IPI import Data.Binary as Bin +import Control.Exception as Exception readBinPackageDB :: Binary m => FilePath -> IO [InstalledPackageInfo_ m] -readBinPackageDB file = Bin.decodeFile file +readBinPackageDB file + = do xs <- Bin.decodeFile file + _ <- Exception.evaluate $ length xs + return xs + `catchUserError` + (\err -> error ("While parsing " ++ show file ++ ": " ++ err)) + +catchUserError :: IO a -> (String -> IO a) -> IO a +#ifdef BASE3 +catchUserError io f = io `Exception.catch` \e -> case e of + ErrorCall err -> f err + _ -> throw e +#else +catchUserError io f = io `Exception.catch` \(ErrorCall err) -> f err +#endif writeBinPackageDB :: Binary m => FilePath -> [InstalledPackageInfo_ m] -> IO () writeBinPackageDB file ipis = Bin.encodeFile file ipis diff --git a/libraries/bin-package-db/bin-package-db.cabal b/libraries/bin-package-db/bin-package-db.cabal index cc03200..fbac327 100644 --- a/libraries/bin-package-db/bin-package-db.cabal +++ b/libraries/bin-package-db/bin-package-db.cabal @@ -11,11 +11,21 @@ source-repository head type: darcs location: http://darcs.haskell.org/ghc +flag base3 + default: False + Library { exposed-modules: Distribution.InstalledPackageInfo.Binary - build-depends: base >= 3 && < 5, - binary == 0.5.*, + if flag(base3) + build-depends: base >= 3 && < 4 + cpp-options: -DBASE3 + else + build-depends: base >= 4 && < 5 + + build-depends: binary == 0.5.*, Cabal == 1.8.* + + extensions: CPP }