Skip to content

Commit a3aa1e8

Browse files
author
José Valim
committed
Ensure noname scope does not leak after assignment
1 parent 7c379aa commit a3aa1e8

File tree

2 files changed

+9
-4
lines changed

2 files changed

+9
-4
lines changed

lib/elixir/src/elixir_macros.erl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,12 +147,11 @@ translate({'case', Meta, [Expr, KV]}, S) ->
147147

148148
%% Try
149149

150-
translate({'try', Meta, [Clauses]}, RawS) ->
151-
S = RawS#elixir_scope{noname=true},
150+
translate({'try', Meta, [Clauses]}, S) ->
152151
assert_no_match_or_guard_scope(Meta, 'try', S),
153152

154153
Do = proplists:get_value('do', Clauses, nil),
155-
{ TDo, SB } = elixir_translator:translate_each(Do, S),
154+
{ TDo, SB } = elixir_translator:translate_each(Do, S#elixir_scope{noname=true}),
156155

157156
Catch = [Tuple || { X, _ } = Tuple <- Clauses, X == 'rescue' orelse X == 'catch'],
158157
{ TCatch, SC } = elixir_try:clauses(Meta, Catch, umergec(S, SB)),
@@ -163,7 +162,8 @@ translate({'try', Meta, [Clauses]}, RawS) ->
163162
Else = elixir_clauses:get_pairs(Meta, else, Clauses, S),
164163
{ TElse, SE } = elixir_clauses:match(Meta, Else, umergec(S, SA)),
165164

166-
{ { 'try', ?line(Meta), pack(TDo), TElse, TCatch, pack(TAfter) }, umergec(RawS, SE) };
165+
SF = (umergec(S, SE))#elixir_scope{noname=S#elixir_scope.noname},
166+
{ { 'try', ?line(Meta), pack(TDo), TElse, TCatch, pack(TAfter) }, SF };
167167

168168
%% Receive
169169

lib/elixir/test/elixir/code_test.exs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ defmodule CodeTest do
1919
assert { 3, _ } = Code.eval_string("a + b", [a: 1, b: 2], __ENV__.location)
2020
end
2121

22+
test :eval_with_unnamed_scopes do
23+
assert { RuntimeError[], [a: RuntimeError[]] } =
24+
Code.eval_string("a = (try do (raise \"hello\") rescue e -> e end)")
25+
end
26+
2227
test :eval_with_scope do
2328
assert Code.eval_string("one", [], delegate_locals_to: __MODULE__) == { 1, [] }
2429
end

0 commit comments

Comments
 (0)