File 4201-Don-t-require-compile-time-features-to-be-enabled-in.patch of Package erlang
From 18807814dbf097faf0b4fb26fa5e13bd6b4bd7bd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Thu, 9 Feb 2023 10:50:36 +0100
Subject: [PATCH] Don't require compile-time features to be enabled in the
runtime
Earlier during development of Erlang/OTP 26 we hard-coded the
`maybe_expr` feature to be always enable in the runtime system.
Remove that hack and no longer require any compile-time feature to be
enabled in the runtime system.
---
erts/preloaded/ebin/erlang.beam | Bin 133156 -> 132772 bytes
erts/preloaded/src/erlang.erl | 29 +++++++++--------------------
erts/test/erlc_SUITE.erl | 15 ++++++---------
lib/stdlib/src/erl_features.erl | 25 +------------------------
4 files changed, 16 insertions(+), 53 deletions(-)
diff --git a/erts/preloaded/src/erlang.erl b/erts/preloaded/src/erlang.erl
index cb32ed8ff2..87ff9624c2 100644
--- a/erts/preloaded/src/erlang.erl
+++ b/erts/preloaded/src/erlang.erl
@@ -2336,26 +2336,15 @@ is_tuple(_Term) ->
| {features_not_allowed, [atom()]}.
load_module(Mod, Code) ->
try
- Allowed =
- case erlang:module_loaded(erl_features) of
- true ->
- erl_features:load_allowed(Code);
- false -> ok
- end,
- case Allowed of
- {not_allowed, NotEnabled} ->
- {error, {features_not_allowed, NotEnabled}};
- ok ->
- case erlang:prepare_loading(Mod, Code) of
- {error,_}=Error ->
- Error;
- Prep when erlang:is_reference(Prep) ->
- case erlang:finish_loading([Prep]) of
- ok ->
- {module,Mod};
- {Error,[Mod]} ->
- {error,Error}
- end
+ case erlang:prepare_loading(Mod, Code) of
+ {error,_}=Error ->
+ Error;
+ Prep when erlang:is_reference(Prep) ->
+ case erlang:finish_loading([Prep]) of
+ ok ->
+ {module,Mod};
+ {Error,[Mod]} ->
+ {error,Error}
end
end
catch
diff --git a/erts/test/erlc_SUITE.erl b/erts/test/erlc_SUITE.erl
index a0417051b7..1149d8816d 100644
--- a/erts/test/erlc_SUITE.erl
+++ b/erts/test/erlc_SUITE.erl
@@ -840,9 +840,9 @@ features_macros(Config) when is_list(Config) ->
true = erpc:call(Node1, erlang, module_loaded, [erl_features]),
- %% We can't load this due to experimental_ftr_1 not being enabled
- %% in the runtime
- {error, {features_not_allowed, [experimental_ftr_1]}} =
+ %% Starting from OTP 26, compile-time features don't need to be
+ %% enabled in the runtime system.
+ {module, f_macros} =
erpc:call(Node1, code, load_file, [f_macros]),
%% Check features enabled during compilation
[approved_ftr_1, approved_ftr_2, experimental_ftr_1] =
@@ -934,8 +934,6 @@ features_all(Config) when is_list(Config) ->
"-disable-feature", "all"]),
%% Check features enabled during compilation
[approved_ftr_2] = erpc:call(Node2, erl_features, used, [foo]),
- {error, {features_not_allowed, [approved_ftr_2]}} =
- erpc:call(Node2, code, load_file, [foo]),
peer:stop(Peer2),
ok.
diff --git a/lib/stdlib/src/erl_features.erl b/lib/stdlib/src/erl_features.erl
index ac2ecd3c37..ffccfcbfb3 100644
--- a/lib/stdlib/src/erl_features.erl
+++ b/lib/stdlib/src/erl_features.erl
@@ -26,7 +26,6 @@
short/1,
long/1,
enabled/0,
- load_allowed/1,
keywords/0,
keywords/1,
keyword_fun/2,
@@ -423,32 +423,6 @@ keywords() ->
set_keywords(Words) ->
persistent_term:put({?MODULE, keywords}, Words).
-%% Check that any features used in the module are enabled in the
-%% runtime system. If not, return
-%% {not_allowed, <list of not enabled features>}.
--spec load_allowed(binary()) -> ok | {not_allowed, [feature()]}.
-load_allowed(Binary) ->
- case erts_internal:beamfile_chunk(Binary, "Meta") of
- undefined ->
- ok;
- Meta ->
- MetaData = erlang:binary_to_term(Meta),
- case proplists:get_value(enabled_features, MetaData) of
- undefined ->
- ok;
- Used ->
- Enabled = enabled(),
- case lists:filter(fun(UFtr) ->
- not lists:member(UFtr, Enabled)
- end,
- Used) of
- [] -> ok;
- NotEnabled ->
- {not_allowed, NotEnabled}
- end
- end
- end.
-
%% Return features used by module or beam file
-spec used(module() | file:filename()) -> [feature()].
used(Module) when is_atom(Module) ->
--
2.35.3