summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosé Valim <jose.valim@dashbit.co>2020-04-30 00:53:09 +0200
committerJosé Valim <jose.valim@dashbit.co>2020-04-30 00:53:09 +0200
commitc7742a0c0fd58c9a22b92f3c96acceb20e7355d9 (patch)
treece222dd43a97dc0e7407eb8f43db676a1103099a
parent381bd686249ba21ded89c773d75a432c2a67a075 (diff)
downloadelixir-jv-bootstrap-2.tar.gz
Recompile Kernel before bootstrapping stdlibjv-bootstrap-2
Before this patch, we could have slightly different AST while compiling modules in parallel, depending if modules were recompiled or not. Now we always recompile Kernel before compiling the whole stdlib. We used this opportunity to simplify bootstrap by breaking it two steps. The first step is the minimal necessary to compile Kernel itself. The second step contains the whole compiler. Closes #10000.
-rw-r--r--lib/elixir/lib/code.ex2
-rw-r--r--lib/elixir/src/elixir_compiler.erl89
2 files changed, 50 insertions, 41 deletions
diff --git a/lib/elixir/lib/code.ex b/lib/elixir/lib/code.ex
index c7306a1f0..5973bf5c0 100644
--- a/lib/elixir/lib/code.ex
+++ b/lib/elixir/lib/code.ex
@@ -1308,7 +1308,7 @@ defmodule Code do
@doc since: "1.11.0"
@spec can_await_module_compilation? :: boolean
def can_await_module_compilation? do
- Process.info(self(), :error_handler) == {:error_handler, Kernel.ErrorHandler}
+ :erlang.process_info(self(), :error_handler) == {:error_handler, Kernel.ErrorHandler}
end
@doc false
diff --git a/lib/elixir/src/elixir_compiler.erl b/lib/elixir/src/elixir_compiler.erl
index 7c1ea5c61..df0e7ddbe 100644
--- a/lib/elixir/src/elixir_compiler.erl
+++ b/lib/elixir/src/elixir_compiler.erl
@@ -123,7 +123,11 @@ bootstrap() ->
elixir_config:put(ignore_module_conflict, true),
elixir_config:put(tracers, []),
elixir_config:put(parser_options, []),
- [bootstrap_file(File) || File <- bootstrap_main()].
+ {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]].
bootstrap_file(File) ->
try
@@ -136,45 +140,50 @@ bootstrap_file(File) ->
erlang:halt(1)
end.
-bootstrap_main() ->
- [<<"lib/elixir/lib/kernel.ex">>,
- <<"lib/elixir/lib/macro/env.ex">>,
- <<"lib/elixir/lib/keyword.ex">>,
- <<"lib/elixir/lib/module.ex">>,
- <<"lib/elixir/lib/list.ex">>,
- <<"lib/elixir/lib/macro.ex">>,
- <<"lib/elixir/lib/kernel/typespec.ex">>,
- <<"lib/elixir/lib/code.ex">>,
- <<"lib/elixir/lib/code/identifier.ex">>,
- <<"lib/elixir/lib/module/checker.ex">>,
- <<"lib/elixir/lib/module/locals_tracker.ex">>,
- <<"lib/elixir/lib/module/parallel_checker.ex">>,
- <<"lib/elixir/lib/module/types/helpers.ex">>,
- <<"lib/elixir/lib/module/types/infer.ex">>,
- <<"lib/elixir/lib/module/types/pattern.ex">>,
- <<"lib/elixir/lib/module/types/expr.ex">>,
- <<"lib/elixir/lib/module/types.ex">>,
- <<"lib/elixir/lib/kernel/utils.ex">>,
- <<"lib/elixir/lib/exception.ex">>,
- <<"lib/elixir/lib/protocol.ex">>,
- <<"lib/elixir/lib/stream/reducers.ex">>,
- <<"lib/elixir/lib/enum.ex">>,
- <<"lib/elixir/lib/map.ex">>,
- <<"lib/elixir/lib/inspect/algebra.ex">>,
- <<"lib/elixir/lib/inspect.ex">>,
- <<"lib/elixir/lib/access.ex">>,
- <<"lib/elixir/lib/range.ex">>,
- <<"lib/elixir/lib/regex.ex">>,
- <<"lib/elixir/lib/string.ex">>,
- <<"lib/elixir/lib/string/chars.ex">>,
- <<"lib/elixir/lib/io.ex">>,
- <<"lib/elixir/lib/path.ex">>,
- <<"lib/elixir/lib/file.ex">>,
- <<"lib/elixir/lib/system.ex">>,
- <<"lib/elixir/lib/kernel/cli.ex">>,
- <<"lib/elixir/lib/kernel/error_handler.ex">>,
- <<"lib/elixir/lib/kernel/parallel_compiler.ex">>,
- <<"lib/elixir/lib/kernel/lexical_tracker.ex">>].
+bootstrap_files() ->
+ {
+ [
+ <<"lib/elixir/lib/macro/env.ex">>,
+ <<"lib/elixir/lib/keyword.ex">>,
+ <<"lib/elixir/lib/module.ex">>,
+ <<"lib/elixir/lib/list.ex">>,
+ <<"lib/elixir/lib/macro.ex">>,
+ <<"lib/elixir/lib/kernel/typespec.ex">>,
+ <<"lib/elixir/lib/kernel/utils.ex">>,
+ <<"lib/elixir/lib/code.ex">>,
+ <<"lib/elixir/lib/code/identifier.ex">>,
+ <<"lib/elixir/lib/protocol.ex">>,
+ <<"lib/elixir/lib/stream/reducers.ex">>,
+ <<"lib/elixir/lib/enum.ex">>,
+ <<"lib/elixir/lib/regex.ex">>,
+ <<"lib/elixir/lib/inspect/algebra.ex">>,
+ <<"lib/elixir/lib/inspect.ex">>,
+ <<"lib/elixir/lib/string.ex">>,
+ <<"lib/elixir/lib/string/chars.ex">>
+ ],
+ [
+ <<"lib/elixir/lib/module/checker.ex">>,
+ <<"lib/elixir/lib/module/locals_tracker.ex">>,
+ <<"lib/elixir/lib/module/parallel_checker.ex">>,
+ <<"lib/elixir/lib/module/types/helpers.ex">>,
+ <<"lib/elixir/lib/module/types/infer.ex">>,
+ <<"lib/elixir/lib/module/types/pattern.ex">>,
+ <<"lib/elixir/lib/module/types/expr.ex">>,
+ <<"lib/elixir/lib/module/types.ex">>,
+ <<"lib/elixir/lib/exception.ex">>,
+ <<"lib/elixir/lib/path.ex">>,
+ <<"lib/elixir/lib/file.ex">>,
+ <<"lib/elixir/lib/map.ex">>,
+ <<"lib/elixir/lib/range.ex">>,
+ <<"lib/elixir/lib/access.ex">>,
+ <<"lib/elixir/lib/io.ex">>,
+ <<"lib/elixir/lib/system.ex">>,
+ <<"lib/elixir/lib/kernel/cli.ex">>,
+ <<"lib/elixir/lib/kernel/error_handler.ex">>,
+ <<"lib/elixir/lib/kernel/parallel_compiler.ex">>,
+ <<"lib/elixir/lib/kernel/lexical_tracker.ex">>
+ ]
+ }.
binary_to_path({ModuleName, _ModuleMap, Binary}, CompilePath) ->
Path = filename:join(CompilePath, atom_to_list(ModuleName) ++ ".beam"),