diff --git a/src/interpret.jl b/src/interpret.jl index cd6987d29c50a..1700ae6bfdb53 100644 --- a/src/interpret.jl +++ b/src/interpret.jl @@ -291,6 +291,18 @@ function set_structtype_const(mod::Module, name::Symbol) ccall(:jl_set_const, Cvoid, (Any, Any, Any), mod, dt.name.name, dt.name.wrapper) end +function inplace_lookup!(ex, i, frame) + a = ex.args[i] + if isa(a, SSAValue) || isa(a, SlotNumber) + ex.args[i] = lookup_var(frame, a) + elseif isexpr(a, :call) + for j = 1:length(a.args) + inplace_lookup!(a, j, frame) + end + end + return ex +end + function evaluate_structtype(@nospecialize(recurse), frame, node) grsvec!(ex::Expr) = (ex.args[1] = GlobalRef(Core, :svec); return ex) @@ -302,16 +314,7 @@ function evaluate_structtype(@nospecialize(recurse), frame, node) for idx in (2, 3, 5) ex = newstructexpr.args[idx] = grsvec!(copy(node.args[idx])) for i = 2:length(ex.args) - a = ex.args[i] - if isa(a, SSAValue) || isa(a, SlotNumber) - ex.args[i] = lookup_var(frame, a) - elseif isexpr(a, :call) - for (j, aa) in enumerate(a.args) - if isa(aa, SSAValue) || isa(aa, SlotNumber) - a.args[j] = lookup_var(frame, aa) - end - end - end + inplace_lookup!(ex, i, frame) end end Core.eval(mod, newstructexpr) diff --git a/test/toplevel.jl b/test/toplevel.jl index 4a62378e8519d..b735816636e69 100644 --- a/test/toplevel.jl +++ b/test/toplevel.jl @@ -455,3 +455,19 @@ end JuliaInterpreter.finish!(frame, true) @test Toplevel.RecursiveType(Vector{Toplevel.RecursiveType}()) isa Toplevel.RecursiveType end + +# https://github.com/timholy/Revise.jl/issues/420 +module ToplevelParameters +Base.@kwdef struct MyStruct + x::Array{<:Real, 1} = [.05] +end +end +@testset "Nested references in type definitions" begin + ex = quote + Base.@kwdef struct MyStruct + x::Array{<:Real, 1} = [.05] + end + end + frame = JuliaInterpreter.prepare_thunk(ToplevelParameters, ex) + @test JuliaInterpreter.finish!(frame, true) === nothing +end