diff options
author | Joachim Breitner <mail@joachim-breitner.de> | 2014-06-09 20:55:22 +0200 |
---|---|---|
committer | Joachim Breitner <mail@joachim-breitner.de> | 2014-06-09 20:58:54 +0200 |
commit | 1946922c61df427e59f8a00572fd4dd6501abd98 (patch) | |
tree | 495a8c6ab879364f85804edb3a15584588e92a69 /libraries/base/GHC | |
parent | 25fb4fe8c6d9b04bf180a209ad4b4cb630a46ec5 (diff) | |
download | haskell-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.lhs | 10 |
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. |