Skip to content

Commit 7fb01d3

Browse files
committed
Remove duplication and limit inferred size of tuples
1 parent 386c5d9 commit 7fb01d3

1 file changed

Lines changed: 9 additions & 5 deletions

File tree

lib/elixir/lib/module/types/apply.ex

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,12 @@ defmodule Module.Types.Apply do
485485
@empty_map empty_map()
486486
@non_empty_map difference(open_map(), empty_map())
487487

488+
# Limit the size of tuples to 16 entries
489+
# as otherwise we may create large nodes
490+
defguardp is_data_size(fun, literal)
491+
when (fun in [:length, :map_size] and is_integer(literal) and literal >= 0) or
492+
(fun in [:tuple_size] and literal in 0..15)
493+
488494
defp custom_compare(
489495
name,
490496
{{:., _, [:erlang, fun]}, _, [arg]} = left,
@@ -495,7 +501,7 @@ defmodule Module.Types.Apply do
495501
context,
496502
of_fun
497503
)
498-
when fun in [:length, :map_size, :tuple_size] and is_integer(literal) and literal >= 0 do
504+
when is_data_size(fun, literal) do
499505
case booleaness(expected) do
500506
:undefined ->
501507
compare(name, left, literal, false, expr, stack, context, of_fun)
@@ -551,16 +557,14 @@ defmodule Module.Types.Apply do
551557
defp sized_order(name, left, right, expected) do
552558
if name in [:>=, :"=<", :>, :<] do
553559
case {left, right} do
554-
{{{:., _, [:erlang, fun]}, _, [arg]}, size}
555-
when is_integer(size) and size >= 0 and fun in [:length, :map_size, :tuple_size] ->
560+
{{{:., _, [:erlang, fun]}, _, [arg]}, size} when is_data_size(fun, size) ->
556561
case booleaness(expected) do
557562
:always_true -> sized_order(name, fun, size, arg, @atom_true)
558563
:always_false -> sized_order(invert_order(name), fun, size, arg, @atom_false)
559564
:undefined -> :none
560565
end
561566

562-
{size, {{:., _, [:erlang, fun]}, _, [arg]}}
563-
when is_integer(size) and size >= 0 and fun in [:length, :map_size, :tuple_size] ->
567+
{size, {{:., _, [:erlang, fun]}, _, [arg]}} when is_data_size(fun, size) ->
564568
case booleaness(expected) do
565569
:always_true -> sized_order(invert_order(name), fun, size, arg, @atom_true)
566570
:always_false -> sized_order(name, fun, size, arg, @atom_false)

0 commit comments

Comments
 (0)