[m-rev.] for review: Implement string.unsafe_compare_substrings with foreign code.

Mark Brown mark at mercurylang.org
Wed Oct 23 17:56:51 AEDT 2019


This looks fine.

On Wed, Oct 23, 2019 at 3:02 PM Peter Wang <novalazy at gmail.com> wrote:
>
> library/string.m:
>     Add C and C# native implementations of unsafe_compare_substrings.
> ---
>  library/string.m | 23 +++++++++++++++++++++++
>  1 file changed, 23 insertions(+)
>
> diff --git a/library/string.m b/library/string.m
> index 036f1438a..eb13c4f8f 100644
> --- a/library/string.m
> +++ b/library/string.m
> @@ -3328,6 +3328,29 @@ compare_substrings(Res, X, StartX, Y, StartY, Length) :-
>          fail
>      ).
>
> +:- pragma foreign_proc("C",
> +    unsafe_compare_substrings(Res::uo, X::in, StartX::in, Y::in, StartY::in,
> +        Length::in),
> +    [will_not_call_mercury, promise_pure, thread_safe, will_not_modify_trail,
> +        does_not_affect_liveness, no_sharing],
> +"
> +    int res = memcmp(X + StartX, Y + StartY, Length);
> +    Res = ((res < 0) ? MR_COMPARE_LESS
> +        : (res == 0) ? MR_COMPARE_EQUAL
> +        : MR_COMPARE_GREATER);
> +").
> +:- pragma foreign_proc("C#",
> +    unsafe_compare_substrings(Res::uo, X::in, StartX::in, Y::in, StartY::in,
> +        Length::in),
> +    [will_not_call_mercury, promise_pure, thread_safe, will_not_modify_trail,
> +        does_not_affect_liveness, no_sharing],
> +"
> +    int res = System.String.CompareOrdinal(X, StartX, Y, StartY, Length);
> +    Res = ((res < 0) ? builtin.COMPARE_LESS
> +        : (res == 0) ? builtin.COMPARE_EQUAL
> +        : builtin.COMPARE_GREATER);
> +").
> +
>  unsafe_compare_substrings(Res, X, StartX, Y, StartY, Length) :-
>      unsafe_compare_substrings_loop(X, Y, StartX, StartY, Length, Res).
>
> --
> 2.23.0
>
> _______________________________________________
> reviews mailing list
> reviews at lists.mercurylang.org
> https://lists.mercurylang.org/listinfo/reviews


More information about the reviews mailing list