summaryrefslogtreecommitdiff
path: root/libraries/base/GHC
diff options
context:
space:
mode:
authorJoachim Breitner <mail@joachim-breitner.de>2014-06-09 20:55:22 +0200
committerJoachim Breitner <mail@joachim-breitner.de>2014-06-09 20:58:54 +0200
commit1946922c61df427e59f8a00572fd4dd6501abd98 (patch)
tree495a8c6ab879364f85804edb3a15584588e92a69 /libraries/base/GHC
parent25fb4fe8c6d9b04bf180a209ad4b4cb630a46ec5 (diff)
downloadhaskell-1946922c61df427e59f8a00572fd4dd6501abd98.tar.gz
Make Ptr's parameter phantom
and implement castPtr with coerce, which gives 12% less allocation in reverse-complem 7.3% less allocation in fasta. Binary sizes fell 0.1%. as reported and discussed in #9163.
Diffstat (limited to 'libraries/base/GHC')
-rw-r--r--libraries/base/GHC/Ptr.lhs10
1 files changed, 8 insertions, 2 deletions
diff --git a/libraries/base/GHC/Ptr.lhs b/libraries/base/GHC/Ptr.lhs
index c959d1e375..341512b838 100644
--- a/libraries/base/GHC/Ptr.lhs
+++ b/libraries/base/GHC/Ptr.lhs
@@ -31,13 +31,13 @@ import GHC.Show
import GHC.Num
import GHC.List ( length, replicate )
import Numeric ( showHex )
+import Data.Coerce
#include "MachDeps.h"
------------------------------------------------------------------------
-- Data pointers.
-type role Ptr representational
data Ptr a = Ptr Addr# deriving (Eq, Ord)
-- ^ A value of type @'Ptr' a@ represents a pointer to an object, or an
-- array of objects, which may be marshalled to or from Haskell values
@@ -49,6 +49,10 @@ data Ptr a = Ptr Addr# deriving (Eq, Ord)
-- to access the pointer. For example you might write small foreign
-- functions to get or set the fields of a C @struct@.
+-- The role of Ptr's parameter is phantom, as there is relation between
+-- the Haskell representation and whathever the user puts at the end of the
+-- pointer. And phantom is useful to implement castPtr (see #9163)
+
-- |The constant 'nullPtr' contains a distinguished value of 'Ptr'
-- that is not associated with a valid memory location.
nullPtr :: Ptr a
@@ -56,7 +60,7 @@ nullPtr = Ptr nullAddr#
-- |The 'castPtr' function casts a pointer from one type to another.
castPtr :: Ptr a -> Ptr b
-castPtr (Ptr addr) = Ptr addr
+castPtr = coerce
-- |Advances the given address by the given offset in bytes.
plusPtr :: Ptr a -> Int -> Ptr b
@@ -124,6 +128,8 @@ data FunPtr a = FunPtr Addr# deriving (Eq, Ord)
-- > foreign import ccall "dynamic"
-- > mkFun :: FunPtr IntFunction -> IntFunction
+-- The role of FunPtr is representational, to be on the safe side (see #9163)
+
-- |The constant 'nullFunPtr' contains a
-- distinguished value of 'FunPtr' that is not
-- associated with a valid memory location.