diff options
author | Hans Bolinder <[email protected]> | 2018-02-26 13:22:49 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2018-02-26 13:22:49 +0100 |
commit | 1c7938bc9539f1c06b5493ced9f265e05a4824af (patch) | |
tree | d40fe6c50d4c5d9e4039b2275b12e830a0b73edb | |
parent | 7914843737e490c49b0918b67a093e68415b3beb (diff) | |
parent | 0018bf63fcce35f6704cff5c34d398b32706fd75 (diff) | |
download | otp-1c7938bc9539f1c06b5493ced9f265e05a4824af.tar.gz otp-1c7938bc9539f1c06b5493ced9f265e05a4824af.tar.bz2 otp-1c7938bc9539f1c06b5493ced9f265e05a4824af.zip |
Merge pull request #1719 from josevalim/jv-faster-dialyzer-md5
dialyzer: Compute MD5s using the .beam file (OTP-14937)
-rw-r--r-- | lib/dialyzer/src/dialyzer_plt.erl | 20 | ||||
-rw-r--r-- | lib/stdlib/src/beam_lib.erl | 3 |
2 files changed, 13 insertions, 10 deletions
diff --git a/lib/dialyzer/src/dialyzer_plt.erl b/lib/dialyzer/src/dialyzer_plt.erl index 95c8b5ebce..2af4534396 100644 --- a/lib/dialyzer/src/dialyzer_plt.erl +++ b/lib/dialyzer/src/dialyzer_plt.erl @@ -531,17 +531,19 @@ compute_md5_from_files(Files) -> lists:keysort(1, [{F, compute_md5_from_file(F)} || F <- Files]). compute_md5_from_file(File) -> - case filelib:is_regular(File) of - false -> + case beam_lib:all_chunks(File) of + {ok, _, Chunks} -> + %% We cannot use beam_lib:md5 because it does not consider + %% the debug_info chunk, where typespecs are likely stored. + %% So we consider almost all chunks except the useless ones. + Filtered = [[ID, Chunk] || {ID, Chunk} <- Chunks, ID =/= "CInf", ID =/= "Docs"], + erlang:md5(lists:sort(Filtered)); + {error, beam_lib, {file_error, _, enoent}} -> Msg = io_lib:format("Not a regular file: ~ts\n", [File]), throw({dialyzer_error, Msg}); - true -> - case dialyzer_utils:get_core_from_beam(File) of - {error, Error} -> - throw({dialyzer_error, Error}); - {ok, Core} -> - erlang:md5(term_to_binary(Core)) - end + {error, beam_lib, _} -> + Msg = io_lib:format("Could not compute MD5 for .beam: ~ts\n", [File]), + throw({dialyzer_error, Msg}) end. init_diff_list(RemoveFiles, AddFiles) -> diff --git a/lib/stdlib/src/beam_lib.erl b/lib/stdlib/src/beam_lib.erl index 06c15fceda..24349c74e8 100644 --- a/lib/stdlib/src/beam_lib.erl +++ b/lib/stdlib/src/beam_lib.erl @@ -148,7 +148,8 @@ chunks(File, Chunks, Options) -> try read_chunk_data(File, Chunks, Options) catch Error -> Error end. --spec all_chunks(beam()) -> {'ok', 'beam_lib', [{chunkid(), dataB()}]}. +-spec all_chunks(beam()) -> + {'ok', 'beam_lib', [{chunkid(), dataB()}]} | {'error', 'beam_lib', info_rsn()}. all_chunks(File) -> read_all_chunks(File). |