Packages
otpbp
5.6.1
7.18.0
7.16.1
7.15.0
7.14.0
7.13.0
7.12.0
7.11.0
7.10.2
7.9.3
7.9.2
7.9.1
7.8.7
7.8.6
7.8.5
7.8.4
7.7.1
7.7.0
7.6.3
7.6.2
7.6.1
7.6.0
7.5.1
7.5.0
7.4.0
7.3.4
7.3.3
7.3.2
7.3.1
7.3.0
7.2.0
7.1.1
7.1.0
7.0.4
7.0.3
7.0.2
7.0.1
6.26.0
6.25.0
6.24.0
6.23.0
6.22.2
6.21.3
6.21.2
6.21.1
6.20.2
6.19.1
6.19.0
6.18.3
6.18.2
6.18.1
6.18.0
6.17.1
6.17.0
6.16.0
6.15.4
6.15.3
6.15.2
6.15.1
6.15.0
6.14.0
6.13.5
6.13.4
6.13.3
6.13.2
6.13.1
6.13.0
6.12.0
6.11.2
6.11.1
6.10.0
6.9.2
6.9.1
6.9.0
6.8.0
6.7.1
6.7.0
6.6.4
6.6.3
6.6.2
6.6.1
6.6.0
6.5.0
6.4.0
6.3.3
6.3.2
6.3.1
6.3.0
6.2.1
6.2.0
6.1.0
6.0.0
5.39.0
5.38.0
5.37.0
5.36.0
5.35.2
5.34.3
5.34.2
5.34.1
5.33.1
5.32.1
5.32.0
5.31.3
5.31.2
5.31.1
5.31.0
5.30.1
5.30.0
5.29.0
5.28.4
5.28.3
5.28.2
5.28.1
5.28.0
5.27.0
5.26.5
5.26.4
5.26.3
5.26.2
5.26.1
5.26.0
5.25.0
5.24.2
5.24.1
5.23.0
5.22.2
5.22.1
5.22.0
5.21.0
5.20.1
5.20.0
5.19.4
5.19.3
5.19.2
5.19.1
5.19.0
5.18.0
5.17.0
5.16.3
5.16.1
5.16.0
5.15.1
5.15.0
5.14.0
5.13.1
5.13.0
5.12.1
5.12.0
5.11.2
5.11.1
5.10.1
5.10.0
5.9.0
5.8.0
5.7.0
5.6.1
5.6.0
5.5.0
5.4.2
5.4.1
5.4.0
5.3.0
5.2.2
5.2.1
5.2.0
5.1.2
5.1.1
4.79.0
4.78.0
4.77.0
4.76.2
4.75.3
4.75.2
4.75.1
4.74.0
4.73.1
4.73.0
4.72.3
4.72.2
4.72.1
4.72.0
4.71.1
4.71.0
4.70.0
4.69.4
4.69.3
4.69.2
4.69.1
4.69.0
4.68.0
4.67.5
4.67.4
4.67.3
4.67.2
4.67.0
4.66.0
4.65.2
4.65.1
4.64.0
4.63.2
4.63.1
4.63.0
4.62.0
4.61.1
4.61.0
4.60.4
4.60.3
4.60.2
4.60.1
4.60.0
4.59.0
4.58.0
4.57.2
4.57.1
4.57.0
4.56.2
4.56.1
4.56.0
4.55.0
4.54.0
4.53.0
4.52.1
4.52.0
4.51.3
4.51.2
4.51.0
4.50.0
4.49.3
4.49.2
OTP backports
Current section
Files
Jump to
Current section
Files
src/otpbp_code.erl
-module(otpbp_code).
-ifndef(HAVE_code__module_status_1).
% OTP 20.0
-export([module_status/1]).
-ifndef(HAVE_code__modified_modules_0).
% OTP 20.0
-export([modified_modules/0]).
-endif.
-endif.
-ifndef(HAVE_code__all_available_0).
% OTP 23.0
-export([all_available/0]).
-endif.
-ifndef(HAVE_code__is_module_native_1).
% OTP < 26.0
-export([is_module_native/1]).
-endif.
-ifndef(HAVE_code__rehash_0).
% OTP < 26.0
-export([rehash/0]).
-endif.
-ifndef(HAVE_code__module_status_1).
module_status(Module) -> module_status(Module, code:get_path()).
module_status(Module, PathFiles) ->
case code:is_loaded(Module) of
false -> not_loaded;
{file, Loaded} when Loaded =:= preloaded; Loaded =:= [] -> loaded;
{file, Loaded} when Loaded =:= cover_compiled; is_list(Loaded) ->
case where_is_file(PathFiles, atom_to_list(Module) ++ code:objfile_extension()) of
non_existing -> removed;
Path -> case Loaded =:= cover_compiled orelse module_changed_on_disk(Module, Path) of
true -> modified;
false -> loaded
end
end
end.
where_is_file([], _) -> non_existing;
where_is_file([{D, Files}|T], File) -> where_is_file(T, File, D, Files);
where_is_file([D|T], File) ->
case erl_prim_loader:list_dir(D) of
{ok, Files} -> where_is_file(T, File, D, Files);
_Error -> where_is_file(T, File)
end.
where_is_file(T, File, D, Files) ->
case lists:member(File, Files) of
true -> filename:append(D, File);
_false -> where_is_file(T, File)
end.
-compile({inline, [module_changed_on_disk/2]}).
module_changed_on_disk(Module, Path) ->
Arch = erlang:system_info(hipe_architecture),
case Arch =/= undefined andalso code:is_module_native(Module) of
true -> try beam_lib:chunks(Path, [hipe_unified_loader:chunk_name(Arch)]) of
{ok, {_, [{_, NativeCode}]}} when is_binary(NativeCode) -> erlang:md5(NativeCode)
catch
_:_ -> undefined
end;
_false -> case beam_lib:md5(Path) of
{ok, {_, MD5}} -> MD5;
_ -> undefined
end
end =/= erlang:get_module_info(Module, md5).
-ifndef(HAVE_code__modified_modules_0).
modified_modules() ->
PathFiles = lists:foldr(fun(Path, A) ->
case erl_prim_loader:list_dir(Path) of
{ok, Files} -> [{Path, Files}|A];
_ -> A
end
end, [], code:get_path()),
[M || {M, _} <- code:all_loaded(), module_status(M, PathFiles) =:= modified].
-endif.
-endif.
-ifndef(HAVE_code__all_available_0).
all_available() ->
all_available(case code:get_mode() of
interactive -> code:get_path();
embedded -> []
end,
#{}).
all_available([Path|Tail], Acc) ->
all_available(Tail,
case erl_prim_loader:list_dir(Path) of
{ok, Files} -> all_available(Path, Files, Acc);
_Error -> Acc
end);
all_available([], AllModules) ->
lists:umerge(fun comp_modules/2,
lists:sort(fun comp_modules/2, [{atom_to_list(M), Path, true} || {M, Path} <- code:all_loaded()]),
lists:sort(fun comp_modules/2,
maps:fold(fun(File, Path, Acc) ->
[{filename:rootname(File), filename:append(Path, File), false}|Acc]
end, [], AllModules))).
all_available(Path, [File|T], Acc) ->
all_available(Path, T,
case filename:extension(File) =/= ".beam" orelse maps:is_key(File, Acc) of
true -> Acc;
false -> Acc#{File => Path}
end);
all_available(_Path, [], Acc) -> Acc.
comp_modules({A, _, _}, {B, _, _}) -> comp_modules(A, B);
comp_modules(A, B) -> A =< B.
-endif.
-ifndef(HAVE_code__is_module_native_1).
is_module_native(Module) when is_atom(Module) ->
case code:is_loaded(Module) of
{file, _} -> false;
false -> undefined
end;
is_module_native(Module) -> error(badarg, [Module]).
-endif.
-ifndef(HAVE_code__rehash_0).
rehash() -> error_logger:warning_report("The code path cache functionality has been removed").
-endif.