Skip to content

Commit bba8a82

Browse files
committed
inference: minor refactoring on abstractinterpretation.jl (#58154)
- add missing `@nospecialize` annotation - add more type annotations to functions - fixed capturing uninferrable variables
1 parent 980347d commit bba8a82

File tree

1 file changed

+25
-14
lines changed

1 file changed

+25
-14
lines changed

Compiler/src/abstractinterpretation.jl

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2433,14 +2433,15 @@ function abstract_eval_getglobal(interp::AbstractInterpreter, sv::AbsIntState, s
24332433
end
24342434

24352435
@nospecs function abstract_eval_get_binding_type(interp::AbstractInterpreter, sv::AbsIntState, M, s)
2436+
@nospecialize M s
24362437
= partialorder(typeinf_lattice(interp))
24372438
if isa(M, Const) && isa(s, Const)
24382439
(M, s) = (M.val, s.val)
24392440
if !isa(M, Module) || !isa(s, Symbol)
24402441
return CallMeta(Union{}, TypeError, EFFECTS_THROWS, NoCallInfo())
24412442
end
24422443
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
24442445
local rt
24452446
kind = binding_kind(partition)
24462447
if is_some_guard(kind) || kind == PARTITION_KIND_DECLARED
@@ -2570,13 +2571,14 @@ function abstract_eval_replaceglobal!(interp::AbstractInterpreter, sv::AbsIntSta
25702571
M isa Module || return CallMeta(Union{}, TypeError, EFFECTS_THROWS, NoCallInfo())
25712572
s isa Symbol || return CallMeta(Union{}, TypeError, EFFECTS_THROWS, NoCallInfo())
25722573
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
25742576
partition_T = nothing
25752577
partition_rte = abstract_eval_partition_load(interp, binding, partition)
25762578
if binding_kind(partition) == PARTITION_KIND_GLOBAL
25772579
partition_T = partition_restriction(partition)
25782580
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]}
25802582
partition_rte = RTEffects(partition_rte.rt, partition_exct, partition_rte.effects)
25812583
Pair{RTEffects, Any}(partition_rte, partition_T)
25822584
end
@@ -3511,7 +3513,7 @@ function abstract_eval_binding_partition!(interp::AbstractInterpreter, g::Global
35113513
return partition
35123514
end
35133515

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)
35153517
kind = binding_kind(partition)
35163518
isdepwarn = (partition.kind & PARTITION_FLAG_DEPWARN) != 0
35173519
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
35603562
return RTEffects(rt, exct, effects)
35613563
end
35623564

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)
35643566
local total_validity, rte, binding_partition
35653567
binding = convert(Core.Binding, g)
35663568
lookup_world = max_world(wwr.valid_worlds)
@@ -3593,19 +3595,25 @@ function scan_specified_partitions(query::Function, walk_binding_partition::Func
35933595
return Pair{WorldRange, typeof(rte)}(total_validity, rte)
35943596
end
35953597

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) =
35973601
scan_specified_partitions(query, walk_binding_partition, interp, g, wwr)
35983602

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
36043610

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) =
36063612
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)
36073615

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)
36093617
if saw_latestworld
36103618
return RTEffects(Any, Any, generic_getglobal_effects)
36113619
end
@@ -3621,7 +3629,10 @@ function global_assignment_rt_exct(interp::AbstractInterpreter, sv::AbsIntState,
36213629
if saw_latestworld
36223630
return Pair{Any,Any}(newty, ErrorException)
36233631
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
36253636
update_valid_age!(sv, valid_worlds)
36263637
return ret
36273638
end

0 commit comments

Comments
 (0)