@@ -9,46 +9,33 @@ function lookup_var(frame::Frame, slot::SlotNumber)
99 throw (UndefVarError (frame. framecode. src. slotnames[slot. id]))
1010end
1111
12+ function gen_lookup_ex (frame, node)
13+ :(let node = $ (esc (node))
14+ isa (node, SSAValue) ? lookup_var ($ (esc (frame)), node) :
15+ isa (node, GlobalRef) ? lookup_var ($ (esc (frame)), node) :
16+ isa (node, SlotNumber) ? lookup_var ($ (esc (frame)), node) :
17+ isa (node, QuoteNode) ? node. value :
18+ isa (node, Symbol) ? @invokelatest (getglobal (moduleof ($ (esc (frame))), node)) :
19+ isa (node, Expr) ? lookup_expr ($ (esc (frame)), node) :
20+ node # fallback
21+ end )
22+ end
23+
1224"""
1325 rhs = @lookup(frame, node)
14- rhs = @lookup(mod, frame, node)
1526
1627This macro looks up previously-computed values referenced as SSAValues, SlotNumbers,
1728GlobalRefs, QuoteNode, sparam or exception reference expression.
18- It will also lookup symbols in `moduleof(frame)`; this can be supplied ahead-of-time via
19- the 3-argument version.
20- If none of the above apply, the value of `node` will be returned.
29+ It will also lookup symbols in `moduleof(frame)`.
30+ If none of the above apply, the value of `node` itself will be returned.
2131"""
22- macro lookup (args... )
23- length (args) == 2 || length (args) == 3 || error (" invalid number of arguments " , length (args))
24- havemod = length (args) == 3
25- local mod
26- if havemod
27- mod, frame, node = args
28- else
29- frame, node = args
30- end
31- nodetmp = gensym (:node ) # used to hoist, e.g., args[4]
32- if havemod
33- fallback = quote
34- isa ($ nodetmp, Symbol) ? invokelatest (getfield, $ (esc (mod)), $ nodetmp) :
35- $ nodetmp
36- end
37- else
38- fallback = quote
39- $ nodetmp
40- end
41- end
42- quote
43- $ nodetmp = $ (esc (node))
44- isa ($ nodetmp, SSAValue) ? lookup_var ($ (esc (frame)), $ nodetmp) :
45- isa ($ nodetmp, GlobalRef) ? lookup_var ($ (esc (frame)), $ nodetmp) :
46- isa ($ nodetmp, SlotNumber) ? lookup_var ($ (esc (frame)), $ nodetmp) :
47- isa ($ nodetmp, QuoteNode) ? $ nodetmp. value :
48- isa ($ nodetmp, Symbol) ? invokelatest (getfield, moduleof ($ (esc (frame))), $ nodetmp) :
49- isa ($ nodetmp, Expr) ? lookup_expr ($ (esc (frame)), $ nodetmp) :
50- $ fallback
51- end
32+ macro lookup (frame, node)
33+ return gen_lookup_ex (frame, node)
34+ end
35+ macro lookup (_, frame, node)
36+ f, l = __source__. file, __source__. line
37+ @warn " `@lookup(mod, frame, node)` at $f :$l is deprecated, use `@lookup(frame, node)` instead."
38+ return gen_lookup_ex (frame, node)
5239end
5340
5441function lookup_expr (frame:: Frame , e:: Expr )
@@ -156,13 +143,12 @@ end
156143function collect_args (@nospecialize (recurse), frame:: Frame , call_expr:: Expr ; isfc:: Bool = false )
157144 args = frame. framedata. callargs
158145 resize! (args, length (call_expr. args))
159- mod = moduleof (frame)
160- args[1 ] = isfc ? resolvefc (frame, call_expr. args[1 ]) : @lookup (mod, frame, call_expr. args[1 ])
146+ args[1 ] = isfc ? resolvefc (frame, call_expr. args[1 ]) : @lookup (frame, call_expr. args[1 ])
161147 for i = 2 : length (args)
162148 if isexpr (call_expr. args[i], :call )
163149 args[i] = lookup_or_eval (recurse, frame, call_expr. args[i])
164150 else
165- args[i] = @lookup (mod, frame, call_expr. args[i])
151+ args[i] = @lookup (frame, call_expr. args[i])
166152 end
167153 end
168154 return args
@@ -396,17 +382,13 @@ maybe_assign!(frame::Frame, @nospecialize(val)) = maybe_assign!(frame, pc_expr(f
396382function eval_rhs (@nospecialize (recurse), frame:: Frame , node:: Expr )
397383 head = node. head
398384 if head === :new
399- mod = moduleof (frame)
400- args = let mod= mod
401- Any[@lookup (mod, frame, arg) for arg in node. args]
402- end
385+ args = Any[@lookup (frame, arg) for arg in node. args]
403386 T = popfirst! (args):: DataType
404387 rhs = ccall (:jl_new_structv , Any, (Any, Ptr{Any}, UInt32), T, args, length (args))
405388 return rhs
406389 elseif head === :splatnew # Julia 1.2+
407- mod = moduleof (frame)
408- T = @lookup (mod, frame, node. args[1 ]):: DataType
409- args = @lookup (mod, frame, node. args[2 ]):: Tuple
390+ T = @lookup (frame, node. args[1 ]):: DataType
391+ args = @lookup (frame, node. args[2 ]):: Tuple
410392 rhs = ccall (:jl_new_structt , Any, (Any, Any), T, args)
411393 return rhs
412394 elseif head === :isdefined
@@ -502,7 +484,7 @@ function step_expr!(@nospecialize(recurse), frame::Frame, @nospecialize(node), i
502484 if isa (rhs, Expr)
503485 rhs = eval_rhs (recurse, frame, rhs)
504486 else
505- rhs = istoplevel ? @lookup ( moduleof (frame), frame, rhs) : @lookup (frame, rhs)
487+ rhs = @lookup (frame, rhs)
506488 end
507489 isa (rhs, BreakpointRef) && return rhs
508490 do_assignment! (frame, lhs, rhs)
0 commit comments