@@ -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,8 @@ 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:: F1 , walk_binding_partition:: F2 ,
3613+ interp:: Union{AbstractInterpreter,Nothing} , g:: GlobalRef , wwr:: WorldWithRange ) where {F1,F2}
36113614 local total_validity, rte, binding_partition
36123615 binding = convert (Core. Binding, g)
36133616 lookup_world = max_world (wwr. valid_worlds)
@@ -3640,19 +3643,25 @@ function scan_specified_partitions(query::Function, walk_binding_partition::Func
36403643 return Pair {WorldRange, typeof(rte)} (total_validity, rte)
36413644end
36423645
3643- scan_leaf_partitions (query:: Function , interp, g:: GlobalRef , wwr:: WorldWithRange ) =
3646+ scan_leaf_partitions (query:: F , :: Nothing , g:: GlobalRef , wwr:: WorldWithRange ) where F =
3647+ scan_specified_partitions (query, walk_binding_partition, nothing , g, wwr)
3648+ scan_leaf_partitions (query:: F , interp:: AbstractInterpreter , g:: GlobalRef , wwr:: WorldWithRange ) where F =
36443649 scan_specified_partitions (query, walk_binding_partition, interp, g, wwr)
36453650
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)
3651+ function scan_partitions (query:: F , interp:: AbstractInterpreter , g:: GlobalRef , wwr:: WorldWithRange ) where F
3652+ walk_binding_partition = function (b:: Core.Binding , partition:: Core.BindingPartition , world:: UInt )
3653+ Pair {WorldRange, Pair{Core.Binding, Core.BindingPartition}} (
3654+ WorldRange (partition. min_world, partition. max_world), b=> partition)
3655+ end
3656+ return scan_specified_partitions (query, walk_binding_partition, interp, g, wwr)
3657+ end
36513658
3652- abstract_load_all_consistent_leaf_partitions (interp, g:: GlobalRef , wwr:: WorldWithRange ) =
3659+ abstract_load_all_consistent_leaf_partitions (interp:: AbstractInterpreter , g:: GlobalRef , wwr:: WorldWithRange ) =
36533660 scan_leaf_partitions (abstract_eval_partition_load, interp, g, wwr)
3661+ abstract_load_all_consistent_leaf_partitions (:: Nothing , g:: GlobalRef , wwr:: WorldWithRange ) =
3662+ scan_leaf_partitions (abstract_eval_partition_load, nothing , g, wwr)
36543663
3655- function abstract_eval_globalref (interp, g:: GlobalRef , saw_latestworld:: Bool , sv:: AbsIntState )
3664+ function abstract_eval_globalref (interp:: AbstractInterpreter , g:: GlobalRef , saw_latestworld:: Bool , sv:: AbsIntState )
36563665 if saw_latestworld
36573666 return RTEffects (Any, Any, generic_getglobal_effects)
36583667 end
@@ -3668,7 +3677,10 @@ function global_assignment_rt_exct(interp::AbstractInterpreter, sv::AbsIntState,
36683677 if saw_latestworld
36693678 return Pair {Any,Any} (newty, ErrorException)
36703679 end
3671- (valid_worlds, ret) = scan_partitions ((interp, _, partition)-> global_assignment_binding_rt_exct (interp, partition, newty), interp, g, sv. world)
3680+ newty′ = RefValue {Any} (newty)
3681+ (valid_worlds, ret) = scan_partitions (interp, g, sv. world) do interp:: AbstractInterpreter , :: Core.Binding , partition:: Core.BindingPartition
3682+ global_assignment_binding_rt_exct (interp, partition, newty′[])
3683+ end
36723684 update_valid_age! (sv, valid_worlds)
36733685 return ret
36743686end
@@ -3716,8 +3728,9 @@ struct AbstractEvalBasicStatementResult
37163728 end
37173729end
37183730
3719- function abstract_eval_basic_statement (interp:: AbstractInterpreter , @nospecialize (stmt), sstate:: StatementState , frame:: InferenceState ,
3720- result:: Union{Nothing,Future{RTEffects}} = nothing )
3731+ @inline function abstract_eval_basic_statement (
3732+ interp:: AbstractInterpreter , @nospecialize (stmt), sstate:: StatementState , frame:: InferenceState ,
3733+ result:: Union{Nothing,Future{RTEffects}} = nothing )
37213734 rt = nothing
37223735 exct = Bottom
37233736 changes = nothing
0 commit comments