Skip to content

Commit 28367d9

Browse files
author
José Valim
committed
Ensure an after clause is generated only if required
1 parent 126a5a6 commit 28367d9

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

lib/elixir/src/elixir_translator.erl

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,19 @@ translate({'try', Meta, [Clauses]}, RS) when is_list(Clauses) ->
8686
Catch = [Tuple || { X, _ } = Tuple <- Clauses, X == 'rescue' orelse X == 'catch'],
8787
{ TCatch, SC } = elixir_try:clauses(Meta, Catch, mergec(S, SB)),
8888

89-
After = proplists:get_value('after', Clauses, nil),
90-
{ TAfter, SA } = translate(After, mergec(S, SC)),
89+
case lists:keyfind('after', 1, Clauses) of
90+
{ 'after', After } ->
91+
{ TBlock, SA } = translate(After, mergec(S, SC)),
92+
TAfter = unblock(TBlock);
93+
false ->
94+
{ TAfter, SA } = { [], mergec(S, SC) }
95+
end,
9196

9297
Else = elixir_clauses:get_pairs(else, Clauses),
9398
{ TElse, SE } = elixir_clauses:clauses(Meta, Else, mergec(S, SA)),
9499

95100
SF = (mergec(S, SE))#elixir_scope{noname=RS#elixir_scope.noname},
96-
{ { 'try', ?line(Meta), unblock(TDo), TElse, TCatch, unblock(TAfter) }, SF };
101+
{ { 'try', ?line(Meta), unblock(TDo), TElse, TCatch, TAfter }, SF };
97102

98103
%% Receive
99104

lib/elixir/test/erlang/control_test.erl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,3 +291,6 @@ optimized_oror_test() ->
291291
[{atom,0,done}]},
292292
{clause,1,[{var,1,Var}],[],[{var,1,Var}]}]
293293
} = to_erl("is_list([]) || :done").
294+
295+
no_after_in_try_test() ->
296+
{ 'try', _, [_], [_], _, [] } = to_erl("try do :foo.bar() else _ -> :ok end").

0 commit comments

Comments
 (0)