Make reallyUnsafePtrEquality# levity polymorphic, and use it to subsume pointer comparison primops
A different approach than the previous MR !5932 (closed) for making reallyUnsafePtrEquality#
levity-polymorphic, issue #17126 (closed), was agreed upon:
- Change the type of the primop
reallyUnsafePtrEquality#
to the most general version possible (meaning it should be heterogeneous as well as levity-polymorphic):
reallyUnsafePtrEquality# :: forall {l1 :: Levity} {l2 :: Levity}
(a :: TYPE (BoxedRep l1)) (b :: TYPE (BoxedRep l2)).
a -> b -> Int#
- Add a new internal module,
GHC.Ext.PtrEq
, which defines pointer equality operations that are now subsumed byreallyUnsafePtrEquality#
. These functions are then re-exported byGHC.Exts
(so that no function goes missing from the export list ofGHC.Exts
, which is user-facing). [The functions can't be defined directly inGHC.Exts
because other modules in theGHC
namespace require access to them, and they can't importGHC.Exts
.] More specifically,GHC.Ext.PtrEq
defines:
- A (new) function:
reallyUnsafePtrEquality :: forall (a :: TYPE (BoxedRep Lifted)). a -> a -> Int#
-
Library definitions of ex-primops:
sameMutableArray#
sameSmallMutableArray
sameMutableByteArray#
sameMutableArrayArray#
sameMutVar#
sameTVar#
sameMVar#
sameIOPort#
eqStableName#
-
New functions for comparing non-mutable arrays that were previously missing:
sameArray#
sameSmallArray#
sameByteArray#
sameArrayArray#
These were requested in #9192 (closed).
Generally speaking, existing libraries that use reallyUnsafePtrEquality#
will continue to work with the new, levity-polymorphic version. But not all! Some (containers
, unordered-containers
, dependent-map
) contain the following:
unsafeCoerce# reallyUnsafePtrEquality# a b
If we make reallyUnsafePtrEquality#
levity-polymorphic, this code fails the current GHC representation polymorphism checks.
We agreed that the right solution here is to modify the library; in this case by deleting the call to unsafeCoerce#
, since reallyUnsafePtrEquality#
is now type-heterogeneous too.