diff options
-rw-r--r-- | lib/elixir/lib/string.ex | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/lib/elixir/lib/string.ex b/lib/elixir/lib/string.ex index 007fcd33b..428bb05c3 100644 --- a/lib/elixir/lib/string.ex +++ b/lib/elixir/lib/string.ex @@ -1933,23 +1933,24 @@ defmodule String do """ @spec ends_with?(t, t | [t]) :: boolean - def ends_with?(string, suffixes) when is_binary(string) and is_list(suffixes) do - Enum.any?(suffixes, &do_ends_with(string, &1)) + def ends_with?(string, suffix) when is_binary(string) and is_binary(suffix) do + ends_with_string?(string, byte_size(string), suffix) end - def ends_with?(string, suffix) when is_binary(string) do - do_ends_with(string, suffix) - end - - defp do_ends_with(_string, "") do - true + def ends_with?(string, suffix) when is_binary(string) and is_list(suffix) do + string_size = byte_size(string) + Enum.any?(suffix, &ends_with_string?(string, string_size, &1)) end - defp do_ends_with(string, suffix) when is_binary(suffix) do - string_size = byte_size(string) + @compile {:inline, ends_with_string?: 3} + defp ends_with_string?(string, string_size, suffix) when is_binary(suffix) do suffix_size = byte_size(suffix) - scope = {string_size - suffix_size, suffix_size} - suffix_size <= string_size and :nomatch != :binary.match(string, suffix, scope: scope) + + if suffix_size <= string_size do + suffix == binary_part(string, string_size - suffix_size, suffix_size) + else + false + end end @doc """ |