Packages

otpbp

5.3.0
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
otpbp src otpbp_code.erl
Raw

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.
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).
-compile({inline, [module_changed_on_disk/2]}).
-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.