@@ -2,7 +2,7 @@ isassign(frame::Frame) = isassign(frame, frame.pc)
22isassign (frame:: Frame , pc:: Int ) = (pc in frame. framecode. used)
33
44lookup_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)
66function 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)
0 commit comments