Skip to content
  • sheaf's avatar
    Generalise reallyUnsafePtrEquality# and use it · cbf6e1de
    sheaf authored
    fixes #9192 and #17126
    updates containers submodule
    
    1. Changes the type of the primop `reallyUnsafePtrEquality#` to the most
    general version possible (heterogeneous as well as levity-polymorphic):
    
    > reallyUnsafePtrEquality#
    >   :: forall {l :: Levity} {k :: Levity}
    >        (a :: TYPE (BoxedRep l)) (b :: TYPE (BoxedRep k))
    >   . a -> b -> Int#
    
    2. Adds a new internal module, `GHC.Ext.PtrEq`, which contains pointer
    equality operations that are now subsumed by `reallyUnsafePtrEquality#`.
    These functions are then re-exported by `GHC.Exts` (so that no function
    goes missing from the export list of `GHC.Exts`, which is user-facing).
    More specifically, `GHC.Ext.PtrEq` defines:
    
      - A new function:
        * reallyUnsafePtrEquality :: forall (a :: Type). a -> a -> Int#
    
      - Library definitions of ex-primops:
         * `sameMutableArray#`
         * `sameSmallMutableArray`
         * `sameMutableByteArray#`
         * `sameMutableArrayArray#`
         * `sameMutVar#`
         * `sameTVar#`
         * `sameMVar#`
         * `sameIOPort#`
         * `eqStableName#`
    
      - New functions for comparing non-mutable arrays:
         * `sameArray#`
         * `sameSmallArray#`
         * `sameByteArray#`
         * `sameArrayArray#`
    
      These were requested in #9192.
    
    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.
    cbf6e1de
To find the state of this project's repository at the time of any of these versions, check out the tags.