Skip to content

Commit 94ba542

Browse files
authored
fix #476: isdefined with QuoteNode (#477)
1 parent 5e723d4 commit 94ba542

File tree

2 files changed

+16
-1
lines changed

2 files changed

+16
-1
lines changed

src/interpret.jl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,14 +415,17 @@ function check_isdefined(frame, @nospecialize(node))
415415
data = frame.framedata
416416
if isa(node, SlotNumber)
417417
return data.locals[node.id] !== nothing
418+
elseif isa(node, Core.Compiler.Argument) # just to be safe, since base handles this
419+
return data.locals[node.n] !== nothing
418420
elseif isexpr(node, :static_parameter)
419421
return isassigned(data.sparams, node.args[1]::Int)
420422
elseif isa(node, GlobalRef)
421423
return isdefined(node.mod, node.name)
422424
elseif isa(node, Symbol)
423425
return isdefined(moduleof(frame), node)
426+
else # QuoteNode or other implicitly quoted object
427+
return true
424428
end
425-
error("unrecognized isdefined node ", node)
426429
end
427430

428431
# For "profiling" where JuliaInterpreter spends its time. See the commented-out block

test/interpret.jl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -746,3 +746,15 @@ end
746746
@testset "#466 parametric_type_to_expr" begin
747747
@test JuliaInterpreter.parametric_type_to_expr(Array) == :(Core.Array{T, N})
748748
end
749+
750+
@testset "#476 isdefined QuoteNode" begin
751+
f() = !true
752+
753+
@generated function g()
754+
ci = @code_lowered f()
755+
ci.code[1] = Expr(:isdefined, QuoteNode(Float64))
756+
return ci
757+
end
758+
759+
@test @interpret(g()) === true
760+
end

0 commit comments

Comments
 (0)