aboutsummaryrefslogtreecommitdiffstats
path: root/lib/tools/src
diff options
context:
space:
mode:
authorJosé Valim <[email protected]>2012-11-28 13:08:35 +0100
committerFredrik Gustafsson <[email protected]>2013-01-25 14:57:00 +0100
commitf3fb48d42329d54b463e7434ff28bb51e4dde4dd (patch)
tree4ccc391d2ae698ea62df1bdffd0847beda29e7c3 /lib/tools/src
parent29231033bfa618e5c4e1c50a5cefba32e02f2708 (diff)
downloadotp-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')
-rw-r--r--lib/tools/src/cover.erl18
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),