From a29330f69c8550befb63d56530c97c74f7f4eead Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Sun, 16 Dec 2018 12:48:00 +0100 Subject: [PATCH 1/2] No longer wrap expression in binary as Erlang/OTP 20+ does it by default --- lib/elixir/src/elixir_erl_for.erl | 24 +++++++----------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/lib/elixir/src/elixir_erl_for.erl b/lib/elixir/src/elixir_erl_for.erl index 8c044a764eb..cb876ac1971 100644 --- a/lib/elixir/src/elixir_erl_for.erl +++ b/lib/elixir/src/elixir_erl_for.erl @@ -19,11 +19,9 @@ translate(Meta, Args, Return, S) -> {TExpr, SE} = elixir_erl_pass:translate(wrap_expr(Expr, TInto), SC), SF = elixir_erl_var:mergec(SI, SE), - case comprehension_expr(TInto, TExpr) of - {inline, TIntoExpr} -> - build_inline(Ann, TCases, TIntoExpr, TInto, TUniq, SF); - {into, TIntoExpr} -> - build_into(Ann, TCases, TIntoExpr, TInto, TUniq, SF) + case inline_or_into(TInto, TExpr) of + inline -> build_inline(Ann, TCases, TExpr, TInto, TUniq, SF); + into -> build_into(Ann, TCases, TExpr, TInto, TUniq, SF) end. %% In case we have no return, we wrap the expression @@ -88,7 +86,6 @@ collect_filters([H | T], Acc) -> collect_filters([], Acc) -> {Acc, []}. - build_inline(Ann, Clauses, Expr, Into, Uniq, S) -> case not Uniq and lists:all(fun(Clause) -> element(1, Clause) == bin end, Clauses) of true -> {build_comprehension(Ann, Clauses, Expr, Into), S}; @@ -313,17 +310,10 @@ comprehension_kind({bin, _, []}) -> bc. comprehension_generator(enum) -> generate; comprehension_generator(bin) -> b_generate. -comprehension_expr({bin, _, []}, {bin, _, _} = Expr) -> - {inline, Expr}; -comprehension_expr({bin, Ann, []}, Expr) -> - BinExpr = {bin, Ann, [{bin_element, Ann, Expr, default, [bitstring]}]}, - {inline, BinExpr}; -comprehension_expr({nil, _}, Expr) -> - {inline, Expr}; -comprehension_expr(false, Expr) -> - {inline, Expr}; -comprehension_expr(_, Expr) -> - {into, Expr}. +inline_or_into({bin, _, []}) -> inline; +inline_or_into({nil, _}) -> inline; +inline_or_into(false) -> inline; +inline_or_into(_) -> into. comprehension_filter(Ann, Filters) -> [join_filter(Ann, Filter, {atom, Ann, true}, {atom, Ann, false}) || From 72729ec856007f1c8b45dbc4d4fc1f53a3fcd854 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Sun, 16 Dec 2018 13:35:40 +0100 Subject: [PATCH 2/2] fixup! --- lib/elixir/src/elixir_erl_for.erl | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/elixir/src/elixir_erl_for.erl b/lib/elixir/src/elixir_erl_for.erl index cb876ac1971..3e7ae73fd42 100644 --- a/lib/elixir/src/elixir_erl_for.erl +++ b/lib/elixir/src/elixir_erl_for.erl @@ -19,7 +19,7 @@ translate(Meta, Args, Return, S) -> {TExpr, SE} = elixir_erl_pass:translate(wrap_expr(Expr, TInto), SC), SF = elixir_erl_var:mergec(SI, SE), - case inline_or_into(TInto, TExpr) of + case inline_or_into(TInto) of inline -> build_inline(Ann, TCases, TExpr, TInto, TUniq, SF); into -> build_into(Ann, TCases, TExpr, TInto, TUniq, SF) end. @@ -291,8 +291,6 @@ no_var_expr(Ann, _) -> [{var, Ann, '_'}]. no_var_size({var, _, _}) -> throw(unbound_size); no_var_size(Size) -> Size. -build_comprehension(Ann, Clauses, Expr, false) -> - {lc, Ann, Expr, comprehension_clause(Clauses)}; build_comprehension(Ann, Clauses, Expr, Into) -> {comprehension_kind(Into), Ann, Expr, comprehension_clause(Clauses)}. @@ -304,6 +302,7 @@ comprehension_clause([{Kind, Meta, Left, Right, Filters} | T]) -> comprehension_clause([]) -> []. +comprehension_kind(false) -> lc; comprehension_kind({nil, _}) -> lc; comprehension_kind({bin, _, []}) -> bc.