Skip to content

Commit f29e18b

Browse files
committed
Do not precompile regexes on Erlang/OTP 28
1 parent 329442c commit f29e18b

File tree

2 files changed

+18
-12
lines changed

2 files changed

+18
-12
lines changed

Diff for: lib/elixir/lib/kernel.ex

+17-9
Original file line numberDiff line numberDiff line change
@@ -6437,29 +6437,37 @@ defmodule Kernel do
64376437
"""
64386438
defmacro sigil_r(term, modifiers)
64396439

6440-
defmacro sigil_r({:<<>>, _meta, [string]}, options) when is_binary(string) do
6441-
binary = :elixir_interpolation.unescape_string(string, &regex_unescape_map/1)
6442-
regex = Regex.compile!(binary, :binary.list_to_bin(options))
6443-
Macro.escape(regex)
6440+
defmacro sigil_r({:<<>>, _meta, [binary]}, options) when is_binary(binary) do
6441+
binary = :elixir_interpolation.unescape_string(binary, &regex_unescape_map/1)
6442+
compile_regex(binary, options)
64446443
end
64456444

64466445
defmacro sigil_r({:<<>>, meta, pieces}, options) do
6447-
binary = {:<<>>, meta, unescape_tokens(pieces, &regex_unescape_map/1)}
6448-
quote(do: Regex.compile!(unquote(binary), unquote(:binary.list_to_bin(options))))
6446+
tuple = {:<<>>, meta, unescape_tokens(pieces, &regex_unescape_map/1)}
6447+
compile_regex(tuple, options)
64496448
end
64506449

64516450
defp regex_unescape_map(:newline), do: true
64526451
defp regex_unescape_map(_), do: false
64536452

64546453
@doc false
6455-
defmacro sigil_R({:<<>>, _meta, [string]}, options) when is_binary(string) do
6454+
defmacro sigil_R({:<<>>, _meta, [binary]}, options) when is_binary(binary) do
64566455
IO.warn(
64576456
"~R/.../ is deprecated, use ~r/.../ instead",
64586457
Macro.Env.stacktrace(__CALLER__)
64596458
)
64606459

6461-
regex = Regex.compile!(string, :binary.list_to_bin(options))
6462-
Macro.escape(regex)
6460+
compile_regex(binary, options)
6461+
end
6462+
6463+
defp compile_regex(binary_or_tuple, options) do
6464+
case is_binary(binary_or_tuple) and :erlang.system_info(:otp_release) < [?2, ?8] do
6465+
true ->
6466+
Macro.escape(Regex.compile!(binary_or_tuple, :binary.list_to_bin(options)))
6467+
6468+
false ->
6469+
quote(do: Regex.compile!(unquote(binary_or_tuple), unquote(:binary.list_to_bin(options))))
6470+
end
64636471
end
64646472

64656473
@doc ~S"""

Diff for: lib/ex_unit/lib/ex_unit/doc_test.ex

+1-3
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,6 @@ defmodule ExUnit.DocTest do
149149
suite run.
150150
"""
151151

152-
@opaque_type_regex ~r/#[\w\.]+</
153-
154152
defmodule Error do
155153
@moduledoc """
156154
Exception raised when there's an error with the syntax or semantics of a doctest.
@@ -554,7 +552,7 @@ defmodule ExUnit.DocTest do
554552
message = "Doctest did not compile, got: #{ex_message}"
555553

556554
message =
557-
if e.__struct__ == TokenMissingError and expr =~ @opaque_type_regex do
555+
if e.__struct__ == TokenMissingError and expr =~ ~r/#[\w\.]+</ do
558556
message <>
559557
"""
560558
\nIf you are planning to assert on the result of an iex> expression \

0 commit comments

Comments
 (0)