@@ -2433,14 +2433,15 @@ function abstract_eval_getglobal(interp::AbstractInterpreter, sv::AbsIntState, s
2433
2433
end
2434
2434
2435
2435
@nospecs function abstract_eval_get_binding_type (interp:: AbstractInterpreter , sv:: AbsIntState , M, s)
2436
+ @nospecialize M s
2436
2437
⊑ = partialorder (typeinf_lattice (interp))
2437
2438
if isa (M, Const) && isa (s, Const)
2438
2439
(M, s) = (M. val, s. val)
2439
2440
if ! isa (M, Module) || ! isa (s, Symbol)
2440
2441
return CallMeta (Union{}, TypeError, EFFECTS_THROWS, NoCallInfo ())
2441
2442
end
2442
2443
gr = GlobalRef (M, s)
2443
- (valid_worlds, rt) = scan_leaf_partitions (interp, gr, sv. world) do interp, _ , partition
2444
+ (valid_worlds, rt) = scan_leaf_partitions (interp, gr, sv. world) do interp:: AbstractInterpreter , :: Core.Binding , partition:: Core.BindingPartition
2444
2445
local rt
2445
2446
kind = binding_kind (partition)
2446
2447
if is_some_guard (kind) || kind == PARTITION_KIND_DECLARED
@@ -2570,13 +2571,14 @@ function abstract_eval_replaceglobal!(interp::AbstractInterpreter, sv::AbsIntSta
2570
2571
M isa Module || return CallMeta (Union{}, TypeError, EFFECTS_THROWS, NoCallInfo ())
2571
2572
s isa Symbol || return CallMeta (Union{}, TypeError, EFFECTS_THROWS, NoCallInfo ())
2572
2573
gr = GlobalRef (M, s)
2573
- (valid_worlds, (rte, T)) = scan_leaf_partitions (interp, gr, sv. world) do interp, binding, partition
2574
+ v′ = RefValue {Any} (v)
2575
+ (valid_worlds, (rte, T)) = scan_leaf_partitions (interp, gr, sv. world) do interp:: AbstractInterpreter , binding:: Core.Binding , partition:: Core.BindingPartition
2574
2576
partition_T = nothing
2575
2577
partition_rte = abstract_eval_partition_load (interp, binding, partition)
2576
2578
if binding_kind (partition) == PARTITION_KIND_GLOBAL
2577
2579
partition_T = partition_restriction (partition)
2578
2580
end
2579
- partition_exct = Union{partition_rte. exct, global_assignment_binding_rt_exct (interp, partition, v)[2 ]}
2581
+ partition_exct = Union{partition_rte. exct, global_assignment_binding_rt_exct (interp, partition, v′[] )[2 ]}
2580
2582
partition_rte = RTEffects (partition_rte. rt, partition_exct, partition_rte. effects)
2581
2583
Pair {RTEffects, Any} (partition_rte, partition_T)
2582
2584
end
@@ -3511,7 +3513,7 @@ function abstract_eval_binding_partition!(interp::AbstractInterpreter, g::Global
3511
3513
return partition
3512
3514
end
3513
3515
3514
- function abstract_eval_partition_load (interp:: Union{AbstractInterpreter, Nothing} , binding:: Core.Binding , partition:: Core.BindingPartition )
3516
+ function abstract_eval_partition_load (interp:: Union{AbstractInterpreter,Nothing} , binding:: Core.Binding , partition:: Core.BindingPartition )
3515
3517
kind = binding_kind (partition)
3516
3518
isdepwarn = (partition. kind & PARTITION_FLAG_DEPWARN) != 0
3517
3519
local_getglobal_effects = Effects (generic_getglobal_effects, effect_free= isdepwarn ? ALWAYS_FALSE : ALWAYS_TRUE)
@@ -3560,7 +3562,7 @@ function abstract_eval_partition_load(interp::Union{AbstractInterpreter, Nothing
3560
3562
return RTEffects (rt, exct, effects)
3561
3563
end
3562
3564
3563
- function scan_specified_partitions (query:: Function , walk_binding_partition:: Function , interp, g:: GlobalRef , wwr:: WorldWithRange )
3565
+ function scan_specified_partitions (query:: Function , walk_binding_partition:: Function , interp:: Union{AbstractInterpreter,Nothing} , g:: GlobalRef , wwr:: WorldWithRange )
3564
3566
local total_validity, rte, binding_partition
3565
3567
binding = convert (Core. Binding, g)
3566
3568
lookup_world = max_world (wwr. valid_worlds)
@@ -3593,19 +3595,25 @@ function scan_specified_partitions(query::Function, walk_binding_partition::Func
3593
3595
return Pair {WorldRange, typeof(rte)} (total_validity, rte)
3594
3596
end
3595
3597
3596
- scan_leaf_partitions (query:: Function , interp, g:: GlobalRef , wwr:: WorldWithRange ) =
3598
+ scan_leaf_partitions (query:: Function , :: Nothing , g:: GlobalRef , wwr:: WorldWithRange ) =
3599
+ scan_specified_partitions (query, walk_binding_partition, nothing , g, wwr)
3600
+ scan_leaf_partitions (query:: Function , interp:: AbstractInterpreter , g:: GlobalRef , wwr:: WorldWithRange ) =
3597
3601
scan_specified_partitions (query, walk_binding_partition, interp, g, wwr)
3598
3602
3599
- scan_partitions (query:: Function , interp, g:: GlobalRef , wwr:: WorldWithRange ) =
3600
- scan_specified_partitions (query,
3601
- (b:: Core.Binding , bpart:: Core.BindingPartition , world:: UInt )->
3602
- Pair {WorldRange, Pair{Core.Binding, Core.BindingPartition}} (WorldRange (bpart. min_world, bpart. max_world), b=> bpart),
3603
- interp, g, wwr)
3603
+ function scan_partitions (query:: Function , interp:: AbstractInterpreter , g:: GlobalRef , wwr:: WorldWithRange )
3604
+ walk_binding_partition = function (b:: Core.Binding , partition:: Core.BindingPartition , world:: UInt )
3605
+ Pair {WorldRange, Pair{Core.Binding, Core.BindingPartition}} (
3606
+ WorldRange (partition. min_world, partition. max_world), b=> partition)
3607
+ end
3608
+ return scan_specified_partitions (query, walk_binding_partition, interp, g, wwr)
3609
+ end
3604
3610
3605
- abstract_load_all_consistent_leaf_partitions (interp, g:: GlobalRef , wwr:: WorldWithRange ) =
3611
+ abstract_load_all_consistent_leaf_partitions (interp:: AbstractInterpreter , g:: GlobalRef , wwr:: WorldWithRange ) =
3606
3612
scan_leaf_partitions (abstract_eval_partition_load, interp, g, wwr)
3613
+ abstract_load_all_consistent_leaf_partitions (:: Nothing , g:: GlobalRef , wwr:: WorldWithRange ) =
3614
+ scan_leaf_partitions (abstract_eval_partition_load, nothing , g, wwr)
3607
3615
3608
- function abstract_eval_globalref (interp, g:: GlobalRef , saw_latestworld:: Bool , sv:: AbsIntState )
3616
+ function abstract_eval_globalref (interp:: AbstractInterpreter , g:: GlobalRef , saw_latestworld:: Bool , sv:: AbsIntState )
3609
3617
if saw_latestworld
3610
3618
return RTEffects (Any, Any, generic_getglobal_effects)
3611
3619
end
@@ -3621,7 +3629,10 @@ function global_assignment_rt_exct(interp::AbstractInterpreter, sv::AbsIntState,
3621
3629
if saw_latestworld
3622
3630
return Pair {Any,Any} (newty, ErrorException)
3623
3631
end
3624
- (valid_worlds, ret) = scan_partitions ((interp, _, partition)-> global_assignment_binding_rt_exct (interp, partition, newty), interp, g, sv. world)
3632
+ newty′ = RefValue {Any} (newty)
3633
+ (valid_worlds, ret) = scan_partitions (interp, g, sv. world) do interp:: AbstractInterpreter , :: Core.Binding , partition:: Core.BindingPartition
3634
+ global_assignment_binding_rt_exct (interp, partition, newty′[])
3635
+ end
3625
3636
update_valid_age! (sv, valid_worlds)
3626
3637
return ret
3627
3638
end
0 commit comments