Skip to content

Commit 0930304

Browse files
committed
Fix serialization of code instances.
If they are encountered in a Julia object directly, as opposed to e.g. during serialization of a method instance, we'll have first populated the backref table as part of jl_serialize_value, so we need to skip that check during code instance serialization.
1 parent 997e336 commit 0930304

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

src/dump.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -653,13 +653,15 @@ static int jl_serialize_generic(jl_serializer_state *s, jl_value_t *v) JL_GC_DIS
653653
return 0;
654654
}
655655

656-
static void jl_serialize_code_instance(jl_serializer_state *s, jl_code_instance_t *codeinst, int skip_partial_opaque, int internal) JL_GC_DISABLED
656+
static void jl_serialize_code_instance(jl_serializer_state *s, jl_code_instance_t *codeinst,
657+
int skip_partial_opaque, int internal,
658+
int force) JL_GC_DISABLED
657659
{
658660
if (internal > 2) {
659661
while (codeinst && !codeinst->relocatability)
660662
codeinst = codeinst->next;
661663
}
662-
if (jl_serialize_generic(s, (jl_value_t*)codeinst)) {
664+
if (!force && jl_serialize_generic(s, (jl_value_t*)codeinst)) {
663665
return;
664666
}
665667
assert(codeinst != NULL); // handle by jl_serialize_generic, but this makes clang-sa happy
@@ -680,7 +682,7 @@ static void jl_serialize_code_instance(jl_serializer_state *s, jl_code_instance_
680682
if (write_ret_type && codeinst->rettype_const &&
681683
jl_typeis(codeinst->rettype_const, jl_partial_opaque_type)) {
682684
if (skip_partial_opaque) {
683-
jl_serialize_code_instance(s, codeinst->next, skip_partial_opaque, internal);
685+
jl_serialize_code_instance(s, codeinst->next, skip_partial_opaque, internal, 0);
684686
return;
685687
}
686688
else {
@@ -707,7 +709,7 @@ static void jl_serialize_code_instance(jl_serializer_state *s, jl_code_instance_
707709
jl_serialize_value(s, jl_nothing);
708710
}
709711
write_uint8(s->s, codeinst->relocatability);
710-
jl_serialize_code_instance(s, codeinst->next, skip_partial_opaque, internal);
712+
jl_serialize_code_instance(s, codeinst->next, skip_partial_opaque, internal, 0);
711713
}
712714

713715
enum METHOD_SERIALIZATION_MODE {
@@ -968,10 +970,10 @@ static void jl_serialize_value_(jl_serializer_state *s, jl_value_t *v, int as_li
968970
}
969971
jl_serialize_value(s, (jl_value_t*)backedges);
970972
jl_serialize_value(s, (jl_value_t*)NULL); //callbacks
971-
jl_serialize_code_instance(s, mi->cache, 1, internal);
973+
jl_serialize_code_instance(s, mi->cache, 1, internal, 0);
972974
}
973975
else if (jl_is_code_instance(v)) {
974-
jl_serialize_code_instance(s, (jl_code_instance_t*)v, 0, 2);
976+
jl_serialize_code_instance(s, (jl_code_instance_t*)v, 0, 2, 1);
975977
}
976978
else if (jl_typeis(v, jl_module_type)) {
977979
jl_serialize_module(s, (jl_module_t*)v);

test/precompile.jl

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1488,5 +1488,27 @@ precompile_test_harness("Issue #46558") do load_path
14881488
@test (@eval $Foo.foo(1)) == 2
14891489
end
14901490

1491+
precompile_test_harness("issue #46296") do load_path
1492+
write(joinpath(load_path, "CodeInstancePrecompile.jl"),
1493+
"""
1494+
module CodeInstancePrecompile
1495+
1496+
sig = Tuple{typeof(identity), Nothing}
1497+
meth = which(sig)
1498+
ti, env = ccall(:jl_type_intersection_with_env, Any,
1499+
(Any, Any), meth.sig, sig)
1500+
mi = ccall(:jl_specializations_get_linfo, Ref{Core.MethodInstance},
1501+
(Any, Any, Any, UInt), meth, ti, env, 1)
1502+
ci = Core.CodeInstance(mi, Any, nothing, nothing, zero(Int32), typemin(UInt64),
1503+
typemax(UInt64), zero(UInt32), zero(UInt32), nothing, 0x00)
1504+
1505+
__init__() = @assert ci isa Core.CodeInstance
1506+
1507+
end
1508+
""")
1509+
Base.compilecache(Base.PkgId("CodeInstancePrecompile"))
1510+
(@eval (using CodeInstancePrecompile))
1511+
end
1512+
14911513
empty!(Base.DEPOT_PATH)
14921514
append!(Base.DEPOT_PATH, original_depot_path)

0 commit comments

Comments
 (0)