diff options
author | Björn Gustavsson <[email protected]> | 2016-01-25 15:56:59 +0100 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2016-01-28 12:16:01 +0100 |
commit | 28f7a47ab4d533cc72090484eb3a7e5713fa58bc (patch) | |
tree | 29453b347691a04899a30d3b1888c6edd3c0f37c | |
parent | 1ddab9c7b66237ea6dd429fb75e4c81247d88920 (diff) | |
download | otp-28f7a47ab4d533cc72090484eb3a7e5713fa58bc.tar.gz otp-28f7a47ab4d533cc72090484eb3a7e5713fa58bc.tar.bz2 otp-28f7a47ab4d533cc72090484eb3a7e5713fa58bc.zip |
code: Correct the types for error returns
The specifications for functions that load code in the 'code'
module (e.g. code:load_file/1) have some problems:
* The specs claim that the functions can return {error,on_load}, but
they never do. However, they can return {error,on_load_failure} if
the -on_load function in a module fails.
* The specs claim that the functions can return {error,native_code},
but they never do.
While we are it, also extend the on_load_errors/1 test case to test
that the load functions return {error,on_load_failure} when an
-on_load function fails.
-rw-r--r-- | lib/kernel/src/code.erl | 5 | ||||
-rw-r--r-- | lib/kernel/test/code_SUITE.erl | 11 | ||||
-rw-r--r-- | lib/kernel/test/code_SUITE_data/on_load_errors/simple_on_load_error.erl | 5 |
3 files changed, 18 insertions, 3 deletions
diff --git a/lib/kernel/src/code.erl b/lib/kernel/src/code.erl index 7d0102d4ef..7237550786 100644 --- a/lib/kernel/src/code.erl +++ b/lib/kernel/src/code.erl @@ -77,10 +77,9 @@ %%---------------------------------------------------------------------------- -type load_error_rsn() :: 'badfile' - | 'native_code' | 'nofile' | 'not_purged' - | 'on_load' + | 'on_load_failure' | 'sticky_directory'. -type load_ret() :: {'error', What :: load_error_rsn()} | {'module', Module :: module()}. @@ -135,7 +134,7 @@ load_file(Mod) when is_atom(Mod) -> -spec ensure_loaded(Module) -> {module, Module} | {error, What} when Module :: module(), - What :: embedded | badfile | native_code | nofile | on_load. + What :: embedded | badfile | nofile | on_load_failure. ensure_loaded(Mod) when is_atom(Mod) -> call({ensure_loaded,Mod}). diff --git a/lib/kernel/test/code_SUITE.erl b/lib/kernel/test/code_SUITE.erl index 8f97b6c6f8..2b77ec8972 100644 --- a/lib/kernel/test/code_SUITE.erl +++ b/lib/kernel/test/code_SUITE.erl @@ -1600,6 +1600,17 @@ on_load_errors(Config) when is_list(Config) -> ok end, + %% Make sure that the code loading functions return the correct + %% error code. + Simple = simple_on_load_error, + SimpleList = atom_to_list(Simple), + {error,on_load_failure} = code:load_file(Simple), + {error,on_load_failure} = code:ensure_loaded(Simple), + {ok,SimpleCode} = file:read_file("simple_on_load_error.beam"), + {error,on_load_failure} = code:load_binary(Simple, "", SimpleCode), + {error,on_load_failure} = code:load_abs(SimpleList), + {error,on_load_failure} = code:load_abs(SimpleList, Simple), + ok. do_on_load_error(ReturnValue) -> diff --git a/lib/kernel/test/code_SUITE_data/on_load_errors/simple_on_load_error.erl b/lib/kernel/test/code_SUITE_data/on_load_errors/simple_on_load_error.erl new file mode 100644 index 0000000000..603c282257 --- /dev/null +++ b/lib/kernel/test/code_SUITE_data/on_load_errors/simple_on_load_error.erl @@ -0,0 +1,5 @@ +-module(simple_on_load_error). +-on_load(on_load/0). + +on_load() -> + nope. |