Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Saving CodeInfo sometimes errors. #243

Closed
MichaelHatherly opened this issue Oct 9, 2020 · 3 comments
Closed

Saving CodeInfo sometimes errors. #243

MichaelHatherly opened this issue Oct 9, 2020 · 3 comments

Comments

@MichaelHatherly
Copy link

Not 100% sure if CodeInfo is meant to be supported? Minimal reproducer below (on v0.2.3):

julia> using JLD2
[ Info: Precompiling JLD2 [033835bb-8acc-5ee8-8aae-3f567f8a3819]

julia> ci = code_lowered(x->x, Tuple{Vararg{Any}})[1]
CodeInfo(
1 ─     return x
)

julia> ci_bad = code_lowered(x->2x, Tuple{Vararg{Any}})[1]
CodeInfo(
1 ─ %1 = 2 * x
└──      return %1
)

julia> @save "ci.jld2" ci

julia> @save "ci_bad.jld2" ci_bad
ERROR: TypeError: in getfield, expected Symbol, got a value of type Int64
Stacktrace:
 [1] macro expansion at /home/mike/.julia/packages/JLD2/hIQpq/src/data.jl:490 [inlined]
 [2] h5convert!(::JLD2.IndirectPointer, ::JLD2.OnDiskRepresentation{(0, 16),Tuple{Symbol,Any},Tuple{JLD2.Vlen{String},JLD2.RelOffset}}, ::JLD2.JLDFile{JLD2.MmapIO}, ::Module, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/mike/.julia/packages/JLD2/hIQpq/src/data.jl:490
 [3] write_data(::JLD2.MmapIO, ::JLD2.JLDFile{JLD2.MmapIO}, ::Module, ::JLD2.OnDiskRepresentation{(0, 16),Tuple{Symbol,Any},Tuple{JLD2.Vlen{String},JLD2.RelOffset}}, ::JLD2.HasReferences, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/mike/.julia/packages/JLD2/hIQpq/src/dataio.jl:111
 [4] write_dataset(::JLD2.JLDFile{JLD2.MmapIO}, ::JLD2.WriteDataspace{0,Tuple{}}, ::JLD2.CommittedDatatype, ::JLD2.OnDiskRepresentation{(0, 16),Tuple{Symbol,Any},Tuple{JLD2.Vlen{String},JLD2.RelOffset}}, ::Module, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/mike/.julia/packages/JLD2/hIQpq/src/datasets.jl:434
 [5] write_dataset at /home/mike/.julia/packages/JLD2/hIQpq/src/datasets.jl:528 [inlined]
 [6] write_ref_mutable at /home/mike/.julia/packages/JLD2/hIQpq/src/datasets.jl:539 [inlined]
 [7] write_ref at /home/mike/.julia/packages/JLD2/hIQpq/src/datasets.jl:547 [inlined]
 [8] h5convert!(::JLD2.IndirectPointer, ::Type{JLD2.RelOffset}, ::JLD2.JLDFile{JLD2.MmapIO}, ::Module, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/mike/.julia/packages/JLD2/hIQpq/src/data.jl:660
 [9] macro expansion at /home/mike/.julia/packages/JLD2/hIQpq/src/data.jl:490 [inlined]
 [10] h5convert! at /home/mike/.julia/packages/JLD2/hIQpq/src/data.jl:490 [inlined]
 [11] write_data(::JLD2.MmapIO, ::JLD2.JLDFile{JLD2.MmapIO}, ::GlobalRef, ::JLD2.OnDiskRepresentation{(0, 8),Tuple{Module,Symbol},Tuple{JLD2.RelOffset,JLD2.Vlen{String}}}, ::JLD2.HasReferences, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/mike/.julia/packages/JLD2/hIQpq/src/dataio.jl:111
 [12] write_dataset(::JLD2.JLDFile{JLD2.MmapIO}, ::JLD2.WriteDataspace{0,Tuple{}}, ::JLD2.CommittedDatatype, ::JLD2.OnDiskRepresentation{(0, 8),Tuple{Module,Symbol},Tuple{JLD2.RelOffset,JLD2.Vlen{String}}}, ::GlobalRef, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/mike/.julia/packages/JLD2/hIQpq/src/datasets.jl:434
 [13] write_dataset at /home/mike/.julia/packages/JLD2/hIQpq/src/datasets.jl:528 [inlined]
 [14] write_ref(::JLD2.JLDFile{JLD2.MmapIO}, ::GlobalRef, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/mike/.julia/packages/JLD2/hIQpq/src/datasets.jl:549
 [15] h5convert! at /home/mike/.julia/packages/JLD2/hIQpq/src/data.jl:660 [inlined]
 [16] write_data(::JLD2.MmapIO, ::JLD2.JLDFile{JLD2.MmapIO}, ::Array{Any,1}, ::Type{JLD2.RelOffset}, ::JLD2.HasReferences, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/mike/.julia/packages/JLD2/hIQpq/src/dataio.jl:178
 [17] write_dataset(::JLD2.JLDFile{JLD2.MmapIO}, ::JLD2.WriteDataspace{1,Tuple{JLD2.WrittenAttribute{JLD2.WriteDataspace{0,Tuple{}},JLD2.BasicDatatype,JLD2.RelOffset}}}, ::JLD2.BasicDatatype, ::Type{JLD2.RelOffset}, ::Array{Any,1}, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/mike/.julia/packages/JLD2/hIQpq/src/datasets.jl:392
 [18] write_dataset(::JLD2.JLDFile{JLD2.MmapIO}, ::Array{Any,1}, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/mike/.julia/packages/JLD2/hIQpq/src/inlineunion.jl:44
 [19] write_ref_mutable at /home/mike/.julia/packages/JLD2/hIQpq/src/datasets.jl:539 [inlined]
 [20] write_ref at /home/mike/.julia/packages/JLD2/hIQpq/src/datasets.jl:547 [inlined]
 [21] h5convert! at /home/mike/.julia/packages/JLD2/hIQpq/src/data.jl:660 [inlined]
 [22] macro expansion at /home/mike/.julia/packages/JLD2/hIQpq/src/data.jl:490 [inlined]
 [23] h5convert!(::JLD2.IndirectPointer, ::JLD2.OnDiskRepresentation{(0, 16),Tuple{Symbol,Array{Any,1}},Tuple{JLD2.Vlen{String},JLD2.RelOffset}}, ::JLD2.JLDFile{JLD2.MmapIO}, ::Expr, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/mike/.julia/packages/JLD2/hIQpq/src/data.jl:490
 [24] write_data(::JLD2.MmapIO, ::JLD2.JLDFile{JLD2.MmapIO}, ::Expr, ::JLD2.OnDiskRepresentation{(0, 16),Tuple{Symbol,Array{Any,1}},Tuple{JLD2.Vlen{String},JLD2.RelOffset}}, ::JLD2.HasReferences, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/mike/.julia/packages/JLD2/hIQpq/src/dataio.jl:111
 [25] write_dataset(::JLD2.JLDFile{JLD2.MmapIO}, ::JLD2.WriteDataspace{0,Tuple{}}, ::JLD2.CommittedDatatype, ::JLD2.OnDiskRepresentation{(0, 16),Tuple{Symbol,Array{Any,1}},Tuple{JLD2.Vlen{String},JLD2.RelOffset}}, ::Expr, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/mike/.julia/packages/JLD2/hIQpq/src/datasets.jl:434
 [26] write_dataset at /home/mike/.julia/packages/JLD2/hIQpq/src/datasets.jl:528 [inlined]
 [27] write_ref_mutable at /home/mike/.julia/packages/JLD2/hIQpq/src/datasets.jl:539 [inlined]
 [28] write_ref(::JLD2.JLDFile{JLD2.MmapIO}, ::Expr, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/mike/.julia/packages/JLD2/hIQpq/src/datasets.jl:547
 [29] h5convert! at /home/mike/.julia/packages/JLD2/hIQpq/src/data.jl:660 [inlined]
 [30] write_data(::JLD2.MmapIO, ::JLD2.JLDFile{JLD2.MmapIO}, ::Array{Any,1}, ::Type{JLD2.RelOffset}, ::JLD2.HasReferences, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/mike/.julia/packages/JLD2/hIQpq/src/dataio.jl:178
 [31] write_dataset(::JLD2.JLDFile{JLD2.MmapIO}, ::JLD2.WriteDataspace{1,Tuple{JLD2.WrittenAttribute{JLD2.WriteDataspace{0,Tuple{}},JLD2.BasicDatatype,JLD2.RelOffset}}}, ::JLD2.BasicDatatype, ::Type{JLD2.RelOffset}, ::Array{Any,1}, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/mike/.julia/packages/JLD2/hIQpq/src/datasets.jl:392
 [32] write_dataset(::JLD2.JLDFile{JLD2.MmapIO}, ::Array{Any,1}, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/mike/.julia/packages/JLD2/hIQpq/src/inlineunion.jl:44
 [33] write_ref_mutable at /home/mike/.julia/packages/JLD2/hIQpq/src/datasets.jl:539 [inlined]
 [34] write_ref at /home/mike/.julia/packages/JLD2/hIQpq/src/datasets.jl:547 [inlined]
 [35] h5convert!(::JLD2.IndirectPointer, ::Type{JLD2.RelOffset}, ::JLD2.JLDFile{JLD2.MmapIO}, ::Array{Any,1}, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/mike/.julia/packages/JLD2/hIQpq/src/data.jl:660
 [36] macro expansion at /home/mike/.julia/packages/JLD2/hIQpq/src/data.jl:490 [inlined]
 [37] h5convert!(::JLD2.IndirectPointer, ::JLD2.OnDiskRepresentation{(0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 113, 114, 115),Tuple{Array{Any,1},Any,Any,Array{UInt8,1},Any,Any,Array{Symbol,1},Array{UInt8,1},Any,Any,Any,Any,UInt64,UInt64,Bool,Bool,Bool,Bool},Tuple{JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,UInt64,UInt64,Bool,Bool,Bool,Bool}}, ::JLD2.JLDFile{JLD2.MmapIO}, ::Core.CodeInfo, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/mike/.julia/packages/JLD2/hIQpq/src/data.jl:490
 [38] write_data(::JLD2.MmapIO, ::JLD2.JLDFile{JLD2.MmapIO}, ::Core.CodeInfo, ::JLD2.OnDiskRepresentation{(0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 113, 114, 115),Tuple{Array{Any,1},Any,Any,Array{UInt8,1},Any,Any,Array{Symbol,1},Array{UInt8,1},Any,Any,Any,Any,UInt64,UInt64,Bool,Bool,Bool,Bool},Tuple{JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,UInt64,UInt64,Bool,Bool,Bool,Bool}}, ::JLD2.HasReferences, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/mike/.julia/packages/JLD2/hIQpq/src/dataio.jl:111
 [39] write_dataset(::JLD2.JLDFile{JLD2.MmapIO}, ::JLD2.WriteDataspace{0,Tuple{}}, ::JLD2.CommittedDatatype, ::JLD2.OnDiskRepresentation{(0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 113, 114, 115),Tuple{Array{Any,1},Any,Any,Array{UInt8,1},Any,Any,Array{Symbol,1},Array{UInt8,1},Any,Any,Any,Any,UInt64,UInt64,Bool,Bool,Bool,Bool},Tuple{JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,JLD2.RelOffset,UInt64,UInt64,Bool,Bool,Bool,Bool}}, ::Core.CodeInfo, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/mike/.julia/packages/JLD2/hIQpq/src/datasets.jl:434
 [40] write_dataset at /home/mike/.julia/packages/JLD2/hIQpq/src/datasets.jl:528 [inlined]
 [41] write(::JLD2.Group{JLD2.JLDFile{JLD2.MmapIO}}, ::String, ::Core.CodeInfo, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/mike/.julia/packages/JLD2/hIQpq/src/groups.jl:119
 [42] write(::JLD2.JLDFile{JLD2.MmapIO}, ::String, ::Core.CodeInfo, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/mike/.julia/packages/JLD2/hIQpq/src/JLD2.jl:339
 [43] top-level scope at /home/mike/.julia/packages/JLD2/hIQpq/src/loadsave.jl:66
@JonasIsensee
Copy link
Collaborator

JonasIsensee commented Oct 9, 2020

Hi @MichaelHatherly

thank for reporting this.
I've reduced the problem to the following:
So essentially it is not possible to serialize a Module.

julia> @save "test.jld2" JLD2
ERROR: TypeError: in getfield, expected Symbol, got a value of type Int64
Stacktrace:
 [1] macro expansion at /home/jonas/.julia/dev/JLD2/src/data.jl:490 [inlined]
 [2] h5convert!(::JLD2.IndirectPointer, ::JLD2.OnDiskRepresentation{(0, 16),Tuple{Symbol,Any},Tuple{JLD2.Vlen{String},JLD2.RelOffset}}, ::JLD2.JLDFile{JLD2.MmapIO}, ::Module, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/jonas/.julia/dev/JLD2/src/data.jl:490
 [3] write_data(::JLD2.MmapIO, ::JLD2.JLDFile{JLD2.MmapIO}, ::Module, ::JLD2.OnDiskRepresentation{(0, 16),Tuple{Symbol,Any},Tuple{JLD2.Vlen{String},JLD2.RelOffset}}, ::JLD2.HasReferences, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/jonas/.julia/dev/JLD2/src/dataio.jl:117
 [4] write_dataset(::JLD2.JLDFile{JLD2.MmapIO}, ::JLD2.WriteDataspace{0,Tuple{}}, ::JLD2.CommittedDatatype, ::JLD2.OnDiskRepresentation{(0, 16),Tuple{Symbol,Any},Tuple{JLD2.Vlen{String},JLD2.RelOffset}}, ::Module, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/jonas/.julia/dev/JLD2/src/datasets.jl:449
 [5] write_dataset at /home/jonas/.julia/dev/JLD2/src/datasets.jl:555 [inlined]
 [6] write(::JLD2.Group{JLD2.JLDFile{JLD2.MmapIO}}, ::String, ::Module, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/jonas/.julia/dev/JLD2/src/groups.jl:119
 [7] write(::JLD2.JLDFile{JLD2.MmapIO}, ::String, ::Module, ::JLD2.JLDWriteSession{Dict{UInt64,JLD2.RelOffset}}) at /home/jonas/.julia/dev/JLD2/src/JLD2.jl:339
 [8] top-level scope at /home/jonas/.julia/dev/JLD2/src/loadsave.jl:66
 [9] run_repl(::REPL.AbstractREPL, ::Any) at /build/julia/src/julia-1.5.2/usr/share/julia/stdlib/v1.5/REPL/src/REPL.jl:288

I tried to fix it with the following:

julia> struct ModuleName; str::String; end

julia> JLD2.writeas(::Type{Module}) = ModuleName

julia> Base.convert(::Type{ModuleName}, x::Module) = ModuleName(string(nameof(x)))

julia> Base.convert(::Type{Module}, x::ModuleName) = eval(Main, Meta.parse(x.str))

julia> @save "ci_bad" ci_bad

julia> @load "ci_bad"
ERROR: EOFError: read end of file

which means that now the file can be stored but something is messed up in the loading process.

So I think that more generally the problem is that CodeInfo is a builtin and
thus doesn't quite behave like any other struct which messes with core assumptions of JLD2.

@MichaelHatherly
Copy link
Author

Thanks for the explanation. I'll try out some alternative approaches then, feel free to close this if serializing this won't likely be supported.

@JonasIsensee
Copy link
Collaborator

I'd love to make JLD2 be able to serialize all these things but I don't know enough about julia internals to fix it. (It's also hard to find out since that is not considered stable and thus mostly not documented.)

Another point is that JLD2 tries to write files that are portable but low-level julia objects like functions can't really be made portable easily.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants