Skip to content

Commit c51acfc

Browse files
committed
Trace on load functions, see #14427
1 parent 332ff94 commit c51acfc

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

lib/elixir/src/elixir_module.erl

+3-2
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ compile(Meta, Module, ModuleAsCharlist, Block, Vars, Prune, E) ->
178178
'Elixir.Module':'__check_attributes__'(E, DataSet, DataBag),
179179

180180
AfterVerify = bag_lookup_element(DataBag, {accumulate, after_verify}, 2),
181-
[elixir_env:trace({remote_function, [], VerifyMod, VerifyFun, 1}, CallbackE) ||
181+
[elixir_env:trace({remote_function, [{line, Line}], VerifyMod, VerifyFun, 1}, CallbackE) ||
182182
{VerifyMod, VerifyFun} <- AfterVerify],
183183

184184
%% Ensure there are no errors before we infer types
@@ -295,7 +295,8 @@ validate_on_load_attribute({on_load, Def}, Defs, Bag, Line, E) ->
295295
elixir_errors:module_error([{line, Line}], E, ?MODULE, {undefined_function, on_load, Def});
296296
{_Def, Kind, _Meta, _Clauses} when Kind == defmacro; Kind == defmacrop ->
297297
elixir_errors:module_error([{line, Line}], E, ?MODULE, {bad_macro, on_load, Def});
298-
{_Def, Kind, _Meta, _Clauses} ->
298+
{{Name, Arity}, Kind, _Meta, _Clauses} ->
299+
elixir_env:trace({local_function, [{line, Line}], Name, Arity}, E),
299300
(Kind == defp) andalso ets:insert(Bag, {used_private, Def})
300301
end;
301302
validate_on_load_attribute(false, _Defs, _Bag, _Line, _E) -> ok.

lib/elixir/test/elixir/kernel/tracers_test.exs

+23-2
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,27 @@ defmodule Kernel.TracersTest do
1010
end
1111

1212
def trace(event, %Macro.Env{} = env) do
13-
send(self(), {event, env})
13+
for {pid, _} <- Registry.lookup(__MODULE__, :tracers) do
14+
send(pid, {event, env})
15+
end
16+
1417
:ok
1518
end
1619

1720
setup_all do
21+
start_supervised!({Registry, keys: :duplicate, name: __MODULE__})
1822
Code.put_compiler_option(:tracers, [__MODULE__])
1923

2024
on_exit(fn ->
2125
Code.put_compiler_option(:tracers, [])
2226
end)
2327
end
2428

29+
setup do
30+
Registry.register(__MODULE__, :tracers, :unused)
31+
:ok
32+
end
33+
2534
test "traces start and stop" do
2635
compile_string("""
2736
Foo
@@ -255,7 +264,7 @@ defmodule Kernel.TracersTest do
255264
assert meta[:from_brackets]
256265

257266
compile_string("""
258-
defmodule Foo do
267+
defmodule TracerBracketAccess do
259268
@foo %{bar: 3}
260269
def a() do
261270
@foo[:bar]
@@ -274,6 +283,18 @@ defmodule Kernel.TracersTest do
274283
assert meta[:from_brackets]
275284
end
276285

286+
test "traces on_load" do
287+
compile_string("""
288+
defmodule TracerOnLoad do
289+
@on_load :init
290+
def init, do: :ok
291+
end
292+
""")
293+
294+
assert_received {{:local_function, meta, :init, 0}, _}
295+
assert meta[:line] == 1
296+
end
297+
277298
test "traces super" do
278299
compile_string("""
279300
defmodule TracerOverridable do

0 commit comments

Comments
 (0)