Skip to content

Commit 7a1758e

Browse files
author
José Valim
committed
Avoid generating accumulator for nested comprehensions
Closes #4013
1 parent afe22a2 commit 7a1758e

File tree

2 files changed

+9
-5
lines changed

2 files changed

+9
-5
lines changed

lib/elixir/src/elixir_for.erl

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ translate(Meta, Args, Return, S) ->
6767
end,
6868

6969
{TCases, SC} = translate_gen(Meta, Cases, [], SI),
70-
{TExpr, SE} = elixir_translator:translate(Expr, SC),
70+
{TExpr, SE} = elixir_translator:translate(wrap_expr(Expr, TInto), SC),
7171
SF = elixir_scope:mergec(SI, SE),
7272

7373
case comprehension_expr(TInto, TExpr) of
@@ -77,6 +77,11 @@ translate(Meta, Args, Return, S) ->
7777
build_into(Ann, TCases, TIntoExpr, TInto, Var, Acc, SF)
7878
end.
7979

80+
%% In case we have no return, we wrap the expression
81+
%% in a block that returns nil.
82+
wrap_expr(Expr, false) -> {'__block__', [], [Expr, nil]};
83+
wrap_expr(Expr, _) -> Expr.
84+
8085
translate_gen(ForMeta, [{'<-', Meta, [Left, Right]}|T], Acc, S) ->
8186
{TLeft, TRight, TFilters, TT, TS} = translate_gen(Meta, Left, Right, T, S),
8287
TAcc = [{enum, Meta, TLeft, TRight, TFilters}|Acc],
@@ -253,10 +258,7 @@ no_var_expr({var, Ann, _}) ->
253258
{var, Ann, '_'}.
254259

255260
build_comprehension(Ann, Clauses, Expr, false) ->
256-
{block, Ann, [
257-
build_comprehension(Ann, Clauses, Expr, {nil, Ann}),
258-
{nil, Ann}
259-
]};
261+
{lc, Ann, Expr, comprehension_clause(Clauses)};
260262
build_comprehension(Ann, Clauses, Expr, Into) ->
261263
{comprehension_kind(Into), Ann, Expr, comprehension_clause(Clauses)}.
262264

lib/elixir/src/elixir_translator.erl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,8 @@ translate_block([], Acc, S) ->
363363
translate_block([H], Acc, S) ->
364364
{TH, TS} = translate(H, S),
365365
translate_block([], [TH|Acc], TS);
366+
translate_block([{'__block__', _Meta, Args}|T], Acc, S) when is_list(Args) ->
367+
translate_block(Args ++ T, Acc, S);
366368
translate_block([{for, Meta, [_|_] = Args}|T], Acc, S) ->
367369
{TH, TS} = elixir_for:translate(Meta, Args, false, S),
368370
translate_block(T, [TH|Acc], TS);

0 commit comments

Comments
 (0)