Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions src/interpret.jl
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@ function lookup_var(frame::Frame, slot::SlotNumber)
val !== nothing && return val.value
throw(UndefVarError(frame.framecode.src.slotnames[slot.id]))
end
function lookup_var(frame::Frame, arg::Core.Compiler.Argument)
val = frame.framedata.locals[arg.n]
val !== nothing && return val.value
throw(UndefVarError(frame.framecode.src.slotnames[arg.n]))
end

"""
lookup([interp::Interpreter=RecursiveInterpreter()], frame::Frame, node)
Expand All @@ -25,6 +30,8 @@ function lookup(interp::Interpreter, frame::Frame, @nospecialize(node))
return lookup_var(frame, node)
elseif isa(node, SlotNumber)
return lookup_var(frame, node)
elseif isa(node, Core.Compiler.Argument)
return lookup_var(frame, node)
elseif isa(node, GlobalRef)
return lookup_var(frame, node)
elseif isa(node, Expr)
Expand Down
1 change: 1 addition & 0 deletions src/optimize.jl
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,7 @@ function replace_coretypes_list!(list::AbstractVector; rev::Bool=false)
else
isa(x, Core.SSAValue) && return SSAValue(x.id)
isa(x, Core.SlotNumber) && return SlotNumber(x.id)
isa(x, Core.Compiler.Argument) && return SlotNumber(x.n)
@static if VERSION < v"1.11.0-DEV.337"
isa(x, Core.Compiler.TypedSlot) && return SlotNumber(x.id)
end
Expand Down
22 changes: 22 additions & 0 deletions test/interpret.jl
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,28 @@ let x = Core.SlotNumber(1)
@test isa(@interpret(f(x)), UInt)
end

# Support Core.Argument in lowered code (needed for Julia PR #61036 _defaultctors)
@testset "Core.Argument support" begin
# replace_coretypes_list! converts Core.Argument to SlotNumber
code_list = Any[Core.Compiler.Argument(1), Core.Compiler.Argument(3)]
JuliaInterpreter.replace_coretypes_list!(code_list)
@test code_list[1] == JuliaInterpreter.SlotNumber(1)
@test code_list[2] == JuliaInterpreter.SlotNumber(3)

# Core.Argument nested inside Expr is also converted
code_list2 = Any[Expr(:new, Core.Compiler.Argument(1), Core.Compiler.Argument(2))]
JuliaInterpreter.replace_coretypes_list!(code_list2)
@test code_list2[1].args[1] == JuliaInterpreter.SlotNumber(1)
@test code_list2[1].args[2] == JuliaInterpreter.SlotNumber(2)

# lookup_var with Core.Compiler.Argument works on a real frame
f_arg(x, y) = x + y
frame = JuliaInterpreter.enter_call(f_arg, 10, 20)
@test JuliaInterpreter.lookup_var(frame, Core.Compiler.Argument(1)) == f_arg
@test JuliaInterpreter.lookup_var(frame, Core.Compiler.Argument(2)) == 10
@test JuliaInterpreter.lookup_var(frame, Core.Compiler.Argument(3)) == 20
end

# issue #98
x98 = 5
function f98()
Expand Down
Loading