Skip to content

Commit bca0175

Browse files
authored
recurse in builtin expansion if we get a new builtin when expanding (#519)
1 parent d7fbc26 commit bca0175

File tree

2 files changed

+25
-4
lines changed

2 files changed

+25
-4
lines changed

src/builtins.jl

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,16 @@ end
1313
const kwinvoke_name = isdefined(Core, Symbol("#kw##invoke")) ? Symbol("#kw##invoke") : Symbol("##invoke")
1414
const kwinvoke_instance = getfield(Core, kwinvoke_name).instance
1515

16+
17+
function maybe_recurse_expanded_builtin(frame, new_expr)
18+
f = new_expr.args[1]
19+
if isa(f, Core.Builtin) || isa(f, Core.IntrinsicFunction)
20+
return maybe_evaluate_builtin(frame, new_expr, true)
21+
else
22+
return new_expr
23+
end
24+
end
25+
1626
"""
1727
ret = maybe_evaluate_builtin(frame, call_expr, expand::Bool)
1828
@@ -58,7 +68,7 @@ function maybe_evaluate_builtin(frame, call_expr, expand::Bool)
5868
for x in argsflat
5969
push!(new_expr.args, (isa(x, Symbol) || isa(x, Expr) || isa(x, QuoteNode)) ? QuoteNode(x) : x)
6070
end
61-
return new_expr
71+
return maybe_recurse_expanded_builtin(frame, new_expr)
6272
elseif @static isdefined(Core, :_call_latest) ? f === Core._call_latest : false
6373
args = getargs(args, frame)
6474
if !expand
@@ -69,7 +79,7 @@ function maybe_evaluate_builtin(frame, call_expr, expand::Bool)
6979
for x in args
7080
push!(new_expr.args, (isa(x, Symbol) || isa(x, Expr) || isa(x, QuoteNode)) ? QuoteNode(x) : x)
7181
end
72-
return new_expr
82+
return maybe_recurse_expanded_builtin(frame, new_expr)
7383
elseif @static isdefined(Core, :_apply_latest) ? f === Core._apply_latest : false
7484
args = getargs(args, frame)
7585
if !expand
@@ -80,7 +90,7 @@ function maybe_evaluate_builtin(frame, call_expr, expand::Bool)
8090
for x in args
8191
push!(new_expr.args, (isa(x, Symbol) || isa(x, Expr) || isa(x, QuoteNode)) ? QuoteNode(x) : x)
8292
end
83-
return new_expr
93+
return maybe_recurse_expanded_builtin(frame, new_expr)
8494
elseif @static isdefined(Core, :_apply_iterate) ? f === Core._apply_iterate : false
8595
argswrapped = getargs(args, frame)
8696
if !expand
@@ -95,7 +105,7 @@ function maybe_evaluate_builtin(frame, call_expr, expand::Bool)
95105
for x in argsflat
96106
push!(new_expr.args, (isa(x, Symbol) || isa(x, Expr) || isa(x, QuoteNode)) ? QuoteNode(x) : x)
97107
end
98-
return new_expr
108+
return maybe_recurse_expanded_builtin(frame, new_expr)
99109
elseif f === Core._apply_pure
100110
return Some{Any}(Core._apply_pure(getargs(args, frame)...))
101111
elseif f === Core._expr

test/breakpoints.jl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,3 +457,14 @@ end
457457
@test last(JuliaInterpreter.debug_command(f, :c)) isa BreakpointRef
458458
end
459459
end
460+
461+
@testset "recursive builtins" begin
462+
g(args...) = args
463+
args = (iterate, g, (1,3))
464+
465+
h() = Core._apply_iterate(iterate, Core._apply_iterate, args)
466+
breakpoint(g)
467+
frame, bp = @interpret h()
468+
var = JuliaInterpreter.locals(leaf(frame))
469+
@test filter(v->v.name === :args, var)[1].value == (1,3)
470+
end

0 commit comments

Comments
 (0)