@@ -9,46 +9,33 @@ function lookup_var(frame::Frame, slot::SlotNumber)
9
9
throw (UndefVarError (frame. framecode. src. slotnames[slot. id]))
10
10
end
11
11
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
+
12
24
"""
13
25
rhs = @lookup(frame, node)
14
- rhs = @lookup(mod, frame, node)
15
26
16
27
This macro looks up previously-computed values referenced as SSAValues, SlotNumbers,
17
28
GlobalRefs, 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.
21
31
"""
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)
52
39
end
53
40
54
41
function lookup_expr (frame:: Frame , e:: Expr )
@@ -156,13 +143,12 @@ end
156
143
function collect_args (@nospecialize (recurse), frame:: Frame , call_expr:: Expr ; isfc:: Bool = false )
157
144
args = frame. framedata. callargs
158
145
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 ])
161
147
for i = 2 : length (args)
162
148
if isexpr (call_expr. args[i], :call )
163
149
args[i] = lookup_or_eval (recurse, frame, call_expr. args[i])
164
150
else
165
- args[i] = @lookup (mod, frame, call_expr. args[i])
151
+ args[i] = @lookup (frame, call_expr. args[i])
166
152
end
167
153
end
168
154
return args
@@ -396,17 +382,13 @@ maybe_assign!(frame::Frame, @nospecialize(val)) = maybe_assign!(frame, pc_expr(f
396
382
function eval_rhs (@nospecialize (recurse), frame:: Frame , node:: Expr )
397
383
head = node. head
398
384
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]
403
386
T = popfirst! (args):: DataType
404
387
rhs = ccall (:jl_new_structv , Any, (Any, Ptr{Any}, UInt32), T, args, length (args))
405
388
return rhs
406
389
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
410
392
rhs = ccall (:jl_new_structt , Any, (Any, Any), T, args)
411
393
return rhs
412
394
elseif head === :isdefined
@@ -502,7 +484,7 @@ function step_expr!(@nospecialize(recurse), frame::Frame, @nospecialize(node), i
502
484
if isa (rhs, Expr)
503
485
rhs = eval_rhs (recurse, frame, rhs)
504
486
else
505
- rhs = istoplevel ? @lookup ( moduleof (frame), frame, rhs) : @lookup (frame, rhs)
487
+ rhs = @lookup (frame, rhs)
506
488
end
507
489
isa (rhs, BreakpointRef) && return rhs
508
490
do_assignment! (frame, lhs, rhs)
0 commit comments