Closed
Description
I'm working on a package to serialize julia structs to BSON format, similar to BSON.jl .
I hit this when I tried to handle the case to decode Union{Nothing, T}
.
I'm using Julia v1.1.1.
I set up a branch isolating the issue. You can setup the environment with:
(v1.1) pkg> activate .
(tmp) pkg> add https://github.com/felipenoris/BSONSerializer.jl.git#julia_issue
On an empty julia session, load BSONSerializer
module and define a Option
type.
julia> using BSONSerializer
julia> struct Option
val::Union{Nothing, Int}
end
The macro BSONSerializable
will generate code to serialize/deserialize a struct.
To debug this case, it outputs the generated code for deserialize the Option
type.
julia> @BSONSerializable(Option)
DEBUG: deserialize generated code:
begin
#= /Users/noronha/.julia/packages/BSONSerializer/Po5Y6/src/codegen.jl:60 =#
function deserialize(bson::Union{BSON, Dict}, ::Type{Serializable{Option}})
#= /Users/noronha/.julia/packages/BSONSerializer/Po5Y6/src/codegen.jl:61 =#
args = bson["args"]
#= /Users/noronha/.julia/packages/BSONSerializer/Po5Y6/src/codegen.jl:62 =#
(Option)((decode(args["val"], Union{Nothing, Int64}),)...)
end
end
Calling the decode
function by hand has no issues:
julia> instance = Option(1)
Option(1)
julia> bson = BSONSerializer.serialize(instance)
BSON("{ "type" : "Option", "args" : { "val" : 1 } }")
julia> BSONSerializer.decode(1, Union{Nothing, Int}) # manual call to generated code
DEBUG: called decode on union{Nothing, T}
1
Calling the same code by using the generated deserialize
method will trigger a Illegal Instruction error.
julia> BSONSerializer.deserialize(bson)
DEBUG: called decode on union{Nothing, T}
Unreachable reached at 0x1133a3bf2
signal (4): Illegal instruction: 4
in expression starting at no file:0
deserialize at /Users/noronha/.julia/packages/BSONSerializer/Po5Y6/src/codegen.jl:62
deserialize at /Users/noronha/.julia/packages/BSONSerializer/Po5Y6/src/serialize.jl:14
deserialize at /Users/noronha/.julia/packages/BSONSerializer/Po5Y6/src/serialize.jl:11
jl_fptr_trampoline at /Users/julia/buildbot/worker/package_macos64/build/src/gf.c:1842
do_call at /Users/julia/buildbot/worker/package_macos64/build/src/interpreter.c:323
eval_stmt_value at /Users/julia/buildbot/worker/package_macos64/build/src/interpreter.c:362 [inlined]
eval_body at /Users/julia/buildbot/worker/package_macos64/build/src/interpreter.c:759
jl_interpret_toplevel_thunk_callback at /Users/julia/buildbot/worker/package_macos64/build/src/interpreter.c:885
unknown function (ip: 0xfffffffffffffffe)
unknown function (ip: 0x113bce85f)
unknown function (ip: 0x0)
jl_interpret_toplevel_thunk at /Users/julia/buildbot/worker/package_macos64/build/src/interpreter.c:894
jl_toplevel_eval_flex at /Users/julia/buildbot/worker/package_macos64/build/src/toplevel.c:764
jl_toplevel_eval at /Users/julia/buildbot/worker/package_macos64/build/src/toplevel.c:773 [inlined]
jl_toplevel_eval_in at /Users/julia/buildbot/worker/package_macos64/build/src/toplevel.c:793
eval at ./boot.jl:328
eval_user_input at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.1/REPL/src/REPL.jl:85
macro expansion at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.1/REPL/src/REPL.jl:117 [inlined]
#26 at ./task.jl:259
jl_apply at /Users/julia/buildbot/worker/package_macos64/build/src/./julia.h:1571 [inlined]
start_task at /Users/julia/buildbot/worker/package_macos64/build/src/task.c:572
Allocations: 11429278 (Pool: 11427475; Big: 1803); GC: 24
[1] 48553 illegal hardware instruction julia