@@ -2437,14 +2437,15 @@ function abstract_eval_getglobal(interp::AbstractInterpreter, sv::AbsIntState, s
2437
2437
end
2438
2438
2439
2439
@nospecs function abstract_eval_get_binding_type (interp:: AbstractInterpreter , sv:: AbsIntState , M, s)
2440
+ @nospecialize M s
2440
2441
⊑ = partialorder (typeinf_lattice (interp))
2441
2442
if isa (M, Const) && isa (s, Const)
2442
2443
(M, s) = (M. val, s. val)
2443
2444
if ! isa (M, Module) || ! isa (s, Symbol)
2444
2445
return CallMeta (Union{}, TypeError, EFFECTS_THROWS, NoCallInfo ())
2445
2446
end
2446
2447
gr = GlobalRef (M, s)
2447
- (valid_worlds, rt) = scan_leaf_partitions (interp, gr, sv. world) do interp, _ , partition
2448
+ (valid_worlds, rt) = scan_leaf_partitions (interp, gr, sv. world) do interp:: AbstractInterpreter , :: Core.Binding , partition:: Core.BindingPartition
2448
2449
local rt
2449
2450
kind = binding_kind (partition)
2450
2451
if is_some_guard (kind) || kind == PARTITION_KIND_DECLARED
@@ -2574,13 +2575,14 @@ function abstract_eval_replaceglobal!(interp::AbstractInterpreter, sv::AbsIntSta
2574
2575
M isa Module || return CallMeta (Union{}, TypeError, EFFECTS_THROWS, NoCallInfo ())
2575
2576
s isa Symbol || return CallMeta (Union{}, TypeError, EFFECTS_THROWS, NoCallInfo ())
2576
2577
gr = GlobalRef (M, s)
2577
- (valid_worlds, (rte, T)) = scan_leaf_partitions (interp, gr, sv. world) do interp, binding, partition
2578
+ v′ = RefValue {Any} (v)
2579
+ (valid_worlds, (rte, T)) = scan_leaf_partitions (interp, gr, sv. world) do interp:: AbstractInterpreter , binding:: Core.Binding , partition:: Core.BindingPartition
2578
2580
partition_T = nothing
2579
2581
partition_rte = abstract_eval_partition_load (interp, binding, partition)
2580
2582
if binding_kind (partition) == PARTITION_KIND_GLOBAL
2581
2583
partition_T = partition_restriction (partition)
2582
2584
end
2583
- partition_exct = Union{partition_rte. exct, global_assignment_binding_rt_exct (interp, partition, v)[2 ]}
2585
+ partition_exct = Union{partition_rte. exct, global_assignment_binding_rt_exct (interp, partition, v′[] )[2 ]}
2584
2586
partition_rte = RTEffects (partition_rte. rt, partition_exct, partition_rte. effects)
2585
2587
Pair {RTEffects, Any} (partition_rte, partition_T)
2586
2588
end
@@ -3558,7 +3560,7 @@ function abstract_eval_binding_partition!(interp::AbstractInterpreter, g::Global
3558
3560
return partition
3559
3561
end
3560
3562
3561
- function abstract_eval_partition_load (interp:: Union{AbstractInterpreter, Nothing} , binding:: Core.Binding , partition:: Core.BindingPartition )
3563
+ function abstract_eval_partition_load (interp:: Union{AbstractInterpreter,Nothing} , binding:: Core.Binding , partition:: Core.BindingPartition )
3562
3564
kind = binding_kind (partition)
3563
3565
isdepwarn = (partition. kind & PARTITION_FLAG_DEPWARN) != 0
3564
3566
local_getglobal_effects = Effects (generic_getglobal_effects, effect_free= isdepwarn ? ALWAYS_FALSE : ALWAYS_TRUE)
@@ -3607,7 +3609,7 @@ function abstract_eval_partition_load(interp::Union{AbstractInterpreter, Nothing
3607
3609
return RTEffects (rt, exct, effects)
3608
3610
end
3609
3611
3610
- function scan_specified_partitions (query:: Function , walk_binding_partition:: Function , interp, g:: GlobalRef , wwr:: WorldWithRange )
3612
+ function scan_specified_partitions (query:: Function , walk_binding_partition:: Function , interp:: Union{AbstractInterpreter,Nothing} , g:: GlobalRef , wwr:: WorldWithRange )
3611
3613
local total_validity, rte, binding_partition
3612
3614
binding = convert (Core. Binding, g)
3613
3615
lookup_world = max_world (wwr. valid_worlds)
@@ -3640,19 +3642,25 @@ function scan_specified_partitions(query::Function, walk_binding_partition::Func
3640
3642
return Pair {WorldRange, typeof(rte)} (total_validity, rte)
3641
3643
end
3642
3644
3643
- scan_leaf_partitions (query:: Function , interp, g:: GlobalRef , wwr:: WorldWithRange ) =
3645
+ scan_leaf_partitions (query:: Function , :: Nothing , g:: GlobalRef , wwr:: WorldWithRange ) =
3646
+ scan_specified_partitions (query, walk_binding_partition, nothing , g, wwr)
3647
+ scan_leaf_partitions (query:: Function , interp:: AbstractInterpreter , g:: GlobalRef , wwr:: WorldWithRange ) =
3644
3648
scan_specified_partitions (query, walk_binding_partition, interp, g, wwr)
3645
3649
3646
- scan_partitions (query:: Function , interp, g:: GlobalRef , wwr:: WorldWithRange ) =
3647
- scan_specified_partitions (query,
3648
- (b:: Core.Binding , bpart:: Core.BindingPartition , world:: UInt )->
3649
- Pair {WorldRange, Pair{Core.Binding, Core.BindingPartition}} (WorldRange (bpart. min_world, bpart. max_world), b=> bpart),
3650
- interp, g, wwr)
3650
+ function scan_partitions (query:: Function , interp:: AbstractInterpreter , g:: GlobalRef , wwr:: WorldWithRange )
3651
+ walk_binding_partition = function (b:: Core.Binding , partition:: Core.BindingPartition , world:: UInt )
3652
+ Pair {WorldRange, Pair{Core.Binding, Core.BindingPartition}} (
3653
+ WorldRange (partition. min_world, partition. max_world), b=> partition)
3654
+ end
3655
+ return scan_specified_partitions (query, walk_binding_partition, interp, g, wwr)
3656
+ end
3651
3657
3652
- abstract_load_all_consistent_leaf_partitions (interp, g:: GlobalRef , wwr:: WorldWithRange ) =
3658
+ abstract_load_all_consistent_leaf_partitions (interp:: AbstractInterpreter , g:: GlobalRef , wwr:: WorldWithRange ) =
3653
3659
scan_leaf_partitions (abstract_eval_partition_load, interp, g, wwr)
3660
+ abstract_load_all_consistent_leaf_partitions (:: Nothing , g:: GlobalRef , wwr:: WorldWithRange ) =
3661
+ scan_leaf_partitions (abstract_eval_partition_load, nothing , g, wwr)
3654
3662
3655
- function abstract_eval_globalref (interp, g:: GlobalRef , saw_latestworld:: Bool , sv:: AbsIntState )
3663
+ function abstract_eval_globalref (interp:: AbstractInterpreter , g:: GlobalRef , saw_latestworld:: Bool , sv:: AbsIntState )
3656
3664
if saw_latestworld
3657
3665
return RTEffects (Any, Any, generic_getglobal_effects)
3658
3666
end
@@ -3668,7 +3676,10 @@ function global_assignment_rt_exct(interp::AbstractInterpreter, sv::AbsIntState,
3668
3676
if saw_latestworld
3669
3677
return Pair {Any,Any} (newty, ErrorException)
3670
3678
end
3671
- (valid_worlds, ret) = scan_partitions ((interp, _, partition)-> global_assignment_binding_rt_exct (interp, partition, newty), interp, g, sv. world)
3679
+ newty′ = RefValue {Any} (newty)
3680
+ (valid_worlds, ret) = scan_partitions (interp, g, sv. world) do interp:: AbstractInterpreter , :: Core.Binding , partition:: Core.BindingPartition
3681
+ global_assignment_binding_rt_exct (interp, partition, newty′[])
3682
+ end
3672
3683
update_valid_age! (sv, valid_worlds)
3673
3684
return ret
3674
3685
end
0 commit comments