Skip to content
  • Herbert Valerio Riedel's avatar
    Implement new `compareByteArrays#` primop · e3ba26f8
    Herbert Valerio Riedel authored
    The new primop
    
        compareByteArrays# :: ByteArray# -> Int# {- offset -}
                           -> ByteArray# -> Int# {- offset -}
                           -> Int# {- length -}
                           -> Int#
    
    allows to compare the subrange of the first `ByteArray#` to
    the (same-length) subrange of the second `ByteArray#` and returns a
    value less than, equal to, or greater than zero if the range is found,
    respectively, to be byte-wise lexicographically less than, to match,
    or be greater than the second range.
    
    Under the hood, the new primop is implemented in terms of the standard
    ISO C `memcmp(3)` function. It is currently an out-of-line primop but
    work is underway to optimise this into an inline primop for a future
    follow-up Differential (see D4091).
    
    This primop has applications in packages like `text`, `text-short`,
    `bytestring`, `text-containers`, `primitive`, etc.  which currently
    have to incur the overhead of an ordinary FFI call to directly or
    indirectly invoke `memcmp(3)` as well has having to deal with some
    `unsafePerformIO`-variant.
    
    While at it, this also improves the documentation for the existing
    `copyByteArray#` primitive which has a non-trivial type-signature
    that significantly benefits from a more explicit description of its
    arguments.
    
    Reviewed By: bgamari
    
    Differential Revision: https://phabricator.haskell.org/D4090
    e3ba26f8