summaryrefslogtreecommitdiff
path: root/libraries
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2016-01-11 18:30:29 +0000
committerSimon Marlow <marlowsd@gmail.com>2016-01-13 13:06:07 +0000
commit6cb860a9a154847906868ac0be93d750f99dac86 (patch)
tree69ca27d0383e11137c02b3b6fdde50c26eb94a6e /libraries
parent00c8076ecf441e6be5cacafc78a98f7ab38ddad4 (diff)
downloadhaskell-6cb860a9a154847906868ac0be93d750f99dac86.tar.gz
Add -prof stack trace to assert
Summary: So that assertion failures have full call stack information attached when using `ghc -fexternal-interpreter -prof`. Here's one I just collected by inserting a dummy assert in Happy: ``` *** Exception: Assertion failed CallStack (from ImplicitParams): assert, called at ./First.lhs:37:11 in main:First CallStack (from -prof): First.mkFirst (First.lhs:37:11-27) First.mkFirst (First.lhs:37:11-93) Main.main2.runParserGen.first (Main.lhs:107:48-56) Main.main2.runParserGen.first (Main.lhs:107:27-57) Main.main2.runParserGen (Main.lhs:(96,9)-(276,9)) Main.main2.runParserGen (Main.lhs:(90,9)-(276,10)) Main.main2.runParserGen (Main.lhs:(86,9)-(276,10)) Main.main2.runParserGen (Main.lhs:(85,9)-(276,10)) Main.main2 (Main.lhs:74:20-43) Main.main2 (Main.lhs:(64,9)-(78,61)) Main.main (Main.lhs:57:9-18) ``` Test Plan: validate Reviewers: erikd, hvr, austin, bgamari Reviewed By: bgamari Subscribers: thomie Differential Revision: https://phabricator.haskell.org/D1765 GHC Trac Issues: #11047
Diffstat (limited to 'libraries')
-rw-r--r--libraries/base/GHC/Exception.hs3
-rw-r--r--libraries/base/GHC/IO/Exception.hs12
-rw-r--r--libraries/base/GHC/Stack/CCS.hsc3
3 files changed, 13 insertions, 5 deletions
diff --git a/libraries/base/GHC/Exception.hs b/libraries/base/GHC/Exception.hs
index 80761ada75..6c579f0372 100644
--- a/libraries/base/GHC/Exception.hs
+++ b/libraries/base/GHC/Exception.hs
@@ -28,7 +28,8 @@ module GHC.Exception
, divZeroException, overflowException, ratioZeroDenomException
, errorCallException, errorCallWithCallStackException
-- re-export CallStack and SrcLoc from GHC.Types
- , CallStack, getCallStack, prettyCallStack
+ , CallStack, getCallStack, prettyCallStack, prettyCallStackLines
+ , showCCSStack
, SrcLoc(..), prettySrcLoc
) where
diff --git a/libraries/base/GHC/IO/Exception.hs b/libraries/base/GHC/IO/Exception.hs
index 933ce943e6..c7bccb0077 100644
--- a/libraries/base/GHC/IO/Exception.hs
+++ b/libraries/base/GHC/IO/Exception.hs
@@ -51,6 +51,8 @@ import GHC.Show
import GHC.Read
import GHC.Exception
import GHC.IO.Handle.Types
+import GHC.OldList ( intercalate )
+import {-# SOURCE #-} GHC.Stack.CCS
import Foreign.C.Types
import Data.Typeable ( cast )
@@ -355,9 +357,13 @@ instance Show IOException where
assertError :: (?callStack :: CallStack) => Bool -> a -> a
assertError predicate v
| predicate = lazy v
- | otherwise = throw (AssertionFailed
- ("Assertion failed\n"
- ++ prettyCallStack ?callStack))
+ | otherwise = unsafeDupablePerformIO $ do
+ ccsStack <- currentCallStack
+ let
+ implicitParamCallStack = prettyCallStackLines ?callStack
+ ccsCallStack = showCCSStack ccsStack
+ stack = intercalate "\n" $ implicitParamCallStack ++ ccsCallStack
+ throwIO (AssertionFailed ("Assertion failed\n" ++ stack))
unsupportedOperation :: IOError
unsupportedOperation =
diff --git a/libraries/base/GHC/Stack/CCS.hsc b/libraries/base/GHC/Stack/CCS.hsc
index d40d92dc91..bab9f7500b 100644
--- a/libraries/base/GHC/Stack/CCS.hsc
+++ b/libraries/base/GHC/Stack/CCS.hsc
@@ -116,4 +116,5 @@ whoCreated obj = do
ccsToStrings ccs
renderStack :: [String] -> String
-renderStack strs = "Stack trace:" ++ concatMap ("\n "++) (reverse strs)
+renderStack strs =
+ "CallStack (from -prof):" ++ concatMap ("\n "++) (reverse strs)