From e79d32a8aad40e6ea32a9c1befd82064bb09eae8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Thu, 1 Apr 2021 10:45:15 +0200 Subject: [PATCH] Use persistent term for tokenizer and bootstrap --- lib/elixir/lib/code/identifier.ex | 2 +- lib/elixir/lib/kernel/parallel_compiler.ex | 2 +- lib/elixir/src/elixir.erl | 6 ++---- lib/elixir/src/elixir_aliases.erl | 2 +- lib/elixir/src/elixir_compiler.erl | 3 +-- lib/elixir/src/elixir_config.erl | 8 +++++++- lib/elixir/src/elixir_erl.erl | 2 +- lib/elixir/src/elixir_errors.erl | 2 +- lib/elixir/src/elixir_lexical.erl | 2 +- lib/elixir/src/elixir_locals.erl | 2 +- lib/elixir/src/elixir_module.erl | 6 +++--- lib/elixir/src/elixir_tokenizer.erl | 2 +- 12 files changed, 21 insertions(+), 18 deletions(-) diff --git a/lib/elixir/lib/code/identifier.ex b/lib/elixir/lib/code/identifier.ex index bcd17fc899..fab55a1812 100644 --- a/lib/elixir/lib/code/identifier.ex +++ b/lib/elixir/lib/code/identifier.ex @@ -96,7 +96,7 @@ defmodule Code.Identifier do :alias true -> - case :elixir_config.get(:identifier_tokenizer, String.Tokenizer).tokenize(charlist) do + case :elixir_config.static(:identifier_tokenizer).tokenize(charlist) do {kind, _acc, [], _, _, special} -> if kind == :identifier and not :lists.member(?@, special) do :callable_local diff --git a/lib/elixir/lib/kernel/parallel_compiler.ex b/lib/elixir/lib/kernel/parallel_compiler.ex index aa8600930b..15e87d1bab 100644 --- a/lib/elixir/lib/kernel/parallel_compiler.ex +++ b/lib/elixir/lib/kernel/parallel_compiler.ex @@ -230,7 +230,7 @@ defmodule Kernel.ParallelCompiler do defp maybe_check_modules(result, runtime_modules, state) do %{schedulers: schedulers, profile: profile} = state - if :elixir_config.get(:bootstrap) do + if :elixir_config.static(:bootstrap) do [] else compiled_modules = checker_compiled_modules(result) diff --git a/lib/elixir/src/elixir.erl b/lib/elixir/src/elixir.erl index ccb1d8b37f..345ae4bd62 100644 --- a/lib/elixir/src/elixir.erl +++ b/lib/elixir/src/elixir.erl @@ -55,10 +55,6 @@ start(_Type, _Args) -> {argv, []}, {no_halt, false}, - %% Static options - {bootstrap, false}, - {identifier_tokenizer, Tokenizer}, - %% Compiler options {docs, true}, {ignore_module_conflict, false}, @@ -71,6 +67,8 @@ start(_Type, _Args) -> | URIConfig ], + elixir_config:static(#{bootstrap => false, identifier_tokenizer => Tokenizer}), + Tab = elixir_config:new(Config), case elixir_sup:start_link() of {ok, Sup} -> diff --git a/lib/elixir/src/elixir_aliases.erl b/lib/elixir/src/elixir_aliases.erl index 4f0512376f..f0f3bc3b2f 100644 --- a/lib/elixir/src/elixir_aliases.erl +++ b/lib/elixir/src/elixir_aliases.erl @@ -4,7 +4,7 @@ -include("elixir.hrl"). inspect(Atom) when is_atom(Atom) -> - case elixir_config:get(bootstrap) of + case elixir_config:static(bootstrap) of true -> atom_to_binary(Atom, utf8); false -> 'Elixir.Code.Identifier':inspect_as_atom(Atom) end. diff --git a/lib/elixir/src/elixir_compiler.erl b/lib/elixir/src/elixir_compiler.erl index 64de3685c6..1008daad2d 100644 --- a/lib/elixir/src/elixir_compiler.erl +++ b/lib/elixir/src/elixir_compiler.erl @@ -117,7 +117,7 @@ allows_fast_compilation(_) -> bootstrap() -> {ok, _} = application:ensure_all_started(elixir), - elixir_config:put(bootstrap, true), + elixir_config:static(#{bootstrap => true}), elixir_config:put(docs, false), elixir_config:put(relative_paths, false), elixir_config:put(ignore_module_conflict, true), @@ -125,7 +125,6 @@ bootstrap() -> elixir_config:put(parser_options, []), {Init, Main} = bootstrap_files(), [bootstrap_file(File) || File <- [<<"lib/elixir/lib/kernel.ex">> | Init]], - elixir_config:put(bootstrap, true), elixir_config:put(docs, true), [bootstrap_file(File) || File <- [<<"lib/elixir/lib/kernel.ex">> | Main]]. diff --git a/lib/elixir/src/elixir_config.erl b/lib/elixir/src/elixir_config.erl index 84efa66c9a..a8a37e0747 100644 --- a/lib/elixir/src/elixir_config.erl +++ b/lib/elixir/src/elixir_config.erl @@ -1,9 +1,15 @@ -module(elixir_config). -compile({no_auto_import, [get/1]}). --export([new/1, delete/1, put/2, get/1, get/2, update/2, get_and_put/2, warn/2, serial/1]). +-export([new/1, warn/2, serial/1]). +-export([static/1, delete/1, put/2, get/1, get/2, update/2, get_and_put/2]). -export([start_link/0, init/1, handle_call/3, handle_cast/2]). -behaviour(gen_server). +static(Map) when is_map(Map) -> + persistent_term:put(?MODULE, maps:merge(persistent_term:get(?MODULE, #{}), Map)); +static(Key) when is_atom(Key) -> + maps:get(Key, persistent_term:get(?MODULE)). + get(Key) -> [{_, Value}] = ets:lookup(?MODULE, Key), Value. diff --git a/lib/elixir/src/elixir_erl.erl b/lib/elixir/src/elixir_erl.erl index bd7e47d71e..54d0eb7aca 100644 --- a/lib/elixir/src/elixir_erl.erl +++ b/lib/elixir/src/elixir_erl.erl @@ -117,7 +117,7 @@ spawned_compile(#{module := Module, line := Line} = Map) -> {Set, Bag} = elixir_module:data_tables(Module), TranslatedTypespecs = - case elixir_config:get(bootstrap) andalso + case elixir_config:static(bootstrap) andalso (code:ensure_loaded(?typespecs) /= {module, ?typespecs}) of true -> {[], [], [], [], []}; false -> ?typespecs:translate_typespecs_for_module(Set, Bag) diff --git a/lib/elixir/src/elixir_errors.erl b/lib/elixir/src/elixir_errors.erl index 09d839b8ef..8c9d4d85e6 100644 --- a/lib/elixir/src/elixir_errors.erl +++ b/lib/elixir/src/elixir_errors.erl @@ -41,7 +41,7 @@ form_warn(Meta, File, Module, Desc) when is_list(Meta), is_binary(File) -> form_warn(Meta, #{file => File}, Module, Desc); form_warn(Meta, #{file := File} = E, Module, Desc) when is_list(Meta) -> % Skip warnings during bootstrap, they will be reported during recompilation - case elixir_config:get(bootstrap) of + case elixir_config:static(bootstrap) of true -> ok; false -> do_form_warn(Meta, File, E, Module:format_error(Desc)) end. diff --git a/lib/elixir/src/elixir_lexical.erl b/lib/elixir/src/elixir_lexical.erl index ab41f8e190..a818a04e64 100644 --- a/lib/elixir/src/elixir_lexical.erl +++ b/lib/elixir/src/elixir_lexical.erl @@ -6,7 +6,7 @@ -define(tracker, 'Elixir.Kernel.LexicalTracker'). run(#{tracers := Tracers} = E, ExecutionCallback, AfterExecutionCallback) -> - case elixir_config:get(bootstrap) of + case elixir_config:static(bootstrap) of false -> {ok, Pid} = ?tracker:start_link(), LexEnv = E#{lexical_tracker := Pid, tracers := [?MODULE | Tracers]}, diff --git a/lib/elixir/src/elixir_locals.erl b/lib/elixir/src/elixir_locals.erl index 3a45f25d2b..eeaa5a3214 100644 --- a/lib/elixir/src/elixir_locals.erl +++ b/lib/elixir/src/elixir_locals.erl @@ -16,7 +16,7 @@ setup({DataSet, _DataBag}) -> ets:insert(DataSet, {?cache, 0, nil}), - case elixir_config:get(bootstrap) of + case elixir_config:static(bootstrap) of false -> ets:insert(DataSet, {?locals, true}); true -> ok end, diff --git a/lib/elixir/src/elixir_module.erl b/lib/elixir/src/elixir_module.erl index cd6b1caa1e..e85bd7c54a 100644 --- a/lib/elixir/src/elixir_module.erl +++ b/lib/elixir/src/elixir_module.erl @@ -125,7 +125,7 @@ compile(Line, Module, Block, Vars, E) -> elixir_locals:stop({DataSet, DataBag}), make_readonly(Module), - (not elixir_config:get(bootstrap)) andalso + (not elixir_config:static(bootstrap)) andalso 'Elixir.Module':check_behaviours_and_impls(E, DataSet, DataBag, AllDefinitions), RawCompileOpts = bag_lookup_element(DataBag, {accumulate, compile}, 2), @@ -225,7 +225,7 @@ is_behaviour(DataBag) -> %% exception message suggesting the current module is not loaded. This is %% misleading so use a custom reason. compile_undef(Module, Fun, Arity, Stack) -> - case elixir_config:get(bootstrap) of + case elixir_config:static(bootstrap) of false -> Opts = [{module, Module}, {function, Fun}, {arity, Arity}, {reason, 'function not available'}], @@ -320,7 +320,7 @@ build(Line, File, Module) -> ets:insert(DataBag, [{persisted_attributes, Attr} || Attr <- Persisted]), OnDefinition = - case elixir_config:get(bootstrap) of + case elixir_config:static(bootstrap) of false -> {'Elixir.Module', compile_definition_attributes}; _ -> {elixir_module, delete_definition_attributes} end, diff --git a/lib/elixir/src/elixir_tokenizer.erl b/lib/elixir/src/elixir_tokenizer.erl index d3d61de415..a619ebd13a 100644 --- a/lib/elixir/src/elixir_tokenizer.erl +++ b/lib/elixir/src/elixir_tokenizer.erl @@ -121,7 +121,7 @@ tokenize(String, Line, Column, #elixir_tokenizer{} = Scope) -> tokenize(String, Line, Column, Opts) -> IdentifierTokenizer = - elixir_config:get(identifier_tokenizer, 'Elixir.String.Tokenizer'), + elixir_config:static(identifier_tokenizer), Scope = lists:foldl(fun