Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:24
erlang
0174-Correct-code-module_status-1-for-BEAM-file...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0174-Correct-code-module_status-1-for-BEAM-files-in-archi.patch of Package erlang
From 0fe4106fbcc924f245ac8afb69db1625ebbb6ebe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org> Date: Tue, 22 Mar 2022 06:46:17 +0100 Subject: [PATCH] Correct `code:module_status/1` for BEAM files in archives `code:module_status/1` would always return `modified` for BEAM file loaded from an archive file. Closes #5801 --- lib/kernel/src/code.erl | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/lib/kernel/src/code.erl b/lib/kernel/src/code.erl index 71a570fa7b..b45b55768a 100644 --- a/lib/kernel/src/code.erl +++ b/lib/kernel/src/code.erl @@ -1048,20 +1048,20 @@ module_status(Module) -> %% Note that we don't want to go via which/1, since it doesn't look at the %% disk contents at all if the module is already loaded. module_status(Module, PathFiles) -> - case code:is_loaded(Module) of + case is_loaded(Module) of false -> not_loaded; {file, preloaded} -> loaded; {file, cover_compiled} -> - %% cover compilation loads directly to memory and does not - %% create a beam file, so report 'modified' if a file exists + %% Cover compilation loads directly to memory and does not + %% create a beam file, so report 'modified' if a file exists. case which(Module, PathFiles) of non_existing -> removed; _File -> modified end; {file, []} -> loaded; % no beam file - generated code - {file, OldFile} when is_list(OldFile) -> - %% we don't care whether or not the file is in the same location - %% as when last loaded, as long as it can be found in the path + {file, [_|_]} -> + %% We don't care whether or not the file is in the same location + %% as when last loaded, as long as it can be found in the path. case which(Module, PathFiles) of non_existing -> removed; Path -> @@ -1076,10 +1076,24 @@ module_status(Module, PathFiles) -> %% be reloaded; does not care about file timestamps or compilation time module_changed_on_disk(Module, Path) -> MD5 = erlang:get_module_info(Module, md5), - MD5 =/= beam_file_md5(Path). + MD5 =/= beam_file_md5(Module, Path). + +beam_file_md5(Module, Path) -> + case do_beam_file_md5(Path) of + MD5 when is_binary(MD5) -> + MD5; + undefined -> + %% This module is probably embedded in an archive. + case get_object_code(Module) of + {Module, Code, _Path} -> + do_beam_file_md5(Code); + error -> + undefined + end + end. -beam_file_md5(Path) -> - case beam_lib:md5(Path) of +do_beam_file_md5(PathOrCode) -> + case beam_lib:md5(PathOrCode) of {ok,{_Mod,MD5}} -> MD5; _ -> undefined end. -- 2.34.1
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor