@@ -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