[m-rev.] for review: Avoid garbage in Mercury versions of string.append_list/join_list.

Mark Brown mark at mercurylang.org
Thu Nov 7 21:01:54 AEDT 2019


This looks fine.

On Thu, Nov 7, 2019 at 3:22 PM Peter Wang <novalazy at gmail.com> wrote:
>
> library/string.m:
>     Use unsafe_append_string_pieces in Mercury implementations of
>     append_list and join_list. This has no practical effect as we have
>     foreign code implementations of both, for all target languages.
> ---
>  library/string.m | 38 ++++++++++++++++++++++----------------
>  1 file changed, 22 insertions(+), 16 deletions(-)
>
> diff --git a/library/string.m b/library/string.m
> index 149047677..c861238ea 100644
> --- a/library/string.m
> +++ b/library/string.m
> @@ -3799,7 +3799,7 @@ S1 ++ S2 = append(S1, S2).
>  %---------------------%
>  %
>  % We implement append_list in foreign code as the Mercury version
> -% creates significant amounts of unnecessary garbage.
> +% creates some unnecessary garbage.
>  %
>
>  :- pragma foreign_proc("C",
> @@ -3865,21 +3865,21 @@ S1 ++ S2 = append(S1, S2).
>      Str = list_to_binary(Strs)
>  ").
>
> -append_list(Strs::in) = (Str::uo) :-
> -    (
> -        Strs = [X | Xs],
> -        Str = X ++ append_list(Xs)
> -    ;
> -        Strs = [],
> -        Str = ""
> -    ).
> +append_list(Strs) = Str :-
> +    append_list(Strs, Str).
> +
> +append_list(Strs, Str) :-
> +    Pieces = map(make_string_piece, Strs),
> +    unsafe_append_string_pieces(Pieces, Str).
> +
> +:- func make_string_piece(string) = string_piece.
>
> -append_list(Lists, append_list(Lists)).
> +make_string_piece(S) = substring(S, 0, length(S)).
>
>  %---------------------%
>  %
>  % We implement join_list in foreign code as the Mercury version
> -% creates significant amounts of unnecessary garbage.
> +% creates some unnecessary garbage.
>  %
>
>  :- pragma foreign_proc("C",
> @@ -3968,13 +3968,19 @@ append_list(Lists, append_list(Lists)).
>      Str = sb.toString();
>  ").
>
> -join_list(_, []) = "".
> -join_list(Sep, [H | T]) = H ++ join_list_loop(Sep, T).
> +join_list(_Sep, []) = "".
> +join_list(Sep, [H | T]) = Str :-
> +    join_list_loop(make_string_piece(Sep), T, TailPieces),
> +    Pieces = [make_string_piece(H) | TailPieces],
> +    unsafe_append_string_pieces(Pieces, Str).
>
> -:- func join_list_loop(string::in, list(string)::in) = (string::uo) is det.
> +:- pred join_list_loop(string_piece::in, list(string)::in,
> +    list(string_piece)::out) is det.
>
> -join_list_loop(_, []) = "".
> -join_list_loop(Sep, [H | T]) = Sep ++ H ++ join_list_loop(Sep, T).
> +join_list_loop(_Sep, [], []).
> +join_list_loop(Sep, [H | T], Pieces) :-
> +    join_list_loop(Sep, T, TailPieces),
> +    Pieces = [Sep, make_string_piece(H) | TailPieces].
>
>  %---------------------------------------------------------------------------%
>  %
> --
> 2.23.0
>
> _______________________________________________
> reviews mailing list
> reviews at lists.mercurylang.org
> https://lists.mercurylang.org/listinfo/reviews


More information about the reviews mailing list