diff options
author | José Valim <[email protected]> | 2012-11-28 13:08:35 +0100 |
---|---|---|
committer | Fredrik Gustafsson <[email protected]> | 2013-01-25 14:57:00 +0100 |
commit | f3fb48d42329d54b463e7434ff28bb51e4dde4dd (patch) | |
tree | 4ccc391d2ae698ea62df1bdffd0847beda29e7c3 /lib/tools/src/cover.erl | |
parent | 29231033bfa618e5c4e1c50a5cefba32e02f2708 (diff) | |
download | otp-f3fb48d42329d54b463e7434ff28bb51e4dde4dd.tar.gz otp-f3fb48d42329d54b463e7434ff28bb51e4dde4dd.tar.bz2 otp-f3fb48d42329d54b463e7434ff28bb51e4dde4dd.zip |
Ensure cover keeps the proper file source
Whenever a module is compiled via compile:forms/2,
the source is set to current directory unless a source
option is passed to compile. This commit ensures that
cover passes the source information to compile:forms/2
to ensure the source won't be modified after the module
is cover compiled.
Diffstat (limited to 'lib/tools/src/cover.erl')
-rw-r--r-- | lib/tools/src/cover.erl | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/lib/tools/src/cover.erl b/lib/tools/src/cover.erl index d7c736b710..3cf42662f8 100644 --- a/lib/tools/src/cover.erl +++ b/lib/tools/src/cover.erl @@ -1372,10 +1372,15 @@ do_compile_beam(Module,Beam,UserOptions) -> Forms0 = epp:interpret_file_attribute(Code), {Forms,Vars} = transform(Vsn, Forms0, Module, Beam), + %% We need to recover the source from the compilation + %% info otherwise the newly compiled module will have + %% source pointing to the current directory + SourceInfo = get_source_info(Module, Beam), + %% Compile and load the result %% It's necessary to check the result of loading since it may %% fail, for example if Module resides in a sticky directory - {ok, Module, Binary} = compile:forms(Forms, UserOptions), + {ok, Module, Binary} = compile:forms(Forms, SourceInfo ++ UserOptions), case code:load_binary(Module, ?TAG, Binary) of {module, Module} -> @@ -1403,6 +1408,17 @@ get_abstract_code(Module, Beam) -> Error -> Error end. +get_source_info(Module, Beam) -> + case beam_lib:chunks(Beam, [compile_info]) of + {ok, {Module, [{compile_info, Compile}]}} -> + case lists:keyfind(source, 1, Compile) of + { source, _ } = Tuple -> [Tuple]; + false -> [] + end; + _ -> + [] + end. + transform(Vsn, Code, Module, Beam) when Vsn=:=abstract_v1; Vsn=:=abstract_v2 -> Vars0 = #vars{module=Module, vsn=Vsn}, MainFile=find_main_filename(Code), |