Skip to content

Commit

Permalink
Merge branch 'hb/stdlib/epp_file_and_inclusion/OTP-8911' into dev
Browse files Browse the repository at this point in the history
* hb/stdlib/epp_file_and_inclusion/OTP-8911:
  Fix epp bug concerning the file attribute and file inclusion
  • Loading branch information
uabboli committed Oct 29, 2010
2 parents 735dc6c + 4c2b484 commit e3c9aa6
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 16 deletions.
43 changes: 29 additions & 14 deletions lib/stdlib/src/epp.erl
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@
%% Epp state record.
-record(epp, {file, %Current file
location, %Current location
delta, %Offset from Location (-file)
name="", %Current file name
name2="", %-"-, modified by -file
istk=[], %Ifdef stack
sstk=[], %State stack
path=[], %Include-path
Expand Down Expand Up @@ -234,8 +236,8 @@ init_server(Pid, Name, File, AtLocation, Path, Pdm, Pre) ->
case user_predef(Pdm, Ms0) of
{ok,Ms1} ->
epp_reply(Pid, {ok,self()}),
St = #epp{file=File, location=AtLocation, name=Name,
path=Path, macs=Ms1, pre_opened = Pre},
St = #epp{file=File, location=AtLocation, delta=0, name=Name,
name2=Name, path=Path, macs=Ms1, pre_opened = Pre},
From = wait_request(St),
enter_file_reply(From, Name, AtLocation, AtLocation),
wait_req_scan(St);
Expand Down Expand Up @@ -358,8 +360,8 @@ enter_file2(NewF, Pname, From, St, AtLocation, ExtraPath) ->
enter_file_reply(From, Pname, Loc, AtLocation),
Ms = dict:store({atom,'FILE'}, {none,[{string,Loc,Pname}]}, St#epp.macs),
Path = St#epp.path ++ ExtraPath,
#epp{location=Loc,file=NewF,
name=Pname,sstk=[St|St#epp.sstk],path=Path,macs=Ms}.
#epp{file=NewF,location=Loc,name=Pname,delta=0,
sstk=[St|St#epp.sstk],path=Path,macs=Ms}.

enter_file_reply(From, Name, Location, AtLocation) ->
Attr = loc_attr(AtLocation),
Expand Down Expand Up @@ -391,14 +393,23 @@ leave_file(From, St) ->
case St#epp.sstk of
[OldSt|Sts] ->
close_file(St),
enter_file_reply(From, OldSt#epp.name,
OldSt#epp.location, OldSt#epp.location),
#epp{location=OldLoc, delta=Delta, name=OldName,
name2=OldName2} = OldSt,
CurrLoc = add_line(OldLoc, Delta),
Ms = dict:store({atom,'FILE'},
{none,
[{string,OldSt#epp.location,
OldSt#epp.name}]},
{none,[{string,CurrLoc,OldName2}]},
St#epp.macs),
wait_req_scan(OldSt#epp{sstk=Sts,macs=Ms});
NextSt = OldSt#epp{sstk=Sts,macs=Ms},
enter_file_reply(From, OldName, CurrLoc, CurrLoc),
case OldName2 =:= OldName of
true ->
From;
false ->
NFrom = wait_request(NextSt),
enter_file_reply(NFrom, OldName2, OldLoc,
neg_line(CurrLoc))
end,
wait_req_scan(NextSt);
[] ->
epp_reply(From, {eof,St#epp.location}),
wait_req_scan(St)
Expand Down Expand Up @@ -768,7 +779,8 @@ scan_file([{'(',_Llp},{string,_Ls,Name},{',',_Lc},{integer,_Li,Ln},{')',_Lrp},
Ms = dict:store({atom,'FILE'}, {none,[{string,1,Name}]}, St#epp.macs),
Locf = loc(Tf),
NewLoc = new_location(Ln, St#epp.location, Locf),
wait_req_scan(St#epp{name=Name,location=NewLoc,macs=Ms});
Delta = abs(get_line(element(2, Tf)))-Ln + St#epp.delta,
wait_req_scan(St#epp{name2=Name,location=NewLoc,delta=Delta,macs=Ms});
scan_file(_Toks, Tf, From, St) ->
epp_reply(From, {error,{loc(Tf),epp,{bad,file}}}),
wait_req_scan(St).
Expand Down Expand Up @@ -1132,6 +1144,9 @@ neg_line(L) ->
abs_line(L) ->
erl_scan:set_attribute(line, L, fun(Line) -> abs(Line) end).

add_line(L, Offset) ->
erl_scan:set_attribute(line, L, fun(Line) -> Line+Offset end).

start_loc(Line) when is_integer(Line) ->
1;
start_loc({_Line, _Column}) ->
Expand Down Expand Up @@ -1191,10 +1206,10 @@ interpret_file_attr([{attribute,Loc,file,{File,Line}}=Form | Forms],
%% -include or -include_lib
% true = L =:= Line,
case Fs of
[_, Delta1, File | Fs1] -> % end of included file
[Form | interpret_file_attr(Forms, Delta1, [File | Fs1])];
[_, File | Fs1] -> % end of included file
[Form | interpret_file_attr(Forms, 0, [File | Fs1])];
_ -> % start of included file
[Form | interpret_file_attr(Forms, 0, [File, Delta | Fs])]
[Form | interpret_file_attr(Forms, 0, [File | Fs])]
end
end;
interpret_file_attr([Form0 | Forms], Delta, Fs) ->
Expand Down
38 changes: 36 additions & 2 deletions lib/stdlib/test/epp_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
variable/1, variable_1/1, otp_4870/1, otp_4871/1, otp_5362/1,
pmod/1, not_circular/1, skip_header/1, otp_6277/1, otp_7702/1,
otp_8130/1, overload_mac/1, otp_8388/1, otp_8470/1, otp_8503/1,
otp_8562/1, otp_8665/1]).
otp_8562/1, otp_8665/1, otp_8911/1]).

-export([epp_parse_erl_form/2]).

Expand Down Expand Up @@ -64,7 +64,7 @@ all(doc) ->
all(suite) ->
[rec_1, upcase_mac, predef_mac, variable, otp_4870, otp_4871, otp_5362,
pmod, not_circular, skip_header, otp_6277, otp_7702, otp_8130,
overload_mac, otp_8388, otp_8470, otp_8503, otp_8562, otp_8665].
overload_mac, otp_8388, otp_8470, otp_8503, otp_8562, otp_8665, otp_8911].

rec_1(doc) ->
["Recursive macros hang or crash epp (OTP-1398)."];
Expand Down Expand Up @@ -1197,6 +1197,40 @@ otp_8562(Config) when is_list(Config) ->
?line [] = compile(Config, Cs),
ok.

otp_8911(doc) ->
["OTP-8911. -file and file inclusion bug"];
otp_8911(suite) ->
[];
otp_8911(Config) when is_list(Config) ->
?line {ok, CWD} = file:get_cwd(),
?line ok = file:set_cwd(?config(priv_dir, Config)),

File = "i.erl",
Cont = <<"-module(i).
-compile(export_all).
-file(\"fil1\", 100).
-include(\"i1.erl\").
t() ->
a.
">>,
?line ok = file:write_file(File, Cont),
Incl = <<"-file(\"fil2\", 35).
t1() ->
b.
">>,
File1 = "i1.erl",
?line ok = file:write_file(File1, Incl),

?line {ok, i} = cover:compile(File),
?line a = i:t(),
?line {ok,[{{i,6},1}]} = cover:analyse(i, calls, line),
?line cover:stop(),

file:delete(File),
file:delete(File1),
?line file:set_cwd(CWD),
ok.

otp_8665(doc) ->
["OTP-8665. Bugfix premature end."];
otp_8665(suite) ->
Expand Down

0 comments on commit e3c9aa6

Please sign in to comment.