Closed
Description
MWE is two packages Foo
and Bar
, with Bar
depending on Foo
.
in src/Foo.jl
:
module Foo
macro foo()
return :($(GlobalRef(Foo, :bar))() = 1)
end
end
in src/Bar.jl
:
module Bar
using Foo: @foo
@foo
end
Precompiling and then loading Bar
results in a segfault:
(Bar) pkg> precompile
Precompiling project...
2 dependencies successfully precompiled in 2 seconds
julia> using Bar
signal (11): Segmentation fault
in expression starting at REPL[9]:1
jl_unwrap_unionall at /buildworker/worker/package_linux64/build/src/jltypes.c:959
jl_deserialize_datatype at /buildworker/worker/package_linux64/build/src/dump.c:1241 [inlined]
jl_deserialize_value at /buildworker/worker/package_linux64/build/src/dump.c:1885
jl_deserialize_value_svec at /buildworker/worker/package_linux64/build/src/dump.c:1354 [inlined]
jl_deserialize_value at /buildworker/worker/package_linux64/build/src/dump.c:1793
jl_deserialize_datatype at /buildworker/worker/package_linux64/build/src/dump.c:1243 [inlined]
jl_deserialize_value at /buildworker/worker/package_linux64/build/src/dump.c:1885
jl_deserialize_value_method at /buildworker/worker/package_linux64/build/src/dump.c:1457 [inlined]
jl_deserialize_value at /buildworker/worker/package_linux64/build/src/dump.c:1830
jl_deserialize_value_array at /buildworker/worker/package_linux64/build/src/dump.c:1411
jl_deserialize_value at /buildworker/worker/package_linux64/build/src/dump.c:1799
_jl_restore_incremental at /buildworker/worker/package_linux64/build/src/dump.c:2590
jl_restore_incremental at /buildworker/worker/package_linux64/build/src/dump.c:2655
_include_from_serialized at ./loading.jl:658
_require_search_from_serialized at ./loading.jl:760
_require at ./loading.jl:998
require at ./loading.jl:914
require at ./loading.jl:901
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2243 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2425
jl_apply at /buildworker/worker/package_linux64/build/src/julia.h:1764 [inlined]
call_require at /buildworker/worker/package_linux64/build/src/toplevel.c:425 [inlined]
eval_import_path at /buildworker/worker/package_linux64/build/src/toplevel.c:462
jl_toplevel_eval_flex at /buildworker/worker/package_linux64/build/src/toplevel.c:688
jl_toplevel_eval_flex at /buildworker/worker/package_linux64/build/src/toplevel.c:829
jl_toplevel_eval_flex at /buildworker/worker/package_linux64/build/src/toplevel.c:829
jl_toplevel_eval_in at /buildworker/worker/package_linux64/build/src/toplevel.c:936
eval at ./boot.jl:369 [inlined]
eval_user_input at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:139
repl_backend_loop at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:200
start_repl_backend at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:185
#run_repl#43 at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:318
run_repl at /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.7/REPL/src/REPL.jl:305
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2243 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2425
#892 at ./client.jl:394
jfptr_YY.892_24947.clone_1 at /home/simeon/packages/julias/julia-latest/lib/julia/sys.so (unknown line)
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2243 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2425
jl_apply at /buildworker/worker/package_linux64/build/src/julia.h:1764 [inlined]
jl_f__call_latest at /buildworker/worker/package_linux64/build/src/builtins.c:751
#invokelatest#2 at ./essentials.jl:726 [inlined]
invokelatest at ./essentials.jl:724 [inlined]
run_main_repl at ./client.jl:379
exec_options at ./client.jl:309
_start at ./client.jl:495
jfptr__start_34359.clone_1 at /home/simeon/packages/julias/julia-latest/lib/julia/sys.so (unknown line)
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2243 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2425
jl_apply at /buildworker/worker/package_linux64/build/src/julia.h:1764 [inlined]
true_main at /buildworker/worker/package_linux64/build/src/jlapi.c:560
repl_entrypoint at /buildworker/worker/package_linux64/build/src/jlapi.c:702
main at julia-latest (unknown line)
__libc_start_main at /usr/lib/libc.so.6 (unknown line)
unknown function (ip: 0x4007d8)
Allocations: 8185298 (Pool: 8182846; Big: 2452); GC: 10
zsh: segmentation fault (core dumped) julia-latest --project
This is fixed by defining function bar end
in the module Foo
. Is there any way to at least make this not segfault? In general, defining non-existent functions in other modules via GlobalRef
seems to work just fine, it's only serialization that's not happy:
julia> module Foo end
Main.Foo
julia> @eval $(GlobalRef(Foo, :bar))() = 1
bar (generic function with 1 method)
julia> Foo.bar()
1