Skip to content

Commit fa574e6

Browse files
author
José Valim
committed
Do not use named ETS tables during module definition
Tables named after modules are very likely to be used the application itself, which can lead to conflicts in scenarios such as code reloading. Closes #6361
1 parent 8e99e3c commit fa574e6

File tree

3 files changed

+13
-7
lines changed

3 files changed

+13
-7
lines changed

lib/elixir/src/elixir_expand.erl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -451,12 +451,12 @@ expand(Function, E) when is_function(Function) ->
451451
expand(PidOrRef, E) when is_pid(PidOrRef); is_reference(PidOrRef) ->
452452
case ?key(E, function) of
453453
nil ->
454-
PidOrRef;
454+
{PidOrRef, E};
455455
Function ->
456456
%% TODO: Make me an error on 2.0
457457
elixir_errors:form_warn([], ?key(E, file), ?MODULE,
458458
{invalid_pid_or_ref_in_function, PidOrRef, Function}),
459-
PidOrRef
459+
{PidOrRef, E}
460460
end;
461461

462462
expand(Other, E) when is_number(Other); is_atom(Other); is_binary(Other) ->

lib/elixir/src/elixir_module.erl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ put_compiler_modules(M) when is_list(M) ->
2323
%% Table functions
2424

2525
data_table(Module) ->
26-
Module.
26+
ets:lookup_element(elixir_modules, Module, 2).
2727

2828
defs_table(Module) ->
29-
ets:lookup_element(elixir_modules, Module, 2).
29+
ets:lookup_element(elixir_modules, Module, 3).
3030

3131
is_open(Module) ->
3232
ets:lookup(elixir_modules, Module) /= [].
@@ -160,17 +160,17 @@ check_module_availability(Line, File, Module) ->
160160

161161
build(Line, File, Module, Lexical) ->
162162
case elixir_code_server:call({lookup, Module}) of
163-
[{Module, _, OldLine, OldFile}] ->
163+
[{Module, _, _, OldLine, OldFile}] ->
164164
Error = {module_in_definition, Module, OldFile, OldLine},
165165
elixir_errors:form_error([{line, Line}], File, ?MODULE, Error);
166166
_ ->
167167
[]
168168
end,
169169

170-
Data = ets:new(Module, [set, public, named_table]),
170+
Data = ets:new(Module, [set, public]),
171171
Defs = ets:new(Module, [duplicate_bag, public]),
172172
Ref = elixir_code_server:call({defmodule, self(),
173-
{Module, Defs, Line, File}}),
173+
{Module, Data, Defs, Line, File}}),
174174

175175
DocsOnDefinition =
176176
case elixir_compiler:get_opt(docs) of

lib/elixir/test/elixir/module_test.exs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,12 @@ defmodule ModuleTest do
307307
end
308308
end
309309

310+
test "does not use ETS tables named after the module" do
311+
in_module do
312+
assert :ets.info(__MODULE__) == :undefined
313+
end
314+
end
315+
310316
## Definitions
311317

312318
test "defines?" do

0 commit comments

Comments
 (0)