diff --git a/.github/workflows/check_builtins.yml b/.github/workflows/check_builtins.yml new file mode 100644 index 00000000..3c75aa65 --- /dev/null +++ b/.github/workflows/check_builtins.yml @@ -0,0 +1,29 @@ +name: CI +on: + pull_request: + push: + branches: + - master + tags: '*' +jobs: + test: + name: 'Check builtins.jl consistency' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: julia-actions/setup-julia@v1 + with: + version: nightly + arch: x64 + - uses: actions/cache@v1 + env: + cache-name: cache-artifacts + with: + path: ~/.julia/artifacts + key: ${{ runner.os }}-test-${{ env.cache-name }}-${{ hashFiles('**/Project.toml') }} + restore-keys: | + ${{ runner.os }}-test-${{ env.cache-name }}- + ${{ runner.os }}-test- + ${{ runner.os }}- + - uses: julia-actions/julia-buildpkg@v1 + - run: julia test/check_builtins.jl diff --git a/bin/generate_builtins.jl b/bin/generate_builtins.jl index 291bfca8..cd648e3a 100644 --- a/bin/generate_builtins.jl +++ b/bin/generate_builtins.jl @@ -8,6 +8,7 @@ const RECENTLY_ADDED = Core.Builtin[ Core.get_binding_type, Core.set_binding_type!, Core.getglobal, Core.setglobal!, Core.modifyfield!, Core.replacefield!, Core.swapfield!, + Core.finalizer ] const kwinvoke = Core.kwfunc(Core.invoke) diff --git a/src/builtins.jl b/src/builtins.jl index b01ecefa..a0cb561d 100644 --- a/src/builtins.jl +++ b/src/builtins.jl @@ -140,6 +140,16 @@ function maybe_evaluate_builtin(frame, call_expr, expand::Bool) return Some{Any}(Core.const_arrayref(getargs(args, frame)...)) elseif @static isdefined(Core, :donotdelete) && f === Core.donotdelete return Some{Any}(Core.donotdelete(getargs(args, frame)...)) + elseif @static isdefined(Core, :finalizer) && f === Core.finalizer + if nargs == 2 + return Some{Any}(Core.finalizer(@lookup(frame, args[2]), @lookup(frame, args[3]))) + elseif nargs == 3 + return Some{Any}(Core.finalizer(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]))) + elseif nargs == 4 + return Some{Any}(Core.finalizer(@lookup(frame, args[2]), @lookup(frame, args[3]), @lookup(frame, args[4]), @lookup(frame, args[5]))) + else + return Some{Any}(Core.finalizer(getargs(args, frame)...)) + end elseif @static isdefined(Core, :get_binding_type) && f === Core.get_binding_type if nargs == 2 return Some{Any}(Core.get_binding_type(@lookup(frame, args[2]), @lookup(frame, args[3]))) diff --git a/test/check_builtins.jl b/test/check_builtins.jl new file mode 100644 index 00000000..42b167cc --- /dev/null +++ b/test/check_builtins.jl @@ -0,0 +1,12 @@ +using Test + +@static if VERSION >= v"1.9.0-" + @testset "Check builtin.jl consistency" begin + builtins_path = joinpath(@__DIR__, "..", "src", "builtins.jl") + old_builtins = read(builtins_path, String) + include("../bin/generate_builtins.jl") + new_builtins = read(builtins_path, String) + print(builtins_path, old_builtins) + @test old_builtins == new_builtins + end +end diff --git a/test/runtests.jl b/test/runtests.jl index 783b658b..ba8f166e 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -2,6 +2,8 @@ using JuliaInterpreter using Test using Logging +include("check_builtins.jl") + @test isempty(detect_ambiguities(JuliaInterpreter, Base, Core)) if !isdefined(@__MODULE__, :read_and_parse)