Skip to content

Commit

Permalink
Avoid discarding information on conversion to #elixir_ex
Browse files Browse the repository at this point in the history
  • Loading branch information
josevalim committed Jun 1, 2024
1 parent 53c93b9 commit db89cbf
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 14 deletions.
2 changes: 1 addition & 1 deletion lib/elixir/lib/macro/env.ex
Original file line number Diff line number Diff line change
Expand Up @@ -583,7 +583,7 @@ defmodule Macro.Env do
:elixir_dispatch.check_deprecated(:macro, meta, receiver, name, arity, env)
end

quoted = expander.(args, :elixir_env.env_to_ex(env))
quoted = expander.(args, env)
next = :elixir_module.next_counter(env.module)
:elixir_quote.linify_with_context_counter(expansion_meta, {receiver, next}, quoted)
end
Expand Down
23 changes: 11 additions & 12 deletions lib/elixir/src/elixir_dispatch.erl
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,8 @@ dispatch_import(Meta, Name, Args, S, E, Callback) ->
case expand_import(Meta, Name, Arity, E, [], AllowLocals, true) of
{macro, Receiver, Expander} ->
check_deprecated(macro, Meta, Receiver, Name, Arity, E),
expand_quoted(Meta, Receiver, Name, Arity, Expander(Args, S), S, E);
Caller = {?line(Meta), S, E},
expand_quoted(Meta, Receiver, Name, Arity, Expander(Args, Caller), S, E);
{function, Receiver, NewName} ->
elixir_expand:expand({{'.', Meta, [Receiver, NewName]}, Meta, Args}, S, E);
not_found ->
Expand All @@ -151,7 +152,8 @@ dispatch_require(Meta, Receiver, Name, Args, S, E, Callback) when is_atom(Receiv
case expand_require(Meta, Receiver, Name, Arity, E, true) of
{macro, Receiver, Expander} ->
check_deprecated(macro, Meta, Receiver, Name, Arity, E),
expand_quoted(Meta, Receiver, Name, Arity, Expander(Args, S), S, E);
Caller = {?line(Meta), S, E},
expand_quoted(Meta, Receiver, Name, Arity, Expander(Args, Caller), S, E);
error ->
check_deprecated(function, Meta, Receiver, Name, Arity, E),
elixir_env:trace({remote_function, Meta, Receiver, Name, Arity}, E),
Expand Down Expand Up @@ -246,26 +248,23 @@ expand_require(Required, Meta, Receiver, Name, Arity, E, Trace) ->
%% Expansion helpers

expander_macro_fun(Meta, Fun, Receiver, Name, E) ->
fun(Args, S) -> expand_macro_fun(Meta, Fun, Receiver, Name, Args, S, E) end.
fun(Args, Caller) -> expand_macro_fun(Meta, Fun, Receiver, Name, Args, Caller, E) end.

expander_macro_named(Meta, Receiver, Name, Arity, E) ->
ProperName = elixir_utils:macro_name(Name),
ProperArity = Arity + 1,
Fun = fun Receiver:ProperName/ProperArity,
fun(Args, S) -> expand_macro_fun(Meta, Fun, Receiver, Name, Args, S, E) end.

expand_macro_fun(Meta, Fun, Receiver, Name, Args, S, E) ->
Line = ?line(Meta),
EArg = {Line, S, E},
fun(Args, Caller) -> expand_macro_fun(Meta, Fun, Receiver, Name, Args, Caller, E) end.

expand_macro_fun(Meta, Fun, Receiver, Name, Args, Caller, E) ->
try
apply(Fun, [EArg | Args])
apply(Fun, [Caller | Args])
catch
Kind:Reason:Stacktrace ->
Arity = length(Args),
MFA = {Receiver, elixir_utils:macro_name(Name), Arity+1},
Info = [{Receiver, Name, Arity, [{file, "expanding macro"}]}, caller(Line, E)],
erlang:raise(Kind, Reason, prune_stacktrace(Stacktrace, MFA, Info, {ok, EArg}))
Info = [{Receiver, Name, Arity, [{file, "expanding macro"}]}, caller(?line(Meta), E)],
erlang:raise(Kind, Reason, prune_stacktrace(Stacktrace, MFA, Info, {ok, Caller}))
end.

expand_quoted(Meta, Receiver, Name, Arity, Quoted, S, E) ->
Expand Down Expand Up @@ -342,7 +341,7 @@ is_import(Meta, Arity) ->
end.

% %% We've reached the macro wrapper fun, skip it with the rest
prune_stacktrace([{_, _, [E | _], _} | _], _MFA, Info, {ok, E}) ->
prune_stacktrace([{_, _, [Caller | _], _} | _], _MFA, Info, {ok, Caller}) ->
Info;
%% We've reached the invoked macro, skip it
prune_stacktrace([{M, F, A, _} | _], {M, F, A}, Info, _E) ->
Expand Down
2 changes: 1 addition & 1 deletion lib/elixir/src/elixir_env.erl
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ trace(Event, #{tracers := Tracers} = E) ->

to_caller({Line, #elixir_ex{vars={Read, _}}, Env}) ->
Env#{line := Line, versioned_vars := Read};
to_caller(#{} = Env) ->
to_caller(#{'__struct__' := 'Elixir.Macro.Env'} = Env) ->
Env.

with_vars(Env, Vars) when is_list(Vars) ->
Expand Down

0 comments on commit db89cbf

Please sign in to comment.