Skip to content

Commit 9d50726

Browse files
adapt to array changes in Julia base (#596)
* update generate_builtins.jl * Update bin/generate_builtins.jl Co-authored-by: Shuhei Kadowaki <[email protected]> --------- Co-authored-by: Shuhei Kadowaki <[email protected]>
1 parent 68fa8be commit 9d50726

File tree

2 files changed

+125
-33
lines changed

2 files changed

+125
-33
lines changed

bin/generate_builtins.jl

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,13 @@ const RECENTLY_ADDED = Core.Builtin[
99
Core.getglobal, Core.setglobal!,
1010
Core.modifyfield!, Core.replacefield!, Core.swapfield!,
1111
Core.finalizer, Core._compute_sparams, Core._svec_ref,
12-
Core.compilerbarrier
12+
Core.compilerbarrier,
13+
Core.memoryref, Core.memoryref_isassigned, Core.memoryrefget, Core.memoryrefoffset, Core.memoryrefset!,
1314
]
15+
# Builtins present in 1.6, not builtins (potentially still normal functions) anymore
16+
const RECENTLY_REMOVED = GlobalRef.(Ref(Core), [
17+
:arrayref, :arrayset, :arrayset, :const_arrayref,
18+
])
1419
const kwinvoke = Core.kwfunc(Core.invoke)
1520

1621
function scopedname(f)
@@ -33,11 +38,10 @@ function nargs(f, table, id)
3338
minarg = 0
3439
maxarg = typemax(Int)
3540
end
36-
# Specialize arrayref and arrayset for small numbers of arguments
37-
if f == Core.arrayref
41+
# Specialize ~arrayref and arrayset~ memoryref for small numbers of arguments
42+
# TODO: how about other memory intrinsics?
43+
if f == Core.memoryref
3844
maxarg = 5
39-
elseif f == Core.arrayset
40-
maxarg = 6
4145
end
4246
return minarg, maxarg
4347
end
@@ -246,6 +250,24 @@ function maybe_evaluate_builtin(frame, call_expr, expand::Bool)
246250
return Some{Any}(Core.eval(moduleof(frame), call_expr))
247251
end
248252
""")
253+
# recently removed builtins
254+
for (; mod, name) in RECENTLY_REMOVED
255+
minarg = 1
256+
if name in (:arrayref, :const_arrayref)
257+
maxarg = 5
258+
elseif name === :arrayset
259+
maxarg = 6
260+
elseif name === :arraysize
261+
maxarg = 2
262+
end
263+
fcall = generate_fcall_nargs(name, minarg, maxarg)
264+
rname = repr(name)
265+
print(io,
266+
"""
267+
elseif @static isdefined($mod, $rname) && f === $name
268+
$fcall
269+
""")
270+
end
249271
# Extract any intrinsics that support varargs
250272
fva = []
251273
minmin, maxmax = typemax(Int), 0

src/builtins.jl

Lines changed: 98 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -120,40 +120,12 @@ function maybe_evaluate_builtin(frame, call_expr, expand::Bool)
120120
end
121121
elseif f === Core.apply_type
122122
return Some{Any}(Core.apply_type(getargs(args, frame)...))
123-
elseif f === Core.arrayref
124-
if nargs == 3
125-
return Some{Any}(Core.arrayref(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4])))
126-
elseif nargs == 4
127-
return Some{Any}(Core.arrayref(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5])))
128-
elseif nargs == 5
129-
return Some{Any}(Core.arrayref(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5]), @lookup(frame, args[6])))
130-
else
131-
return Some{Any}(Core.arrayref(getargs(args, frame)...))
132-
end
133-
elseif f === Core.arrayset
134-
if nargs == 4
135-
return Some{Any}(Core.arrayset(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5])))
136-
elseif nargs == 5
137-
return Some{Any}(Core.arrayset(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5]), @lookup(frame, args[6])))
138-
elseif nargs == 6
139-
return Some{Any}(Core.arrayset(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5]), @lookup(frame, args[6]), @lookup(frame, args[7])))
140-
else
141-
return Some{Any}(Core.arrayset(getargs(args, frame)...))
142-
end
143-
elseif f === Core.arraysize
144-
if nargs == 2
145-
return Some{Any}(Core.arraysize(@lookup(frame, args[2]), @lookup(frame, args[3])))
146-
else
147-
return Some{Any}(Core.arraysize(getargs(args, frame)...))
148-
end
149123
elseif @static isdefined(Core, :compilerbarrier) && f === Core.compilerbarrier
150124
if nargs == 2
151125
return Some{Any}(Core.compilerbarrier(@lookup(frame, args[2]), @lookup(frame, args[3])))
152126
else
153127
return Some{Any}(Core.compilerbarrier(getargs(args, frame)...))
154128
end
155-
elseif f === Core.const_arrayref
156-
return Some{Any}(Core.const_arrayref(getargs(args, frame)...))
157129
elseif @static isdefined(Core, :donotdelete) && f === Core.donotdelete
158130
return Some{Any}(Core.donotdelete(getargs(args, frame)...))
159131
elseif @static isdefined(Core, :finalizer) && f === Core.finalizer
@@ -178,6 +150,44 @@ function maybe_evaluate_builtin(frame, call_expr, expand::Bool)
178150
else
179151
return Some{Any}(Core.ifelse(getargs(args, frame)...))
180152
end
153+
elseif @static isdefined(Core, :memoryref) && f === Core.memoryref
154+
if nargs == 1
155+
return Some{Any}(Core.memoryref(@lookup(frame, args[2])))
156+
elseif nargs == 2
157+
return Some{Any}(Core.memoryref(@lookup(frame, args[2]), @lookup(frame, args[3])))
158+
elseif nargs == 3
159+
return Some{Any}(Core.memoryref(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4])))
160+
elseif nargs == 4
161+
return Some{Any}(Core.memoryref(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5])))
162+
elseif nargs == 5
163+
return Some{Any}(Core.memoryref(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5]), @lookup(frame, args[6])))
164+
else
165+
return Some{Any}(Core.memoryref(getargs(args, frame)...))
166+
end
167+
elseif @static isdefined(Core, :memoryref_isassigned) && f === Core.memoryref_isassigned
168+
if nargs == 3
169+
return Some{Any}(Core.memoryref_isassigned(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4])))
170+
else
171+
return Some{Any}(Core.memoryref_isassigned(getargs(args, frame)...))
172+
end
173+
elseif @static isdefined(Core, :memoryrefget) && f === Core.memoryrefget
174+
if nargs == 3
175+
return Some{Any}(Core.memoryrefget(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4])))
176+
else
177+
return Some{Any}(Core.memoryrefget(getargs(args, frame)...))
178+
end
179+
elseif @static isdefined(Core, :memoryrefoffset) && f === Core.memoryrefoffset
180+
if nargs == 1
181+
return Some{Any}(Core.memoryrefoffset(@lookup(frame, args[2])))
182+
else
183+
return Some{Any}(Core.memoryrefoffset(getargs(args, frame)...))
184+
end
185+
elseif @static isdefined(Core, :memoryrefset!) && f === Core.memoryrefset!
186+
if nargs == 4
187+
return Some{Any}(Core.memoryrefset!(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5])))
188+
else
189+
return Some{Any}(Core.memoryrefset!(getargs(args, frame)...))
190+
end
181191
elseif @static isdefined(Core, :set_binding_type!) && f === Core.set_binding_type!
182192
return Some{Any}(Core.set_binding_type!(getargs(args, frame)...))
183193
elseif f === Core.sizeof
@@ -320,6 +330,66 @@ function maybe_evaluate_builtin(frame, call_expr, expand::Bool)
320330
call_expr.args[3] = @lookup(frame, args[3])
321331
return Some{Any}(Core.eval(moduleof(frame), call_expr))
322332
end
333+
elseif @static isdefined(Core, :arrayref) && f === :arrayref
334+
if nargs == 1
335+
return Some{Any}(arrayref(@lookup(frame, args[2])))
336+
elseif nargs == 2
337+
return Some{Any}(arrayref(@lookup(frame, args[2]), @lookup(frame, args[3])))
338+
elseif nargs == 3
339+
return Some{Any}(arrayref(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4])))
340+
elseif nargs == 4
341+
return Some{Any}(arrayref(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5])))
342+
elseif nargs == 5
343+
return Some{Any}(arrayref(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5]), @lookup(frame, args[6])))
344+
else
345+
return Some{Any}(arrayref(getargs(args, frame)...))
346+
end
347+
elseif @static isdefined(Core, :arrayset) && f === :arrayset
348+
if nargs == 1
349+
return Some{Any}(arrayset(@lookup(frame, args[2])))
350+
elseif nargs == 2
351+
return Some{Any}(arrayset(@lookup(frame, args[2]), @lookup(frame, args[3])))
352+
elseif nargs == 3
353+
return Some{Any}(arrayset(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4])))
354+
elseif nargs == 4
355+
return Some{Any}(arrayset(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5])))
356+
elseif nargs == 5
357+
return Some{Any}(arrayset(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5]), @lookup(frame, args[6])))
358+
elseif nargs == 6
359+
return Some{Any}(arrayset(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5]), @lookup(frame, args[6]), @lookup(frame, args[7])))
360+
else
361+
return Some{Any}(arrayset(getargs(args, frame)...))
362+
end
363+
elseif @static isdefined(Core, :arrayset) && f === :arrayset
364+
if nargs == 1
365+
return Some{Any}(arrayset(@lookup(frame, args[2])))
366+
elseif nargs == 2
367+
return Some{Any}(arrayset(@lookup(frame, args[2]), @lookup(frame, args[3])))
368+
elseif nargs == 3
369+
return Some{Any}(arrayset(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4])))
370+
elseif nargs == 4
371+
return Some{Any}(arrayset(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5])))
372+
elseif nargs == 5
373+
return Some{Any}(arrayset(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5]), @lookup(frame, args[6])))
374+
elseif nargs == 6
375+
return Some{Any}(arrayset(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5]), @lookup(frame, args[6]), @lookup(frame, args[7])))
376+
else
377+
return Some{Any}(arrayset(getargs(args, frame)...))
378+
end
379+
elseif @static isdefined(Core, :const_arrayref) && f === :const_arrayref
380+
if nargs == 1
381+
return Some{Any}(const_arrayref(@lookup(frame, args[2])))
382+
elseif nargs == 2
383+
return Some{Any}(const_arrayref(@lookup(frame, args[2]), @lookup(frame, args[3])))
384+
elseif nargs == 3
385+
return Some{Any}(const_arrayref(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4])))
386+
elseif nargs == 4
387+
return Some{Any}(const_arrayref(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5])))
388+
elseif nargs == 5
389+
return Some{Any}(const_arrayref(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5]), @lookup(frame, args[6])))
390+
else
391+
return Some{Any}(const_arrayref(getargs(args, frame)...))
392+
end
323393
elseif f === Core.Intrinsics.llvmcall
324394
return Some{Any}(Core.Intrinsics.llvmcall(getargs(args, frame)...))
325395
end

0 commit comments

Comments
 (0)