13
13
const kwinvoke_name = isdefined (Core, Symbol (" #kw##invoke" )) ? Symbol (" #kw##invoke" ) : Symbol (" ##invoke" )
14
14
const kwinvoke_instance = getfield (Core, kwinvoke_name). instance
15
15
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
+
16
26
"""
17
27
ret = maybe_evaluate_builtin(frame, call_expr, expand::Bool)
18
28
@@ -58,7 +68,7 @@ function maybe_evaluate_builtin(frame, call_expr, expand::Bool)
58
68
for x in argsflat
59
69
push! (new_expr. args, (isa (x, Symbol) || isa (x, Expr) || isa (x, QuoteNode)) ? QuoteNode (x) : x)
60
70
end
61
- return new_expr
71
+ return maybe_recurse_expanded_builtin (frame, new_expr)
62
72
elseif @static isdefined (Core, :_call_latest ) ? f === Core. _call_latest : false
63
73
args = getargs (args, frame)
64
74
if ! expand
@@ -69,7 +79,7 @@ function maybe_evaluate_builtin(frame, call_expr, expand::Bool)
69
79
for x in args
70
80
push! (new_expr. args, (isa (x, Symbol) || isa (x, Expr) || isa (x, QuoteNode)) ? QuoteNode (x) : x)
71
81
end
72
- return new_expr
82
+ return maybe_recurse_expanded_builtin (frame, new_expr)
73
83
elseif @static isdefined (Core, :_apply_latest ) ? f === Core. _apply_latest : false
74
84
args = getargs (args, frame)
75
85
if ! expand
@@ -80,7 +90,7 @@ function maybe_evaluate_builtin(frame, call_expr, expand::Bool)
80
90
for x in args
81
91
push! (new_expr. args, (isa (x, Symbol) || isa (x, Expr) || isa (x, QuoteNode)) ? QuoteNode (x) : x)
82
92
end
83
- return new_expr
93
+ return maybe_recurse_expanded_builtin (frame, new_expr)
84
94
elseif @static isdefined (Core, :_apply_iterate ) ? f === Core. _apply_iterate : false
85
95
argswrapped = getargs (args, frame)
86
96
if ! expand
@@ -95,7 +105,7 @@ function maybe_evaluate_builtin(frame, call_expr, expand::Bool)
95
105
for x in argsflat
96
106
push! (new_expr. args, (isa (x, Symbol) || isa (x, Expr) || isa (x, QuoteNode)) ? QuoteNode (x) : x)
97
107
end
98
- return new_expr
108
+ return maybe_recurse_expanded_builtin (frame, new_expr)
99
109
elseif f === Core. _apply_pure
100
110
return Some {Any} (Core. _apply_pure (getargs (args, frame)... ))
101
111
elseif f === Core. _expr
0 commit comments