Skip to content

Commit 482b875

Browse files
committed
Making sure to only change return to recursion if in a non-anonymous function
1 parent df03250 commit 482b875

File tree

1 file changed

+16
-6
lines changed

1 file changed

+16
-6
lines changed

lib/elixir_script/passes/translate/function.ex

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ defmodule ElixirScript.Translate.Function do
1919
end
2020

2121
def compile({:fn, _, clauses}, state) do
22+
anonymous? = Map.get(state, :anonymous_fn, false)
23+
24+
state = Map.put(state, :anonymous_fn, true)
2225
clauses = compile_clauses(clauses, state)
2326

2427
arg_matches_declarator = J.variable_declarator(
@@ -61,11 +64,14 @@ defmodule ElixirScript.Translate.Function do
6164
])
6265
)
6366

67+
state = Map.put(state, :anonymous_fn, anonymous?)
6468
{ function_dec, state }
6569
end
6670

6771
def compile({{name, arity}, _type, _, clauses}, state) do
6872
state = Map.put(state, :function, {name, arity})
73+
|> Map.put(:anonymous_fn, false)
74+
6975
clauses = compile_clauses(clauses, state)
7076

7177
arg_matches_declarator = J.variable_declarator(
@@ -194,19 +200,23 @@ defmodule ElixirScript.Translate.Function do
194200
{ast, state}
195201
end
196202

197-
defp update_last_call(clause_body, %{function: {name, _}}) do
203+
defp update_last_call(clause_body, %{function: {name, _}, anonymous_fn: anonymous?}) do
198204
last_item = List.last(clause_body)
199205
function_name = ElixirScript.Translate.Identifier.make_function_name(name)
200206

201207
case last_item do
202208
%ESTree.ReturnStatement{ argument: %ESTree.CallExpression{ callee: ^function_name, arguments: arguments } } ->
203-
new_last_item = J.return_statement(
204-
recurse(
205-
recur_bind(arguments)
209+
if anonymous? do
210+
clause_body
211+
else
212+
new_last_item = J.return_statement(
213+
recurse(
214+
recur_bind(arguments)
215+
)
206216
)
207-
)
208217

209-
List.replace_at(clause_body, length(clause_body) - 1, new_last_item)
218+
List.replace_at(clause_body, length(clause_body) - 1, new_last_item)
219+
end
210220
_ ->
211221
clause_body
212222
end

0 commit comments

Comments
 (0)