@@ -1496,45 +1496,44 @@ defmodule Module.Types.Descr do
1496
1496
# Create cache key from function arguments
1497
1497
cache_key = { args , { b , ret } , [ { arguments , return } | rest_positive ] }
1498
1498
1499
- case Map . get ( cache , cache_key ) do
1500
- nil ->
1499
+ case cache do
1500
+ % { ^ cache_key => value } ->
1501
+ value
1502
+
1503
+ % { } ->
1501
1504
# Compute result and cache it
1502
1505
{ result1 , cache } = phi ( args , { true , intersection ( ret , return ) } , rest_positive , cache )
1503
1506
1504
1507
if not result1 do
1505
- # Store false result in cache
1506
1508
cache = Map . put ( cache , cache_key , false )
1507
1509
{ false , cache }
1508
1510
else
1509
- # This doesn't stop if one intermediate result is false?
1510
- { result2 , cache } =
1511
- Enum . with_index ( arguments )
1512
- |> Enum . reduce_while ( { true , cache } , fn { type , index } , { acc_result , acc_cache } ->
1513
- { new_result , new_cache } =
1514
- List . update_at ( args , index , fn { _ , arg } -> { true , difference ( arg , type ) } end )
1515
- |> phi ( { b , ret } , rest_positive , acc_cache )
1516
-
1517
- if new_result do
1518
- { :cont , { acc_result and new_result , new_cache } }
1519
- else
1520
- { :halt , { false , new_cache } }
1521
- end
1511
+ { _index , result2 , cache } =
1512
+ Enum . reduce_while ( arguments , { 0 , true , cache } , fn
1513
+ type , { index , acc_result , acc_cache } ->
1514
+ { new_result , new_cache } =
1515
+ args
1516
+ |> List . update_at ( index , fn { _ , arg } -> { true , difference ( arg , type ) } end )
1517
+ |> phi ( { b , ret } , rest_positive , acc_cache )
1518
+
1519
+ if new_result do
1520
+ { :cont , { index + 1 , acc_result and new_result , new_cache } }
1521
+ else
1522
+ { :halt , { index + 1 , false , new_cache } }
1523
+ end
1522
1524
end )
1523
1525
1524
1526
result = result1 and result2
1525
- # Store result in cache
1526
1527
cache = Map . put ( cache , cache_key , result )
1527
1528
{ result , cache }
1528
1529
end
1529
-
1530
- cached_result ->
1531
- # Return cached result
1532
- { cached_result , cache }
1533
1530
end
1534
1531
end
1535
1532
1536
1533
defp all_non_empty_domains? ( positives ) do
1537
- Enum . all? ( positives , fn { args , _ret } -> not empty? ( args_to_domain ( args ) ) end )
1534
+ Enum . all? ( positives , fn { args , _ret } ->
1535
+ Enum . all? ( args , fn arg -> not empty? ( arg ) end )
1536
+ end )
1538
1537
end
1539
1538
1540
1539
defp fun_union ( bdd1 , bdd2 ) do
0 commit comments