Skip to content

Commit ec31cc2

Browse files
committed
Escape maps when expanding __ENV__
1 parent 6549d20 commit ec31cc2

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

lib/elixir/lib/macro.ex

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1795,13 +1795,15 @@ defmodule Macro do
17951795
defp do_expand_once({:__DIR__, _, atom}, env) when is_atom(atom),
17961796
do: {:filename.dirname(env.file), true}
17971797

1798-
defp do_expand_once({:__ENV__, _, atom}, env) when is_atom(atom),
1799-
do: {{:%{}, [], Map.to_list(env)}, true}
1798+
defp do_expand_once({:__ENV__, _, atom}, env) when is_atom(atom) do
1799+
env = update_in(env.versioned_vars, &maybe_escape_map/1)
1800+
{maybe_escape_map(env), true}
1801+
end
18001802

18011803
defp do_expand_once({{:., _, [{:__ENV__, _, atom}, field]}, _, []} = original, env)
18021804
when is_atom(atom) and is_atom(field) do
18031805
if Map.has_key?(env, field) do
1804-
{Map.get(env, field), true}
1806+
{maybe_escape_map(Map.get(env, field)), true}
18051807
else
18061808
{original, false}
18071809
end
@@ -1884,6 +1886,9 @@ defmodule Macro do
18841886
# Anything else is just returned
18851887
defp do_expand_once(other, _env), do: {other, false}
18861888

1889+
defp maybe_escape_map(map) when is_map(map), do: {:%{}, [], Map.to_list(map)}
1890+
defp maybe_escape_map(other), do: other
1891+
18871892
@doc """
18881893
Returns `true` if the given name and arity is a special form.
18891894
"""

lib/elixir/test/elixir/macro_test.exs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,9 +173,17 @@ defmodule MacroTest do
173173

174174
test "env" do
175175
env = %{__ENV__ | line: 0}
176-
assert Macro.expand_once(quote(do: __ENV__), env) == {:%{}, [], Map.to_list(env)}
176+
177+
expanded = Macro.expand_once(quote(do: __ENV__), env)
178+
assert Macro.validate(expanded) == :ok
179+
assert Code.eval_quoted(expanded) == {env, []}
180+
177181
assert Macro.expand_once(quote(do: __ENV__.file), env) == env.file
178182
assert Macro.expand_once(quote(do: __ENV__.unknown), env) == quote(do: __ENV__.unknown)
183+
184+
expanded = Macro.expand_once(quote(do: __ENV__.versioned_vars), env)
185+
assert Macro.validate(expanded) == :ok
186+
assert Code.eval_quoted(expanded) == {env.versioned_vars, []}
179187
end
180188

181189
defmacro local_macro(), do: raise("ignored")

0 commit comments

Comments
 (0)