Skip to content

Commit ae0ac9b

Browse files
committed
Ignore tracers if lexical tracker is dead or explicitly nil
1 parent e347983 commit ae0ac9b

File tree

2 files changed

+21
-9
lines changed

2 files changed

+21
-9
lines changed

lib/elixir/src/elixir.erl

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -204,21 +204,23 @@ env_for_eval(Env, Opts) ->
204204
false -> nil
205205
end,
206206

207-
Tracers = case lists:keyfind(tracers, 1, Opts) of
207+
TempTracers = case lists:keyfind(tracers, 1, Opts) of
208208
{tracers, TracersOpt} when is_list(TracersOpt) -> TracersOpt;
209209
false -> []
210210
end,
211211

212-
LexicalTracker = case lists:keyfind(lexical_tracker, 1, Opts) of
212+
%% If there is a dead PID or lexical tracker is nil,
213+
%% we assume the tracers also cannot be (re)used.
214+
{LexicalTracker, Tracers} = case lists:keyfind(lexical_tracker, 1, Opts) of
213215
{lexical_tracker, Pid} when is_pid(Pid) ->
214216
case is_process_alive(Pid) of
215-
true -> Pid;
216-
false -> nil
217+
true -> {Pid, TempTracers};
218+
false -> {nil, []}
217219
end;
218220
{lexical_tracker, nil} ->
219-
nil;
221+
{nil, []};
220222
false ->
221-
nil
223+
{nil, TempTracers}
222224
end,
223225

224226
FA = case lists:keyfind(function, 1, Opts) of

lib/elixir/test/elixir/code_test.exs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,21 @@ defmodule CodeTest do
8585
assert CodeTest.Sample.eval_quoted_info() == {CodeTest.Sample, "sample.ex", 13}
8686
end
8787

88-
test "eval_quoted/2 with a %Macro.Env{} struct as the second argument" do
88+
test "eval_quoted/2 with %Macro.Env{} at runtime" do
8989
alias :lists, as: MyList
90+
quoted = quote(do: MyList.flatten([[1, 2, 3]]))
9091

91-
assert Code.eval_quoted(quote(do: MyList.flatten([[1, 2, 3]])), [], __ENV__) ==
92-
{[1, 2, 3], []}
92+
assert Code.eval_quoted(quoted, [], __ENV__) == {[1, 2, 3], []}
93+
94+
# Let's check it discards tracers since the lexical tracker is explicitly nil
95+
assert Code.eval_quoted(quoted, [], %{__ENV__ | tracers: [:bad]}) == {[1, 2, 3], []}
96+
end
97+
98+
test "eval_quoted/2 with %Macro.Env{} at compile time" do
99+
defmodule CompileTimeEnv do
100+
alias String.Chars
101+
{"foo", []} = Code.eval_string("Chars.to_string(:foo)", [], __ENV__)
102+
end
93103
end
94104

95105
test "eval_file/1" do

0 commit comments

Comments
 (0)