Skip to content

Commit ab5b33d

Browse files
committed
Avoid allocating tuples on bdd_map/bdd_reduce
1 parent c376c0f commit ab5b33d

1 file changed

Lines changed: 28 additions & 26 deletions

File tree

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

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -642,17 +642,17 @@ defmodule Module.Types.Descr do
642642
defp numberize(:bitmap, bitmap), do: bitmap
643643

644644
defp numberize(:map, bdd) do
645-
bdd_map(bdd, fn {tag, fields} ->
646-
{tag, fields_map(fn _key, value -> numberize(value) end, fields)}
645+
bdd_map(bdd, fn bdd_leaf(tag, fields) ->
646+
bdd_leaf_new(tag, fields_map(fn _key, value -> numberize(value) end, fields))
647647
end)
648648
end
649649

650650
defp numberize(:tuple, bdd) do
651-
bdd_map(bdd, fn {tag, fields} -> {tag, Enum.map(fields, &numberize/1)} end)
651+
bdd_map(bdd, fn bdd_leaf(tag, fields) -> bdd_leaf_new(tag, Enum.map(fields, &numberize/1)) end)
652652
end
653653

654654
defp numberize(:list, bdd) do
655-
bdd_map(bdd, fn {head, tail} -> {numberize(head), numberize(tail)} end)
655+
bdd_map(bdd, fn bdd_leaf(head, tail) -> bdd_leaf_new(numberize(head), numberize(tail)) end)
656656
end
657657

658658
@doc """
@@ -3580,7 +3580,7 @@ defmodule Module.Types.Descr do
35803580
else
35813581
domain_keys_type ->
35823582
{_seen, acc} =
3583-
bdd_reduce(bdd, {%{}, domain_keys_type}, fn {_tag, fields}, seen_acc ->
3583+
bdd_reduce(bdd, {%{}, domain_keys_type}, fn bdd_leaf(_tag, fields), seen_acc ->
35843584
fields_fold(fields, seen_acc, fn key, _type, {seen, acc} ->
35853585
if Map.has_key?(seen, key) do
35863586
{seen, acc}
@@ -3832,8 +3832,8 @@ defmodule Module.Types.Descr do
38323832
defp map_put_key_static(%{map: bdd} = descr, key, type) do
38333833
bdd =
38343834
bdd_map(bdd, fn
3835-
{:closed, fields} when type == @not_set -> {:closed, fields}
3836-
{tag, fields} -> {tag, fields_store(key, type, fields)}
3835+
bdd_leaf(:closed, fields) when type == @not_set -> bdd_leaf_new(:closed, fields)
3836+
bdd_leaf(tag, fields) -> bdd_leaf_new(tag, fields_store(key, type, fields))
38373837
end)
38383838

38393839
%{descr | map: bdd}
@@ -3878,7 +3878,7 @@ defmodule Module.Types.Descr do
38783878

38793879
defp map_update_merge_atom_key(bdd, dnf) do
38803880
{_seen, acc} =
3881-
bdd_reduce(bdd, {%{}, none()}, fn {_tag, fields}, seen_acc ->
3881+
bdd_reduce(bdd, {%{}, none()}, fn bdd_leaf(_tag, fields), seen_acc ->
38823882
fields_fold(fields, seen_acc, fn key, _type, {seen, acc} ->
38833883
if Map.has_key?(seen, key) do
38843884
{seen, acc}
@@ -3893,7 +3893,7 @@ defmodule Module.Types.Descr do
38933893
end
38943894

38953895
defp map_update_any_atom_key?(bdd, dnf) do
3896-
bdd_reduce(bdd, %{}, fn {_tag, fields}, acc ->
3896+
bdd_reduce(bdd, %{}, fn bdd_leaf(_tag, fields), acc ->
38973897
fields_fold(fields, acc, fn key, _type, acc ->
38983898
if Map.has_key?(acc, key) do
38993899
acc
@@ -3977,8 +3977,8 @@ defmodule Module.Types.Descr do
39773977

39783978
defp map_update_put_domains(bdd, domain_keys, type_fun, force?) do
39793979
bdd =
3980-
bdd_map(bdd, fn {tag, fields} ->
3981-
{map_update_put_domain(tag, domain_keys, type_fun, force?), fields}
3980+
bdd_map(bdd, fn bdd_leaf(tag, fields) ->
3981+
bdd_leaf_new(map_update_put_domain(tag, domain_keys, type_fun, force?), fields)
39823982
end)
39833983

39843984
%{map: bdd}
@@ -4211,7 +4211,7 @@ defmodule Module.Types.Descr do
42114211

42124212
defp map_keys_from_negated_set(set, bdd) do
42134213
bdd
4214-
|> bdd_reduce(%{}, fn {_, fields}, acc ->
4214+
|> bdd_reduce(%{}, fn bdd_leaf(_, fields), acc ->
42154215
fields_fold(fields, acc, fn atom, _, acc ->
42164216
if :sets.is_element(atom, set), do: acc, else: Map.put(acc, atom, true)
42174217
end)
@@ -5679,7 +5679,12 @@ defmodule Module.Types.Descr do
56795679

56805680
# Takes a static map type and removes an index from it.
56815681
defp tuple_delete_static(%{tuple: bdd}, index) do
5682-
%{tuple: bdd_map(bdd, fn {tag, elements} -> {tag, List.delete_at(elements, index)} end)}
5682+
%{
5683+
tuple:
5684+
bdd_map(bdd, fn bdd_leaf(tag, elements) ->
5685+
bdd_leaf_new(tag, List.delete_at(elements, index))
5686+
end)
5687+
}
56835688
end
56845689

56855690
# If there is no map part to this static type, there is nothing to delete.
@@ -5743,7 +5748,7 @@ defmodule Module.Types.Descr do
57435748

57445749
defp tuple_insert_static(descr, index, type) do
57455750
Map.update!(descr, :tuple, fn bdd ->
5746-
bdd_map(bdd, fn {tag, elements} ->
5751+
bdd_map(bdd, fn bdd_leaf(tag, elements) ->
57475752
# If the tuple is open, then we want List.insert_at to put the new element at the correct
57485753
# index, which requires filling the tuple with `term()` values first.
57495754
# Closed tuples of an incorrect size will be ignored (they are cancelled by the earlier
@@ -5755,7 +5760,7 @@ defmodule Module.Types.Descr do
57555760
elements
57565761
end
57575762

5758-
{tag, List.insert_at(elements, index, type)}
5763+
bdd_leaf_new(tag, List.insert_at(elements, index, type))
57595764
end)
57605765
end)
57615766
end
@@ -6287,14 +6292,11 @@ defmodule Module.Types.Descr do
62876292
:bdd_top ->
62886293
:bdd_top
62896294

6290-
bdd_leaf(arg1, arg2) ->
6291-
{arg1, arg2} = fun.({arg1, arg2})
6292-
bdd_leaf_new(arg1, arg2)
6295+
bdd_leaf(_, _) = leaf ->
6296+
fun.(leaf)
62936297

6294-
{_, bdd_leaf(arg1, arg2), left, union, right} ->
6295-
{arg1, arg2} = fun.({arg1, arg2})
6296-
literal = bdd_leaf_new(arg1, arg2)
6297-
bdd_node_new(literal, bdd_map(left, fun), bdd_map(union, fun), bdd_map(right, fun))
6298+
{_, leaf, left, union, right} ->
6299+
bdd_node_new(fun.(leaf), bdd_map(left, fun), bdd_map(union, fun), bdd_map(right, fun))
62986300
end
62996301
end
63006302

@@ -6306,11 +6308,11 @@ defmodule Module.Types.Descr do
63066308
:bdd_top ->
63076309
acc
63086310

6309-
bdd_leaf(arg1, arg2) ->
6310-
fun.({arg1, arg2}, acc)
6311+
bdd_leaf(_, _) = leaf ->
6312+
fun.(leaf, acc)
63116313

6312-
{_, bdd_leaf(arg1, arg2), left, union, right} ->
6313-
acc = fun.({arg1, arg2}, acc)
6314+
{_, leaf, left, union, right} ->
6315+
acc = fun.(leaf, acc)
63146316
acc = bdd_reduce(left, acc, fun)
63156317
acc = bdd_reduce(union, acc, fun)
63166318
acc = bdd_reduce(right, acc, fun)

0 commit comments

Comments
 (0)