Closed
Description
If PkgA conditionally defines a variable during __init__()
:
module PkgA
function __init__()
global var
if haskey(ENV, "varA")
var = ENV["varA"]
end
end
end
then a check to isdefined(PkgA, :var)
in a the __init__()
function of a dependent package may be incorrectly compiled to be constant. This is a problem if you have code such as:
module PkgB
using PkgA
function __init__()
if isdefined(PkgA, :var)
@show PkgA.var
end
end
end
If I precompile once with the environment variable varA
set, then run it again without, I get the following errors:
Julia 1.8.5
ERROR: InitError: UndefVarError: var not defined
Stacktrace:
[1] getproperty
@ ./Base.jl:31 [inlined]
[2] macro expansion
@ ./show.jl:1047 [inlined]
[3] __init__()
@ PkgB ~/misc/undef/PkgB/src/PkgB.jl:7
[4] _include_from_serialized(pkg::Base.PkgId, path::String, depmods::Vector{Any})
@ Base ./loading.jl:831
[5] _require_search_from_serialized(pkg::Base.PkgId, sourcepath::String, build_id::UInt64)
@ Base ./loading.jl:1039
[6] _require(pkg::Base.PkgId)
@ Base ./loading.jl:1315
[7] _require_prelocked(uuidkey::Base.PkgId)
@ Base ./loading.jl:1200
[8] macro expansion
@ ./loading.jl:1180 [inlined]
[9] macro expansion
@ ./lock.jl:223 [inlined]
[10] require(into::Module, mod::Symbol)
@ Base ./loading.jl:1144
during initialization of module PkgB
Julia 1.9-rc1:
➜ undef git:(main) julia@1.9 --project=PkgB -e 'using PkgB'
[6018] signal (11.2): Segmentation fault: 11
in expression starting at none:1
__init__ at /Users/simon/misc/undef/PkgB/src/PkgB.jl:7
jfptr___init___11 at /Users/simon/.julia/compiled/v1.9/PkgB/DW2fn_NQBT0.dylib (unknown line)
ijl_apply_generic at /Applications/Julia-1.9.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.9.dylib (unknown line)
jl_module_run_initializer at /Applications/Julia-1.9.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.9.dylib (unknown line)
ijl_init_restored_modules at /Applications/Julia-1.9.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.9.dylib (unknown line)
register_restored_modules at ./loading.jl:1074
_include_from_serialized at ./loading.jl:1020
_require_search_from_serialized at ./loading.jl:1465
_require at ./loading.jl:1742
_require_prelocked at ./loading.jl:1619
macro expansion at ./loading.jl:1607 [inlined]
macro expansion at ./lock.jl:267 [inlined]
require at ./loading.jl:1570
jfptr_require_28442 at /Applications/Julia-1.9.app/Contents/Resources/julia/lib/julia/sys.dylib (unknown line)
ijl_apply_generic at /Applications/Julia-1.9.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.9.dylib (unknown line)
eval_import_path at /Applications/Julia-1.9.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.9.dylib (unknown line)
jl_toplevel_eval_flex at /Applications/Julia-1.9.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.9.dylib (unknown line)
jl_toplevel_eval_flex at /Applications/Julia-1.9.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.9.dylib (unknown line)
ijl_toplevel_eval_in at /Applications/Julia-1.9.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.9.dylib (unknown line)
jlplt_ijl_toplevel_eval_in_12236 at /Applications/Julia-1.9.app/Contents/Resources/julia/lib/julia/sys.dylib (unknown line)
eval at ./boot.jl:370 [inlined]
exec_options at ./client.jl:280
_start at ./client.jl:522
jfptr__start_30743 at /Applications/Julia-1.9.app/Contents/Resources/julia/lib/julia/sys.dylib (unknown line)
ijl_apply_generic at /Applications/Julia-1.9.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.9.dylib (unknown line)
true_main at /Applications/Julia-1.9.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.9.dylib (unknown line)
jl_repl_entrypoint at /Applications/Julia-1.9.app/Contents/Resources/julia/lib/julia/libjulia-internal.1.9.dylib (unknown line)
Allocations: 2995 (Pool: 2984; Big: 11); GC: 0
Originally observed in JuliaGPU/CUDA.jl#1798
I have created a simple reproducer here:
https://github.com/simonbyrne/undef