@@ -41,7 +41,7 @@ const REQUIRES_WORLD = Core.Builtin[
41
41
replaceglobal!,
42
42
setglobalonce!,
43
43
]
44
- const CALL_LATEST = """ args = getargs(args, frame)
44
+ const CALL_LATEST = """ args = getargs(interp, args, frame)
45
45
if !expand
46
46
return Some{Any}(Core._call_latest(args...))
47
47
end
@@ -50,7 +50,7 @@ const CALL_LATEST = """args = getargs(args, frame)
50
50
for x in args
51
51
push!(new_expr.args, QuoteNode(x))
52
52
end
53
- return maybe_recurse_expanded_builtin(frame, new_expr)
53
+ return maybe_recurse_expanded_builtin(interp, frame, new_expr)
54
54
"""
55
55
56
56
function scopedname (f)
@@ -90,7 +90,7 @@ function generate_fcall_nargs(fname, minarg, maxarg; requires_world::Bool=false)
90
90
wrapper *= " $nargs \n "
91
91
argcall = " "
92
92
for i = 1 : nargs
93
- argcall *= " lookup(frame, args[$(i+ 1 ) ])"
93
+ argcall *= " lookup(interp, frame, args[$(i+ 1 ) ])"
94
94
if i < nargs
95
95
argcall *= " , "
96
96
end
@@ -104,9 +104,9 @@ function generate_fcall_nargs(fname, minarg, maxarg; requires_world::Bool=false)
104
104
wrapper *= " \n else"
105
105
# To throw the correct error
106
106
if requires_world
107
- wrapper *= " \n return Some{Any}(Base.invoke_in_world(frame.world, $fname , getargs(args, frame)...)$annotation )"
107
+ wrapper *= " \n return Some{Any}(Base.invoke_in_world(frame.world, $fname , getargs(interp, args, frame)...)$annotation )"
108
108
else
109
- wrapper *= " \n return Some{Any}($fname (getargs(args, frame)...)$annotation )"
109
+ wrapper *= " \n return Some{Any}($fname (getargs(interp, args, frame)...)$annotation )"
110
110
end
111
111
wrapper *= " \n end"
112
112
return wrapper
@@ -122,9 +122,9 @@ function generate_fcall(f, table, id)
122
122
# A built-in with arbitrary or unknown number of arguments.
123
123
# This will (unfortunately) use dynamic dispatch.
124
124
if requires_world
125
- return " return Some{Any}(Base.invoke_in_world(frame.world, $fname , getargs(args, frame)...))"
125
+ return " return Some{Any}(Base.invoke_in_world(frame.world, $fname , getargs(interp, args, frame)...))"
126
126
end
127
- return " return Some{Any}($fname (getargs(args, frame)...))"
127
+ return " return Some{Any}($fname (getargs(interp, args, frame)...))"
128
128
end
129
129
130
130
# `io` is for the generated source file
@@ -140,42 +140,42 @@ function generate_builtins(io::IO)
140
140
"""
141
141
# This file is generated by `generate_builtins.jl`. Do not edit by hand.
142
142
143
- function getargs(args, frame)
143
+ function getargs(interp::Interpreter, args::Vector{Any} , frame::Frame )
144
144
nargs = length(args)-1 # skip f
145
145
callargs = resize!(frame.framedata.callargs, nargs)
146
146
for i = 1:nargs
147
- callargs[i] = lookup(frame, args[i+1])
147
+ callargs[i] = lookup(interp, frame, args[i+1])
148
148
end
149
149
return callargs
150
150
end
151
151
152
152
const kwinvoke = Core.kwfunc(Core.invoke)
153
153
154
- function maybe_recurse_expanded_builtin(frame, new_expr)
154
+ function maybe_recurse_expanded_builtin(interp::Interpreter, frame::Frame , new_expr::Expr )
155
155
f = new_expr.args[1]
156
156
if isa(f, Core.Builtin) || isa(f, Core.IntrinsicFunction)
157
- return maybe_evaluate_builtin(frame, new_expr, true)
157
+ return maybe_evaluate_builtin(interp, frame, new_expr, true)
158
158
else
159
159
return new_expr
160
160
end
161
161
end
162
162
163
163
\"\"\"
164
- ret = maybe_evaluate_builtin(frame, call_expr, expand::Bool)
164
+ ret = maybe_evaluate_builtin(interp::Interpreter, frame::Frame , call_expr::Expr , expand::Bool)
165
165
166
166
If `call_expr` is to a builtin function, evaluate it, returning the result inside a `Some` wrapper.
167
167
Otherwise, return `call_expr`.
168
168
169
169
If `expand` is true, `Core._apply_iterate` calls will be resolved as a call to the applied function.
170
170
\"\"\"
171
- function maybe_evaluate_builtin(frame, call_expr, expand::Bool)
171
+ function maybe_evaluate_builtin(interp::Interpreter, frame::Frame , call_expr::Expr , expand::Bool)
172
172
args = call_expr.args
173
173
nargs = length(args) - 1
174
174
fex = args[1]
175
175
if isa(fex, QuoteNode)
176
176
f = fex.value
177
177
else
178
- f = lookup(frame, fex)
178
+ f = lookup(interp, frame, fex)
179
179
end
180
180
181
181
if f isa Core.OpaqueClosure
@@ -208,15 +208,15 @@ function maybe_evaluate_builtin(frame, call_expr, expand::Bool)
208
208
print (io,
209
209
"""
210
210
$head f === tuple
211
- return Some{Any}(ntupleany(i::Int->lookup(frame, args[i+1]), length(args)-1))
211
+ return Some{Any}(ntupleany(i::Int->lookup(interp, frame, args[i+1]), length(args)-1))
212
212
""" )
213
213
continue
214
214
elseif f === Core. _apply_iterate
215
215
# Resolve varargs calls
216
216
print (io,
217
217
"""
218
218
$head f === Core._apply_iterate
219
- argswrapped = getargs(args, frame)
219
+ argswrapped = getargs(interp, args, frame)
220
220
if !expand
221
221
return Some{Any}(Core._apply_iterate(argswrapped...))
222
222
end
@@ -229,7 +229,7 @@ function maybe_evaluate_builtin(frame, call_expr, expand::Bool)
229
229
for x in argsflat
230
230
push!(new_expr.args, QuoteNode(x))
231
231
end
232
- return maybe_recurse_expanded_builtin(frame, new_expr)
232
+ return maybe_recurse_expanded_builtin(interp, frame, new_expr)
233
233
""" )
234
234
continue
235
235
elseif f === Core. invoke
@@ -238,7 +238,7 @@ function maybe_evaluate_builtin(frame, call_expr, expand::Bool)
238
238
"""
239
239
$head f === $fstr
240
240
if !expand
241
- argswrapped = getargs(args, frame)
241
+ argswrapped = getargs(interp, args, frame)
242
242
return Some{Any}($fstr (argswrapped...))
243
243
end
244
244
# This uses the original arguments to avoid looking them up twice
@@ -257,7 +257,7 @@ function maybe_evaluate_builtin(frame, call_expr, expand::Bool)
257
257
end
258
258
return Some{Any}(currscope)
259
259
else
260
- return Some{Any}(Core.current_scope(getargs(args, frame)...))
260
+ return Some{Any}(Core.current_scope(getargs(interp, args, frame)...))
261
261
end
262
262
""" )
263
263
continue
@@ -293,13 +293,13 @@ function maybe_evaluate_builtin(frame, call_expr, expand::Bool)
293
293
if nargs == 1
294
294
call_expr = copy(call_expr)
295
295
args2 = args[2]
296
- call_expr.args[2] = isa(args2, QuoteNode) ? args2 : lookup(frame, args2)
296
+ call_expr.args[2] = isa(args2, QuoteNode) ? args2 : lookup(interp, frame, args2)
297
297
return Some{Any}(Core.eval(moduleof(frame), call_expr))
298
298
elseif nargs == 2
299
299
call_expr = copy(call_expr)
300
300
args2 = args[2]
301
- call_expr.args[2] = isa(args2, QuoteNode) ? args2 : lookup(frame, args2)
302
- call_expr.args[3] = lookup(frame, args[3])
301
+ call_expr.args[2] = isa(args2, QuoteNode) ? args2 : lookup(interp, frame, args2)
302
+ call_expr.args[3] = lookup(interp, frame, args[3])
303
303
return Some{Any}(Core.eval(moduleof(frame), call_expr))
304
304
end
305
305
""" )
@@ -322,7 +322,7 @@ function maybe_evaluate_builtin(frame, call_expr, expand::Bool)
322
322
_scopedname = " $mod .$name "
323
323
fcall = name === :_call_latest ? CALL_LATEST :
324
324
maxarg < typemax (Int) ? generate_fcall_nargs (_scopedname, minarg, maxarg) :
325
- " return Some{Any}($_scopedname (getargs(args, frame)...))"
325
+ " return Some{Any}($_scopedname (getargs(interp, args, frame)...))"
326
326
rname = repr (name)
327
327
print (io,
328
328
"""
@@ -361,7 +361,7 @@ function maybe_evaluate_builtin(frame, call_expr, expand::Bool)
361
361
print (io,
362
362
"""
363
363
if isa(f, Core.IntrinsicFunction)
364
- cargs = getargs(args, frame)
364
+ cargs = getargs(interp, args, frame)
365
365
if f === Core.Intrinsics.have_fma && length(cargs) == 1
366
366
cargs1 = cargs[1]
367
367
if cargs1 == Float64
@@ -392,7 +392,7 @@ function maybe_evaluate_builtin(frame, call_expr, expand::Bool)
392
392
"""
393
393
end
394
394
if isa(f, typeof(kwinvoke))
395
- return Some{Any}(kwinvoke(getargs(args, frame)...))
395
+ return Some{Any}(kwinvoke(getargs(interp, args, frame)...))
396
396
end
397
397
return call_expr
398
398
end
0 commit comments