diff options
author | Ben Gamari <bgamari.foss@gmail.com> | 2015-10-02 15:50:34 +0200 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2015-10-02 16:34:21 +0200 |
commit | 74424346415f4e3a4d888236b3eb993f8aef4c6b (patch) | |
tree | e1320e90891c2118c0d8792c18d8febca8f8c76b | |
parent | 953940850f7f2aaf53d91e882a3216bfcf30c8f5 (diff) | |
download | haskell-74424346415f4e3a4d888236b3eb993f8aef4c6b.tar.gz |
Move CallStack back to base
CallStack requires tuples, instances of which are defined in GHC.Tuple.
Unfortunately the change made in D757 to the `Typeable` deriving
mechanism means that `GHC.Tuple` must import `GHC.Types` for types
necessary to generate type representations. This results in a cycle.
Test Plan: Validate
Reviewers: gridaphobe, austin, hvr
Subscribers: thomie
Differential Revision: https://phabricator.haskell.org/D1298
-rw-r--r-- | compiler/prelude/PrelNames.hs | 9 | ||||
-rw-r--r-- | libraries/base/GHC/Err.hs | 3 | ||||
-rw-r--r-- | libraries/base/GHC/Exception.hs | 1 | ||||
-rw-r--r-- | libraries/base/GHC/Exception.hs-boot | 3 | ||||
-rw-r--r-- | libraries/base/GHC/Stack.hsc | 3 | ||||
-rw-r--r-- | libraries/base/GHC/Stack/Types.hs | 76 | ||||
-rw-r--r-- | libraries/base/base.cabal | 1 | ||||
-rw-r--r-- | libraries/ghc-prim/GHC/Types.hs | 51 |
8 files changed, 91 insertions, 56 deletions
diff --git a/compiler/prelude/PrelNames.hs b/compiler/prelude/PrelNames.hs index be6396cf21..10d8747b73 100644 --- a/compiler/prelude/PrelNames.hs +++ b/compiler/prelude/PrelNames.hs @@ -458,8 +458,9 @@ gHC_PARR' = mkBaseModule (fsLit "GHC.PArr") gHC_SRCLOC :: Module gHC_SRCLOC = mkBaseModule (fsLit "GHC.SrcLoc") -gHC_STACK :: Module +gHC_STACK, gHC_STACK_TYPES :: Module gHC_STACK = mkBaseModule (fsLit "GHC.Stack") +gHC_STACK_TYPES = mkBaseModule (fsLit "GHC.Stack.Types") gHC_STATICPTR :: Module gHC_STATICPTR = mkBaseModule (fsLit "GHC.StaticPtr") @@ -1178,11 +1179,11 @@ knownSymbolClassName = clsQual gHC_TYPELITS (fsLit "KnownSymbol") knownSymbolCl -- Source Locations callStackDataConName, callStackTyConName, srcLocDataConName :: Name callStackDataConName - = dcQual gHC_TYPES (fsLit "CallStack") callStackDataConKey + = dcQual gHC_STACK_TYPES (fsLit "CallStack") callStackDataConKey callStackTyConName - = tcQual gHC_TYPES (fsLit "CallStack") callStackTyConKey + = tcQual gHC_STACK_TYPES (fsLit "CallStack") callStackTyConKey srcLocDataConName - = dcQual gHC_TYPES (fsLit "SrcLoc") srcLocDataConKey + = dcQual gHC_STACK_TYPES (fsLit "SrcLoc") srcLocDataConKey -- plugins pLUGINS :: Module diff --git a/libraries/base/GHC/Err.hs b/libraries/base/GHC/Err.hs index 8cdb10709d..6c40cba570 100644 --- a/libraries/base/GHC/Err.hs +++ b/libraries/base/GHC/Err.hs @@ -23,7 +23,8 @@ module GHC.Err( absentErr, error, undefined ) where import GHC.CString () -import GHC.Types +import GHC.Types (Char) +import GHC.Stack.Types import GHC.Prim import GHC.Integer () -- Make sure Integer is compiled first -- because GHC depends on it in a wired-in way diff --git a/libraries/base/GHC/Exception.hs b/libraries/base/GHC/Exception.hs index 3fbae05c9a..02c6cfa54f 100644 --- a/libraries/base/GHC/Exception.hs +++ b/libraries/base/GHC/Exception.hs @@ -37,6 +37,7 @@ import Data.Typeable (Typeable, cast) -- loop: Data.Typeable -> GHC.Err -> GHC.Exception import GHC.Base import GHC.Show +import GHC.Stack.Types {- | The @SomeException@ type is the root of the exception type hierarchy. diff --git a/libraries/base/GHC/Exception.hs-boot b/libraries/base/GHC/Exception.hs-boot index 594f2665e8..f89fed1aa2 100644 --- a/libraries/base/GHC/Exception.hs-boot +++ b/libraries/base/GHC/Exception.hs-boot @@ -28,7 +28,8 @@ module GHC.Exception ( SomeException, errorCallException, errorCallWithCallStackException, divZeroException, overflowException, ratioZeroDenomException ) where -import GHC.Types( Char, CallStack ) +import GHC.Types ( Char ) +import GHC.Stack.Types ( CallStack ) data SomeException divZeroException, overflowException, ratioZeroDenomException :: SomeException diff --git a/libraries/base/GHC/Stack.hsc b/libraries/base/GHC/Stack.hsc index a2283ff656..6ef1fa5d25 100644 --- a/libraries/base/GHC/Stack.hsc +++ b/libraries/base/GHC/Stack.hsc @@ -22,6 +22,9 @@ module GHC.Stack ( whoCreated, errorWithStackTrace, + -- * Implicit parameter call stacks + SrcLoc(..), CallStack(..), + -- * Internals CostCentreStack, CostCentre, diff --git a/libraries/base/GHC/Stack/Types.hs b/libraries/base/GHC/Stack/Types.hs new file mode 100644 index 0000000000..5c37f64713 --- /dev/null +++ b/libraries/base/GHC/Stack/Types.hs @@ -0,0 +1,76 @@ +{-# LANGUAGE NoImplicitPrelude #-} + +----------------------------------------------------------------------------- +-- | +-- Module : GHC.Stack.Types +-- Copyright : (c) The University of Glasgow 2015 +-- License : see libraries/ghc-prim/LICENSE +-- +-- Maintainer : cvs-ghc@haskell.org +-- Stability : internal +-- Portability : non-portable (GHC Extensions) +-- +-- type definitions for call-stacks via implicit parameters. +-- Use GHC.Exts from the base package instead of importing this +-- module directly. +-- +----------------------------------------------------------------------------- + +module GHC.Stack.Types ( + -- * Implicit parameter call stacks + SrcLoc(..), CallStack(..), + ) where + +import GHC.Types + +-- Make implicit dependency known to build system +import GHC.Tuple () +import GHC.Integer () + +---------------------------------------------------------------------- +-- Explicit call-stacks built via ImplicitParams +---------------------------------------------------------------------- + +-- | @CallStack@s are an alternate method of obtaining the call stack at a given +-- point in the program. +-- +-- When an implicit-parameter of type @CallStack@ occurs in a program, GHC will +-- solve it with the current location. If another @CallStack@ implicit-parameter +-- is in-scope (e.g. as a function argument), the new location will be appended +-- to the one in-scope, creating an explicit call-stack. For example, +-- +-- @ +-- myerror :: (?loc :: CallStack) => String -> a +-- myerror msg = error (msg ++ "\n" ++ showCallStack ?loc) +-- @ +-- ghci> myerror "die" +-- *** Exception: die +-- CallStack: +-- ?loc, called at MyError.hs:7:51 in main:MyError +-- myerror, called at <interactive>:2:1 in interactive:Ghci1 +-- +-- @CallStack@s do not interact with the RTS and do not require compilation with +-- @-prof@. On the other hand, as they are built up explicitly using +-- implicit-parameters, they will generally not contain as much information as +-- the simulated call-stacks maintained by the RTS. +-- +-- A @CallStack@ is a @[(String, SrcLoc)]@. The @String@ is the name of +-- function that was called, the 'SrcLoc' is the call-site. The list is +-- ordered with the most recently called function at the head. +-- +-- @since 4.8.2.0 +data CallStack = CallStack { getCallStack :: [([Char], SrcLoc)] } + -- See Note [Overview of implicit CallStacks] + +-- | A single location in the source code. +-- +-- @since 4.8.2.0 +data SrcLoc = SrcLoc + { srcLocPackage :: [Char] + , srcLocModule :: [Char] + , srcLocFile :: [Char] + , srcLocStartLine :: Int + , srcLocStartCol :: Int + , srcLocEndLine :: Int + , srcLocEndCol :: Int + } diff --git a/libraries/base/base.cabal b/libraries/base/base.cabal index 662f2747d7..6545db5901 100644 --- a/libraries/base/base.cabal +++ b/libraries/base/base.cabal @@ -252,6 +252,7 @@ Library GHC.Show GHC.Stable GHC.Stack + GHC.Stack.Types GHC.Stats GHC.Storable GHC.TopHandler diff --git a/libraries/ghc-prim/GHC/Types.hs b/libraries/ghc-prim/GHC/Types.hs index 6dcd5f1a7f..294f15e6e4 100644 --- a/libraries/ghc-prim/GHC/Types.hs +++ b/libraries/ghc-prim/GHC/Types.hs @@ -29,8 +29,7 @@ module GHC.Types ( isTrue#, SPEC(..), Nat, Symbol, - Coercible, - SrcLoc(..), CallStack(..) + Coercible ) where import GHC.Prim @@ -309,51 +308,3 @@ you're reading this in 2023 then things went wrong). See #8326. -- Libraries can specify this by using 'SPEC' data type to inform which -- loops should be aggressively specialized. data SPEC = SPEC | SPEC2 - --- | A single location in the source code. --- --- @since 4.8.2.0 -data SrcLoc = SrcLoc - { srcLocPackage :: [Char] - , srcLocModule :: [Char] - , srcLocFile :: [Char] - , srcLocStartLine :: Int - , srcLocStartCol :: Int - , srcLocEndLine :: Int - , srcLocEndCol :: Int - } - ----------------------------------------------------------------------- --- Explicit call-stacks built via ImplicitParams ----------------------------------------------------------------------- - --- | @CallStack@s are an alternate method of obtaining the call stack at a given --- point in the program. --- --- When an implicit-parameter of type @CallStack@ occurs in a program, GHC will --- solve it with the current location. If another @CallStack@ implicit-parameter --- is in-scope (e.g. as a function argument), the new location will be appended --- to the one in-scope, creating an explicit call-stack. For example, --- --- @ --- myerror :: (?loc :: CallStack) => String -> a --- myerror msg = error (msg ++ "\n" ++ showCallStack ?loc) --- @ --- ghci> myerror "die" --- *** Exception: die --- CallStack: --- ?loc, called at MyError.hs:7:51 in main:MyError --- myerror, called at <interactive>:2:1 in interactive:Ghci1 --- --- @CallStack@s do not interact with the RTS and do not require compilation with --- @-prof@. On the other hand, as they are built up explicitly using --- implicit-parameters, they will generally not contain as much information as --- the simulated call-stacks maintained by the RTS. --- --- A @CallStack@ is a @[(String, SrcLoc)]@. The @String@ is the name of --- function that was called, the 'SrcLoc' is the call-site. The list is --- ordered with the most recently called function at the head. --- --- @since 4.8.2.0 -data CallStack = CallStack { getCallStack :: [([Char], SrcLoc)] } - -- See Note [Overview of implicit CallStacks] |