Skip to content

Commit 47279b1

Browse files
committed
Optimize atom type check
1 parent d391b85 commit 47279b1

File tree

2 files changed

+9
-4
lines changed

2 files changed

+9
-4
lines changed

lib/elixir/lib/module/types/descr.ex

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,13 @@ defmodule Module.Types.Descr do
9999
def number_type?(%{bitmap: bitmap}) when (bitmap &&& @bit_number) != 0, do: true
100100
def number_type?(%{}), do: false
101101

102+
@doc """
103+
Optimized check if the type represents any atom.
104+
"""
105+
def atom_type?(%{dynamic: %{atom: _}}), do: true
106+
def atom_type?(%{atom: _}), do: true
107+
def atom_type?(%{}), do: false
108+
102109
## Set operations
103110

104111
@doc """

lib/elixir/lib/module/types/pattern.ex

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,13 +69,11 @@ defmodule Module.Types.Pattern do
6969
# %var{...} and %^var{...}
7070
def of_pattern({:%, meta, [inner, {:%{}, _meta2, args}]} = expr, _expected_term, stack, context)
7171
when not is_atom(inner) do
72-
atom = atom()
73-
74-
with {:ok, type, context} <- of_pattern(inner, {atom, expr}, stack, context),
72+
with {:ok, type, context} <- of_pattern(inner, {atom(), expr}, stack, context),
7573
{:ok, map, context} <-
7674
Of.map(:open, args, [__struct__: type], stack, context, &of_pattern/3) do
7775
# Skip the check if a variable, as it has already been checked
78-
if is_var(inner) or compatible?(type, atom) do
76+
if is_var(inner) or atom_type?(type) do
7977
{:ok, map, context}
8078
else
8179
warning = {:badstruct, expr, context}

0 commit comments

Comments
 (0)