@@ -2437,14 +2437,15 @@ function abstract_eval_getglobal(interp::AbstractInterpreter, sv::AbsIntState, s
24372437end
24382438
24392439@nospecs function abstract_eval_get_binding_type(interp:: AbstractInterpreter , sv:: AbsIntState , M, s)
2440+ @nospecialize M s
24402441 ⊑ = partialorder(typeinf_lattice(interp))
24412442 if isa(M, Const) && isa(s, Const)
24422443 (M, s) = (M. val, s. val)
24432444 if ! isa(M, Module) || ! isa(s, Symbol)
24442445 return CallMeta(Union{}, TypeError, EFFECTS_THROWS, NoCallInfo())
24452446 end
24462447 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
24482449 local rt
24492450 kind = binding_kind(partition)
24502451 if is_some_guard(kind) || kind == PARTITION_KIND_DECLARED
@@ -2574,13 +2575,14 @@ function abstract_eval_replaceglobal!(interp::AbstractInterpreter, sv::AbsIntSta
25742575 M isa Module || return CallMeta(Union{}, TypeError, EFFECTS_THROWS, NoCallInfo())
25752576 s isa Symbol || return CallMeta(Union{}, TypeError, EFFECTS_THROWS, NoCallInfo())
25762577 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
25782580 partition_T = nothing
25792581 partition_rte = abstract_eval_partition_load(interp, binding, partition)
25802582 if binding_kind(partition) == PARTITION_KIND_GLOBAL
25812583 partition_T = partition_restriction(partition)
25822584 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 ]}
25842586 partition_rte = RTEffects(partition_rte. rt, partition_exct, partition_rte. effects)
25852587 Pair{RTEffects, Any}(partition_rte, partition_T)
25862588 end
@@ -3558,7 +3560,7 @@ function abstract_eval_binding_partition!(interp::AbstractInterpreter, g::Global
35583560 return partition
35593561end
35603562
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 )
35623564 kind = binding_kind(partition)
35633565 isdepwarn = (partition. kind & PARTITION_FLAG_DEPWARN) != 0
35643566 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
36073609 return RTEffects(rt, exct, effects)
36083610end
36093611
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 )
36113613 local total_validity, rte, binding_partition
36123614 binding = convert(Core. Binding, g)
36133615 lookup_world = max_world(wwr. valid_worlds)
@@ -3640,19 +3642,25 @@ function scan_specified_partitions(query::Function, walk_binding_partition::Func
36403642 return Pair{WorldRange, typeof(rte)}(total_validity, rte)
36413643end
36423644
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 ) =
36443648 scan_specified_partitions(query, walk_binding_partition, interp, g, wwr)
36453649
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
36513657
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 ) =
36533659 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)
36543662
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 )
36563664 if saw_latestworld
36573665 return RTEffects(Any, Any, generic_getglobal_effects)
36583666 end
@@ -3668,7 +3676,10 @@ function global_assignment_rt_exct(interp::AbstractInterpreter, sv::AbsIntState,
36683676 if saw_latestworld
36693677 return Pair{Any,Any}(newty, ErrorException)
36703678 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
36723683 update_valid_age!(sv, valid_worlds)
36733684 return ret
36743685end
0 commit comments