@@ -2,7 +2,7 @@ isassign(frame::Frame) = isassign(frame, frame.pc)
2
2
isassign (frame:: Frame , pc:: Int ) = (pc in frame. framecode. used)
3
3
4
4
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)
6
6
function lookup_var (frame:: Frame , slot:: SlotNumber )
7
7
val = frame. framedata. locals[slot. id]
8
8
val != = nothing && return val. value
@@ -31,7 +31,7 @@ macro lookup(args...)
31
31
nodetmp = gensym (:node ) # used to hoist, e.g., args[4]
32
32
if havemod
33
33
fallback = quote
34
- isa ($ nodetmp, Symbol) ? getfield ( $ (esc (mod)), $ nodetmp) :
34
+ isa ($ nodetmp, Symbol) ? invokelatest (getfield, $ (esc (mod)), $ nodetmp) :
35
35
$ nodetmp
36
36
end
37
37
else
@@ -45,7 +45,7 @@ macro lookup(args...)
45
45
isa ($ nodetmp, GlobalRef) ? lookup_var ($ (esc (frame)), $ nodetmp) :
46
46
isa ($ nodetmp, SlotNumber) ? lookup_var ($ (esc (frame)), $ nodetmp) :
47
47
isa ($ nodetmp, QuoteNode) ? $ nodetmp. value :
48
- isa ($ nodetmp, Symbol) ? getfield ( moduleof ($ (esc (frame))), $ nodetmp) :
48
+ isa ($ nodetmp, Symbol) ? invokelatest (getfield, moduleof ($ (esc (frame))), $ nodetmp) :
49
49
isa ($ nodetmp, Expr) ? lookup_expr ($ (esc (frame)), $ nodetmp) :
50
50
$ fallback
51
51
end
@@ -90,7 +90,7 @@ function lookup_or_eval(@nospecialize(recurse), frame::Frame, @nospecialize(node
90
90
elseif isa (node, GlobalRef)
91
91
return lookup_var (frame, node)
92
92
elseif isa (node, Symbol)
93
- return getfield ( moduleof (frame), node)
93
+ return invokelatest (getfield, moduleof (frame), node)
94
94
elseif isa (node, QuoteNode)
95
95
return node. value
96
96
elseif isa (node, Expr)
@@ -111,7 +111,7 @@ function lookup_or_eval(@nospecialize(recurse), frame::Frame, @nospecialize(node
111
111
elseif f === typeassert && length (ex. args) == 3
112
112
return typeassert (ex. args[2 ], ex. args[3 ])
113
113
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 ])
115
115
elseif f === Core. Compiler. Val && length (ex. args) == 2
116
116
return Core. Compiler. Val (ex. args[2 ])
117
117
elseif f === Val && length (ex. args) == 2
@@ -311,10 +311,16 @@ function evaluate_methoddef(frame::Frame, node::Expr)
311
311
if f isa Symbol || f isa GlobalRef
312
312
mod = f isa Symbol ? moduleof (frame) : f. mod
313
313
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) )
316
316
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
318
324
end
319
325
end
320
326
length (node. args) == 1 && return f
@@ -563,7 +569,7 @@ function step_expr!(@nospecialize(recurse), frame::Frame, @nospecialize(node), i
563
569
# FIXME : undefine the slot?
564
570
elseif istoplevel && isa (node, LineNumberNode)
565
571
elseif istoplevel && isa (node, Symbol)
566
- rhs = getfield ( moduleof (frame), node)
572
+ rhs = invokelatest (getfield, moduleof (frame), node)
567
573
elseif @static (isdefined (Core. IR, :EnterNode ) && true ) && isa (node, Core. IR. EnterNode)
568
574
rhs = node. catch_dest
569
575
push! (data. exception_frames, rhs)
0 commit comments