Skip to content

Commit 49220f9

Browse files
authored
deprecate 3-arg @lookup (#684)
The fallback code for the three-argument form of `@lookup` is never actually reached, so there is no need to maintain this version. The module context can always be taken from the `frame`. For these reasons, the three-argument version of `@lookup` is deprecated and will be removed in v0.10.
1 parent 93f6473 commit 49220f9

File tree

1 file changed

+27
-45
lines changed

1 file changed

+27
-45
lines changed

src/interpret.jl

Lines changed: 27 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -9,46 +9,33 @@ function lookup_var(frame::Frame, slot::SlotNumber)
99
throw(UndefVarError(frame.framecode.src.slotnames[slot.id]))
1010
end
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
1627
This macro looks up previously-computed values referenced as SSAValues, SlotNumbers,
1728
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.
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)
5239
end
5340

5441
function lookup_expr(frame::Frame, e::Expr)
@@ -156,13 +143,12 @@ end
156143
function 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
396382
function 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

Comments
 (0)