Give more informative error messages
authorIan Lynagh <igloo@earth.li>
Sun, 29 Nov 2009 03:10:29 +0000 (03:10 +0000)
committerIan Lynagh <igloo@earth.li>
Sun, 29 Nov 2009 03:10:29 +0000 (03:10 +0000)
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.

libraries/bin-package-db/Distribution/InstalledPackageInfo/Binary.hs
libraries/bin-package-db/bin-package-db.cabal

index 0f59929..387b78f 100644 (file)
@@ -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
index cc03200..fbac327 100644 (file)
@@ -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
 }