Recompile regexes when escaped from module attributes #14381
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Elixir has historically relied on a behaviour that, when regexes were compiled, its native parts were compiled to a binary. Erlang/OTP 28 changes this and emits a reference, which means they can no longer be inlined at compile-time. In other words, you can no longer define a regex in a module body and store it in a module attribute or escape it inside a function.
In order to avoid breakage, we are adding a special case to module attributes that recompiles injected regexes, however, we are also attaching a deprecation to it. We could theoretically fix this generally by introducing some sort of
Macro.Escape
protocol, which we could be used by projects like Explorer and similar, but I think keeping a distinction between those would be important. For example, similar issues would happen when transferring those data types between nodes.This patch should be backported to v1.18 however, when backporting, I would remove the deprecation notice.