diff --git a/src/JLD.jl b/src/JLD.jl index f0a9b3e23..94e105793 100644 --- a/src/JLD.jl +++ b/src/JLD.jl @@ -430,7 +430,15 @@ end ## Reference function read_ref(f::JldFile, ref::HDF5ReferenceObj) - haskey(f.jlref, ref) && return f.jlref[ref].value + if haskey(f.jlref, ref) + # Objects are stored as WeakRefs, and may no longer exist + val = f.jlref[ref].value + if val == nothing + delete!(f.jlref, ref) + else + return val + end + end dset = f[ref] data = try diff --git a/test/jld.jl b/test/jld.jl index 234f8ed66..811f8a439 100644 --- a/test/jld.jl +++ b/test/jld.jl @@ -385,6 +385,27 @@ for mmap = (true, false) close(fidr) end +# object references in a write session +x = ObjRefType() +a = [x, x] +b = [x, x] +@save fn a b +jldopen(fn, "r") do fid + a = read(fid, "a") + b = read(fid, "b") + @test a[1] === a[2] === b[2] === a[1] + + # Let gc get rid of a and b + a = nothing + b = nothing + gc() + + a = read(fid, "a") + b = read(fid, "b") + @test typeof(a[1]) == ObjRefType + @test a[1] === a[2] === b[2] === a[1] +end + # do syntax jldopen(fn, "w") do fid g_create(fid, "mygroup") do g