Skip to content

Commit ba43183

Browse files
author
José Valim
committed
Ensure RecordRewriter is no-op for non record fields
1 parent af95958 commit ba43183

File tree

2 files changed

+15
-8
lines changed

2 files changed

+15
-8
lines changed

lib/elixir/lib/kernel/record_rewriter.ex

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ defmodule Kernel.RecordRewriter do
4747
optimizable = record.__record__(:optimizable)
4848
{ fields, optimizable }
4949
rescue
50-
[UndefinedFunctionError, FunctionClauseError] -> { [], [] }
50+
[UndefinedFunctionError, FunctionClauseError] -> nil
5151
end
5252
end
5353
end
@@ -60,13 +60,15 @@ defmodule Kernel.RecordRewriter do
6060
end
6161

6262
defp optimize_call(line, { record, _ } = res, left, { :atom, _, function }, args) do
63-
{ fields, optimizable } = record_fields(record)
64-
65-
if List.member?(optimizable, { function, length(args) + 1 }) do
66-
{ kind, field } = record_field_info(function)
67-
if index = Enum.find_index(fields, field == &1) do
68-
optimize_call(line, res, kind, index, left, args)
69-
end
63+
case record_fields(record) do
64+
{ fields, optimizable } ->
65+
if List.member?(optimizable, { function, length(args) + 1 }) do
66+
{ kind, field } = record_field_info(function)
67+
if index = Enum.find_index(fields, field == &1) do
68+
optimize_call(line, res, kind, index, left, args)
69+
end
70+
end
71+
nil -> nil
7072
end
7173
end
7274

lib/elixir/test/elixir/kernel/record_rewriter_test.exs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,11 @@ defmodule Kernel.RecordRewriterTest do
235235
assert optimize_clause(clause) == { clause, [x: Range], nil }
236236
end
237237

238+
test "noop for not records fields" do
239+
clause = clause(fn(x = { :not_a_record, _ }) -> x.unknown end)
240+
assert optimize_clause(clause) == { clause, [x: :not_a_record], nil }
241+
end
242+
238243
test "noop for rewriten fields" do
239244
clause = clause(fn(x = BadRange[]) -> x.first end)
240245
assert optimize_clause(clause) == { clause, [x: BadRange], nil }

0 commit comments

Comments
 (0)