Skip to content

Commit c20222b

Browse files
committed
Trace on load functions, see #14427
1 parent 9c56121 commit c20222b

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

lib/elixir/src/elixir_module.erl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ compile(Meta, Module, ModuleAsCharlist, Block, Vars, Prune, E) ->
182182
'Elixir.Module':'__check_attributes__'(E, DataSet, DataBag),
183183

184184
AfterVerify = bag_lookup_element(DataBag, {accumulate, after_verify}, 2),
185-
[elixir_env:trace({remote_function, [], VerifyMod, VerifyFun, 1}, CallbackE) ||
185+
[elixir_env:trace({remote_function, [{line, Line}], VerifyMod, VerifyFun, 1}, CallbackE) ||
186186
{VerifyMod, VerifyFun} <- AfterVerify],
187187

188188
%% Ensure there are no errors before we infer types
@@ -299,7 +299,8 @@ validate_on_load_attribute({on_load, Def}, Defs, Bag, Line, E) ->
299299
elixir_errors:module_error([{line, Line}], E, ?MODULE, {undefined_function, on_load, Def});
300300
{_Def, Kind, _Meta, _Clauses} when Kind == defmacro; Kind == defmacrop ->
301301
elixir_errors:module_error([{line, Line}], E, ?MODULE, {bad_macro, on_load, Def});
302-
{_Def, Kind, _Meta, _Clauses} ->
302+
{{Name, Arity}, Kind, _Meta, _Clauses} ->
303+
elixir_env:trace({local_function, [{line, Line}], Name, Arity}, E),
303304
(Kind == defp) andalso ets:insert(Bag, {used_private, Def})
304305
end;
305306
validate_on_load_attribute(false, _Defs, _Bag, _Line, _E) -> ok.

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

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,27 @@ defmodule Kernel.TracersTest do
1414
end
1515

1616
def trace(event, %Macro.Env{} = env) do
17-
send(self(), {event, env})
17+
for {pid, _} <- Registry.lookup(__MODULE__, :tracers) do
18+
send(pid, {event, env})
19+
end
20+
1821
:ok
1922
end
2023

2124
setup_all do
25+
start_supervised!({Registry, keys: :duplicate, name: __MODULE__})
2226
Code.put_compiler_option(:tracers, [__MODULE__])
2327

2428
on_exit(fn ->
2529
Code.put_compiler_option(:tracers, [])
2630
end)
2731
end
2832

33+
setup do
34+
Registry.register(__MODULE__, :tracers, :unused)
35+
:ok
36+
end
37+
2938
test "traces start and stop" do
3039
compile_string("""
3140
Foo
@@ -259,7 +268,7 @@ defmodule Kernel.TracersTest do
259268
assert meta[:from_brackets]
260269

261270
compile_string("""
262-
defmodule Foo do
271+
defmodule TracerBracketAccess do
263272
@foo %{bar: 3}
264273
def a() do
265274
@foo[:bar]
@@ -278,6 +287,18 @@ defmodule Kernel.TracersTest do
278287
assert meta[:from_brackets]
279288
end
280289

290+
test "traces on_load" do
291+
compile_string("""
292+
defmodule TracerOnLoad do
293+
@on_load :init
294+
def init, do: :ok
295+
end
296+
""")
297+
298+
assert_received {{:local_function, meta, :init, 0}, _}
299+
assert meta[:line] == 1
300+
end
301+
281302
test "traces super" do
282303
compile_string("""
283304
defmodule TracerOverridable do

0 commit comments

Comments
 (0)