diff --git a/base/compiler/ssair/legacy.jl b/base/compiler/ssair/legacy.jl index b56a5fb4a6a00..e94bc5f08aa6b 100644 --- a/base/compiler/ssair/legacy.jl +++ b/base/compiler/ssair/legacy.jl @@ -59,7 +59,7 @@ Mainly used for testing or interactive use. """ inflate_ir(ci::CodeInfo, linfo::MethodInstance) = inflate_ir!(copy(ci), linfo) inflate_ir(ci::CodeInfo, sptypes::Vector{Any}, argtypes::Vector{Any}) = inflate_ir!(copy(ci), sptypes, argtypes) -inflate_ir(ci::CodeInfo) = inflate_ir(ci, Any[], Any[ Any for i = 1:length(ci.slotflags) ]) +inflate_ir(ci::CodeInfo) = inflate_ir(ci, Any[], Any[ ci.slottypes === nothing ? Any : (ci.slottypes::Vector{Any})[i] for i = 1:length(ci.slotflags) ]) function replace_code_newstyle!(ci::CodeInfo, ir::IRCode, nargs::Int) @assert isempty(ir.new_nodes) diff --git a/base/opaque_closure.jl b/base/opaque_closure.jl index ac2ae2e8bf3c0..7a539385c9a45 100644 --- a/base/opaque_closure.jl +++ b/base/opaque_closure.jl @@ -40,6 +40,21 @@ function compute_ir_rettype(ir::IRCode) return Core.Compiler.widenconst(rt) end +function compute_oc_argtypes(ir, nargs, isva) + argtypes = ir.argtypes[2:end] + @assert nargs == length(argtypes) + argtypes = Core.Compiler.anymap(Core.Compiler.widenconst, argtypes) + if isva + lastarg = pop!(argtypes) + if lastarg <: Tuple + append!(argtypes, lastarg.parameters) + else + push!(argtypes, Vararg{Any}) + end + end + Tuple{argtypes...} +end + function Core.OpaqueClosure(ir::IRCode, env...; nargs::Int = length(ir.argtypes)-1, isva::Bool = false, @@ -57,7 +72,7 @@ function Core.OpaqueClosure(ir::IRCode, env...; # NOTE: we need ir.argtypes[1] == typeof(env) ccall(:jl_new_opaque_closure_from_code_info, Any, (Any, Any, Any, Any, Any, Cint, Any, Cint, Cint, Any), - Tuple{ir.argtypes[2:end]...}, Union{}, rt, @__MODULE__, src, 0, nothing, nargs, isva, env) + compute_oc_argtypes(ir, nargs, isva), Union{}, rt, @__MODULE__, src, 0, nothing, nargs, isva, env) end function Core.OpaqueClosure(src::CodeInfo, env...) diff --git a/test/opaque_closure.jl b/test/opaque_closure.jl index 7fe53812c3a92..530c5b3a844eb 100644 --- a/test/opaque_closure.jl +++ b/test/opaque_closure.jl @@ -255,12 +255,18 @@ end let ci = code_typed((x, y...)->(x, y), (Int, Int))[1][1] ir = Core.Compiler.inflate_ir(ci) - @test OpaqueClosure(ir; nargs=2, isva=true)(40, 2) === (40, (2,)) - @test OpaqueClosure(ci)(40, 2) === (40, (2,)) -end + let oc = OpaqueClosure(ir; nargs=2, isva=true) + @test oc(40, 2) === (40, (2,)) + @test_throws MethodError oc(1,2,3) + end + let oc = OpaqueClosure(ci) + @test oc(40, 2) === (40, (2,)) + @test_throws MethodError oc(1,2,3) + end -let ci = code_typed((x, y...)->(x, y), (Int, Int))[1][1] - ir = Core.Compiler.inflate_ir(ci) - @test_throws MethodError OpaqueClosure(ir; nargs=2, isva=true)(1, 2, 3) - @test_throws MethodError OpaqueClosure(ci)(1, 2, 3) + ir = Core.Compiler.inflate_ir(ci, Any[], Any[Tuple{}, Int, Tuple{Int}]) + let oc = OpaqueClosure(ir; nargs=2, isva=true) + @test oc(40, 2) === (40, (2,)) + @test_throws MethodError oc(1,2,3) + end end