Skip to content

Commit 3ab3a11

Browse files
authored
More 1.12 world age adjustments (#658)
1 parent ba9783b commit 3ab3a11

File tree

6 files changed

+24
-16
lines changed

6 files changed

+24
-16
lines changed

src/construct.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -479,8 +479,8 @@ function queuenext!(iter::ExprSplitter)
479479
if head === :module
480480
# Find or create the module
481481
newname = ex.args[2]::Symbol
482-
if isdefined(mod, newname)
483-
newmod = getfield(mod, newname)
482+
if invokelatest(isdefined, mod, newname)
483+
newmod = invokelatest(getfield, mod, newname)
484484
newmod isa Module || throw(ErrorException("invalid redefinition of constant $(newname)"))
485485
mod = newmod
486486
else

src/interpret.jl

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ isassign(frame::Frame) = isassign(frame, frame.pc)
22
isassign(frame::Frame, pc::Int) = (pc in frame.framecode.used)
33

44
lookup_var(frame::Frame, val::SSAValue) = frame.framedata.ssavalues[val.id]
5-
lookup_var(frame::Frame, ref::GlobalRef) = @invokelatest getfield(ref.mod, ref.name)
5+
lookup_var(frame::Frame, ref::GlobalRef) = invokelatest(getfield, ref.mod, ref.name)
66
function lookup_var(frame::Frame, slot::SlotNumber)
77
val = frame.framedata.locals[slot.id]
88
val !== nothing && return val.value
@@ -31,7 +31,7 @@ macro lookup(args...)
3131
nodetmp = gensym(:node) # used to hoist, e.g., args[4]
3232
if havemod
3333
fallback = quote
34-
isa($nodetmp, Symbol) ? getfield($(esc(mod)), $nodetmp) :
34+
isa($nodetmp, Symbol) ? invokelatest(getfield, $(esc(mod)), $nodetmp) :
3535
$nodetmp
3636
end
3737
else
@@ -45,7 +45,7 @@ macro lookup(args...)
4545
isa($nodetmp, GlobalRef) ? lookup_var($(esc(frame)), $nodetmp) :
4646
isa($nodetmp, SlotNumber) ? lookup_var($(esc(frame)), $nodetmp) :
4747
isa($nodetmp, QuoteNode) ? $nodetmp.value :
48-
isa($nodetmp, Symbol) ? getfield(moduleof($(esc(frame))), $nodetmp) :
48+
isa($nodetmp, Symbol) ? invokelatest(getfield, moduleof($(esc(frame))), $nodetmp) :
4949
isa($nodetmp, Expr) ? lookup_expr($(esc(frame)), $nodetmp) :
5050
$fallback
5151
end
@@ -90,7 +90,7 @@ function lookup_or_eval(@nospecialize(recurse), frame::Frame, @nospecialize(node
9090
elseif isa(node, GlobalRef)
9191
return lookup_var(frame, node)
9292
elseif isa(node, Symbol)
93-
return getfield(moduleof(frame), node)
93+
return invokelatest(getfield, moduleof(frame), node)
9494
elseif isa(node, QuoteNode)
9595
return node.value
9696
elseif isa(node, Expr)
@@ -111,7 +111,7 @@ function lookup_or_eval(@nospecialize(recurse), frame::Frame, @nospecialize(node
111111
elseif f === typeassert && length(ex.args) == 3
112112
return typeassert(ex.args[2], ex.args[3])
113113
elseif f === Base.getproperty && length(ex.args) == 3
114-
return Base.getproperty(ex.args[2], ex.args[3])
114+
return invokelatest(Base.getproperty, ex.args[2], ex.args[3])
115115
elseif f === Core.Compiler.Val && length(ex.args) == 2
116116
return Core.Compiler.Val(ex.args[2])
117117
elseif f === Val && length(ex.args) == 2
@@ -311,10 +311,16 @@ function evaluate_methoddef(frame::Frame, node::Expr)
311311
if f isa Symbol || f isa GlobalRef
312312
mod = f isa Symbol ? moduleof(frame) : f.mod
313313
name = f isa Symbol ? f : f.name
314-
if Base.isbindingresolved(mod, name) && @invokelatest isdefined(mod, name) # `isdefined` accesses the binding, making it impossible to create a new one
315-
f = @invokelatest getfield(mod, name)
314+
if isbindingresolved_deprecated
315+
f = Core.eval(mod, Expr(:function, name))
316316
else
317-
f = Core.eval(mod, Expr(:function, name)) # create a new function
317+
# TODO: This logic isn't fully correct, but it's been used for a long
318+
# time, so let's leave it for now.
319+
if Base.isbindingresolved(mod, name) && @invokelatest isdefined(mod, name) # `isdefined` accesses the binding, making it impossible to create a new one
320+
f = @invokelatest getfield(mod, name)
321+
else
322+
f = Core.eval(mod, Expr(:function, name)) # create a new function
323+
end
318324
end
319325
end
320326
length(node.args) == 1 && return f
@@ -563,7 +569,7 @@ function step_expr!(@nospecialize(recurse), frame::Frame, @nospecialize(node), i
563569
# FIXME: undefine the slot?
564570
elseif istoplevel && isa(node, LineNumberNode)
565571
elseif istoplevel && isa(node, Symbol)
566-
rhs = getfield(moduleof(frame), node)
572+
rhs = invokelatest(getfield, moduleof(frame), node)
567573
elseif @static (isdefined(Core.IR, :EnterNode) && true) && isa(node, Core.IR.EnterNode)
568574
rhs = node.catch_dest
569575
push!(data.exception_frames, rhs)

src/localmethtable.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ function get_call_framecode(fargs::Vector{Any}, parentframe::FrameCode, idx::Int
6161
# We haven't yet encountered this argtype combination and need to look it up by dispatch
6262
fargs[1] = f = to_function(fargs[1])
6363
ret = prepare_call(f, fargs; enter_generated=enter_generated)
64-
ret === nothing && return f(fargs[2:end]...), nothing
64+
ret === nothing && return invokelatest(f, fargs[2:end]...), nothing
6565
is_compiled = isa(ret[1], Compiled)
6666
local framecode
6767
if is_compiled

src/optimize.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,12 @@ function smallest_ref(stmts, arg, idmin)
2323
return idmin
2424
end
2525

26+
const isbindingresolved_deprecated = which(Base.isbindingresolved, Tuple{Module, Symbol}).file == Symbol("deprecated.jl")
2627
function lookup_global_ref(a::GlobalRef)
27-
if (Base.isbindingresolved(a.mod, a.name) &&
28+
isbindingresolved_deprecated && return a
29+
if Base.isbindingresolved(a.mod, a.name) &&
2830
(@invokelatest isdefined(a.mod, a.name)) &&
29-
(@invokelatest isconst(a.mod, a.name)))
31+
(@invokelatest isconst(a.mod, a.name))
3032
return QuoteNode(@invokelatest getfield(a.mod, a.name))
3133
end
3234
return a

src/packagedef.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
using Base.Meta
2-
import Base: +, -, convert, isless, get_world_counter, mapany, ntupleany
2+
import Base: +, -, convert, isless, get_world_counter, mapany, ntupleany, invokelatest
33
using Core: CodeInfo, SimpleVector, LineInfoNode, GotoNode, GotoIfNot, ReturnNode,
44
GeneratedFunctionStub, MethodInstance, NewvarNode, TypeName
55

src/utils.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ end
2222
_Typeof(x) = isa(x, Type) ? Type{x} : typeof(x)
2323

2424
function to_function(@nospecialize(x))
25-
isa(x, GlobalRef) ? getfield(x.mod, x.name) : x
25+
isa(x, GlobalRef) ? invokelatest(getfield, x.mod, x.name) : x
2626
end
2727

2828
"""

0 commit comments

Comments
 (0)