From 7b5a937565a1089b3a033c1e6745af4d0d1997f8 Mon Sep 17 00:00:00 2001 From: Shuhei Kadowaki Date: Tue, 28 Nov 2023 20:01:15 +0900 Subject: [PATCH] follow up #596 --- bin/generate_builtins.jl | 5 ++-- src/builtins.jl | 60 ++++++++++++++++++++-------------------- test/interpret.jl | 4 +++ 3 files changed, 37 insertions(+), 32 deletions(-) diff --git a/bin/generate_builtins.jl b/bin/generate_builtins.jl index 65430320..70a0c573 100644 --- a/bin/generate_builtins.jl +++ b/bin/generate_builtins.jl @@ -260,11 +260,12 @@ function maybe_evaluate_builtin(frame, call_expr, expand::Bool) elseif name === :arraysize maxarg = 2 end - fcall = generate_fcall_nargs(name, minarg, maxarg) + _scopedname = "$mod.$name" + fcall = generate_fcall_nargs(_scopedname, minarg, maxarg) rname = repr(name) print(io, """ - elseif @static isdefined($mod, $rname) && f === $name + elseif @static (isdefined($mod, $rname) && $_scopedname isa Core.Builtin) && f === $_scopedname $fcall """) end diff --git a/src/builtins.jl b/src/builtins.jl index 5d6a1a1d..5bc58ba2 100644 --- a/src/builtins.jl +++ b/src/builtins.jl @@ -330,65 +330,65 @@ function maybe_evaluate_builtin(frame, call_expr, expand::Bool) call_expr.args[3] = @lookup(frame, args[3]) return Some{Any}(Core.eval(moduleof(frame), call_expr)) end - elseif @static isdefined(Core, :arrayref) && f === :arrayref + elseif @static (isdefined(Core, :arrayref) && Core.arrayref isa Core.Builtin) && f === Core.arrayref if nargs == 1 - return Some{Any}(arrayref(@lookup(frame, args[2]))) + return Some{Any}(Core.arrayref(@lookup(frame, args[2]))) elseif nargs == 2 - return Some{Any}(arrayref(@lookup(frame, args[2]), @lookup(frame, args[3]))) + return Some{Any}(Core.arrayref(@lookup(frame, args[2]), @lookup(frame, args[3]))) elseif nargs == 3 - return Some{Any}(arrayref(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]))) + return Some{Any}(Core.arrayref(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]))) elseif nargs == 4 - return Some{Any}(arrayref(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5]))) + return Some{Any}(Core.arrayref(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5]))) elseif nargs == 5 - return Some{Any}(arrayref(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5]), @lookup(frame, args[6]))) + 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]))) else - return Some{Any}(arrayref(getargs(args, frame)...)) + return Some{Any}(Core.arrayref(getargs(args, frame)...)) end - elseif @static isdefined(Core, :arrayset) && f === :arrayset + elseif @static (isdefined(Core, :arrayset) && Core.arrayset isa Core.Builtin) && f === Core.arrayset if nargs == 1 - return Some{Any}(arrayset(@lookup(frame, args[2]))) + return Some{Any}(Core.arrayset(@lookup(frame, args[2]))) elseif nargs == 2 - return Some{Any}(arrayset(@lookup(frame, args[2]), @lookup(frame, args[3]))) + return Some{Any}(Core.arrayset(@lookup(frame, args[2]), @lookup(frame, args[3]))) elseif nargs == 3 - return Some{Any}(arrayset(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]))) + return Some{Any}(Core.arrayset(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]))) elseif nargs == 4 - return Some{Any}(arrayset(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5]))) + return Some{Any}(Core.arrayset(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5]))) elseif nargs == 5 - return Some{Any}(arrayset(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5]), @lookup(frame, args[6]))) + 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]))) elseif nargs == 6 - 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]))) + 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]))) else - return Some{Any}(arrayset(getargs(args, frame)...)) + return Some{Any}(Core.arrayset(getargs(args, frame)...)) end - elseif @static isdefined(Core, :arrayset) && f === :arrayset + elseif @static (isdefined(Core, :arrayset) && Core.arrayset isa Core.Builtin) && f === Core.arrayset if nargs == 1 - return Some{Any}(arrayset(@lookup(frame, args[2]))) + return Some{Any}(Core.arrayset(@lookup(frame, args[2]))) elseif nargs == 2 - return Some{Any}(arrayset(@lookup(frame, args[2]), @lookup(frame, args[3]))) + return Some{Any}(Core.arrayset(@lookup(frame, args[2]), @lookup(frame, args[3]))) elseif nargs == 3 - return Some{Any}(arrayset(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]))) + return Some{Any}(Core.arrayset(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]))) elseif nargs == 4 - return Some{Any}(arrayset(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5]))) + return Some{Any}(Core.arrayset(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5]))) elseif nargs == 5 - return Some{Any}(arrayset(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5]), @lookup(frame, args[6]))) + 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]))) elseif nargs == 6 - 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]))) + 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]))) else - return Some{Any}(arrayset(getargs(args, frame)...)) + return Some{Any}(Core.arrayset(getargs(args, frame)...)) end - elseif @static isdefined(Core, :const_arrayref) && f === :const_arrayref + elseif @static (isdefined(Core, :const_arrayref) && Core.const_arrayref isa Core.Builtin) && f === Core.const_arrayref if nargs == 1 - return Some{Any}(const_arrayref(@lookup(frame, args[2]))) + return Some{Any}(Core.const_arrayref(@lookup(frame, args[2]))) elseif nargs == 2 - return Some{Any}(const_arrayref(@lookup(frame, args[2]), @lookup(frame, args[3]))) + return Some{Any}(Core.const_arrayref(@lookup(frame, args[2]), @lookup(frame, args[3]))) elseif nargs == 3 - return Some{Any}(const_arrayref(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]))) + return Some{Any}(Core.const_arrayref(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]))) elseif nargs == 4 - return Some{Any}(const_arrayref(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5]))) + return Some{Any}(Core.const_arrayref(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5]))) elseif nargs == 5 - 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]))) + return Some{Any}(Core.const_arrayref(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5]), @lookup(frame, args[6]))) else - return Some{Any}(const_arrayref(getargs(args, frame)...)) + return Some{Any}(Core.const_arrayref(getargs(args, frame)...)) end elseif f === Core.Intrinsics.llvmcall return Some{Any}(Core.Intrinsics.llvmcall(getargs(args, frame)...)) diff --git a/test/interpret.jl b/test/interpret.jl index 0b73463a..d93f09cb 100644 --- a/test/interpret.jl +++ b/test/interpret.jl @@ -993,3 +993,7 @@ end @test (@interpret string("", "pcre_h.jl")) == string("", "pcre_h.jl") @test (@interpret Base.strcat("", "build_h.jl")) == Base.strcat("", "build_h.jl") end + +# test for using generic functions that were previously builtin +func_arrayref(a, i) = Core.arrayref(true, a, i) +@test 2 == @interpret func_arrayref([1,2,3], 2)