@@ -528,50 +528,57 @@ defmodule Module.Types.Descr do
528528    if  term_type? ( descr )  do 
529529      { :term ,  [ ] ,  [ ] } 
530530    else 
531-       { dynamic ,  static ,  extra }  = 
532-         case  :maps . take ( :dynamic ,  descr )  do 
533-           :error  -> 
534-             { % { } ,  descr ,  [ ] } 
531+       non_term_type_to_quoted ( descr ,  opts ) 
532+     end 
533+   end 
535534
536-           { :term ,  static }  -> 
537-             { :term ,  static ,  [ ] } 
535+   defp  non_term_type_to_quoted ( descr ,  opts )  do 
536+     { dynamic ,  static ,  extra }  = 
537+       case  :maps . take ( :dynamic ,  descr )  do 
538+         :error  -> 
539+           { % { } ,  descr ,  [ ] } 
538540
539-           { dynamic ,  static }  -> 
540-             if  term_type? ( dynamic )  do 
541-               { :term ,  static ,  [ ] } 
542-             else 
543-               # Denormalize functions before we do the difference 
544-               { static ,  dynamic ,  extra }  =  fun_denormalize ( static ,  dynamic ,  opts ) 
545-               { difference ( dynamic ,  static ) ,  static ,  extra } 
546-             end 
547-         end 
541+         { :term ,  static }  -> 
542+           { :term ,  static ,  [ ] } 
548543
549-       # Merge empty list and list together if they both exist 
550-       { extra ,  static }  = 
551-         case  static  do 
552-           % { list:  list ,  bitmap:  bitmap }  when  ( bitmap  &&&  @ bit_empty_list )  !=  0  -> 
553-             static  = 
554-               static 
555-               |>  Map . delete ( :list ) 
556-               |>  Map . replace! ( :bitmap ,  bitmap  -  @ bit_empty_list ) 
557- 
558-             { list_to_quoted ( list ,  true ,  opts )  ++  extra ,  static } 
544+         { dynamic ,  static }  -> 
545+           # Computing term_type?(difference(dynamic, static)) can be 
546+           # expensive, so we check for term type before hand and check 
547+           # for :term exclusively in dynamic_to_quoted/2. 
548+           if  term_type? ( dynamic )  do 
549+             { :term ,  static ,  [ ] } 
550+           else 
551+             # Denormalize functions before we do the difference 
552+             { static ,  dynamic ,  extra }  =  fun_denormalize ( static ,  dynamic ,  opts ) 
553+             { difference ( dynamic ,  static ) ,  static ,  extra } 
554+           end 
555+       end 
559556
560-           % { }  -> 
561-             { extra ,  static } 
562-         end 
557+     # Merge empty list and list together if they both exist 
558+     { extra ,  static }  = 
559+       case  static  do 
560+         % { list:  list ,  bitmap:  bitmap }  when  ( bitmap  &&&  @ bit_empty_list )  !=  0  -> 
561+           static  = 
562+             static 
563+             |>  Map . delete ( :list ) 
564+             |>  Map . replace! ( :bitmap ,  bitmap  -  @ bit_empty_list ) 
563565
564-       # Dynamic always come first for visibility 
565-       unions  = 
566-         to_quoted ( :dynamic ,  dynamic ,  opts )  ++ 
567-           Enum . sort ( 
568-             extra  ++  Enum . flat_map ( static ,  fn  { key ,  value }  ->  to_quoted ( key ,  value ,  opts )  end ) 
569-           ) 
566+           { list_to_quoted ( list ,  true ,  opts )  ++  extra ,  static } 
570567
571-       case  unions  do 
572-         [ ]  ->  { :none ,  [ ] ,  [ ] } 
573-         unions  ->  Enum . reduce ( unions ,  & { :or ,  [ ] ,  [ & 2 ,  & 1 ] } ) 
568+         % { }  -> 
569+           { extra ,  static } 
574570      end 
571+ 
572+     # Dynamic always come first for visibility 
573+     unions  = 
574+       to_quoted ( :dynamic ,  dynamic ,  opts )  ++ 
575+         Enum . sort ( 
576+           extra  ++  Enum . flat_map ( static ,  fn  { key ,  value }  ->  to_quoted ( key ,  value ,  opts )  end ) 
577+         ) 
578+ 
579+     case  unions  do 
580+       [ ]  ->  { :none ,  [ ] ,  [ ] } 
581+       unions  ->  Enum . reduce ( unions ,  & { :or ,  [ ] ,  [ & 2 ,  & 1 ] } ) 
575582    end 
576583  end 
577584
@@ -2109,7 +2116,7 @@ defmodule Module.Types.Descr do
21092116        [ single ] 
21102117
21112118      true  -> 
2112-         case  to_quoted ( descr ,  opts )  do 
2119+         case  non_term_type_to_quoted ( descr ,  opts )  do 
21132120          { :none ,  _meta ,  [ ] }  =  none  ->  [ none ] 
21142121          descr  ->  [ { :dynamic ,  [ ] ,  [ descr ] } ] 
21152122        end 
0 commit comments