Skip to content

Commit 5c869cd

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

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
@@ -2437,14 +2437,15 @@ function abstract_eval_getglobal(interp::AbstractInterpreter, sv::AbsIntState, s
24372437
end
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
35593561
end
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)
36083610
end
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)
36413643
end
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
36743685
end

0 commit comments

Comments
 (0)