Skip to content

defining non-existent function in another module via GlobalRef segfaults code loading #40698

Closed
@simeonschaub

Description

@simeonschaub

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugIndicates an unexpected problem or unintended behaviorcompiler:precompilationPrecompilation of modules

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions