Skip to content

Commit

Permalink
Fix serialization of code instances (#46373)
Browse files Browse the repository at this point in the history
  • Loading branch information
maleadt authored and KristofferC committed Oct 28, 2022
1 parent ddbb5bc commit 6fe0031
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 6 deletions.
14 changes: 8 additions & 6 deletions src/dump.c
Original file line number Diff line number Diff line change
Expand Up @@ -583,13 +583,15 @@ static int jl_serialize_generic(jl_serializer_state *s, jl_value_t *v) JL_GC_DIS
return 0;
}

static void jl_serialize_code_instance(jl_serializer_state *s, jl_code_instance_t *codeinst, int skip_partial_opaque, int internal) JL_GC_DISABLED
static void jl_serialize_code_instance(jl_serializer_state *s, jl_code_instance_t *codeinst,
int skip_partial_opaque, int internal,
int force) JL_GC_DISABLED
{
if (internal > 2) {
while (codeinst && !codeinst->relocatability)
codeinst = codeinst->next;
}
if (jl_serialize_generic(s, (jl_value_t*)codeinst)) {
if (!force && jl_serialize_generic(s, (jl_value_t*)codeinst)) {
return;
}

Expand All @@ -609,7 +611,7 @@ static void jl_serialize_code_instance(jl_serializer_state *s, jl_code_instance_
if (write_ret_type && codeinst->rettype_const &&
jl_typeis(codeinst->rettype_const, jl_partial_opaque_type)) {
if (skip_partial_opaque) {
jl_serialize_code_instance(s, codeinst->next, skip_partial_opaque, internal);
jl_serialize_code_instance(s, codeinst->next, skip_partial_opaque, internal, 0);
return;
}
else {
Expand All @@ -636,7 +638,7 @@ static void jl_serialize_code_instance(jl_serializer_state *s, jl_code_instance_
jl_serialize_value(s, jl_nothing);
}
write_uint8(s->s, codeinst->relocatability);
jl_serialize_code_instance(s, codeinst->next, skip_partial_opaque, internal);
jl_serialize_code_instance(s, codeinst->next, skip_partial_opaque, internal, 0);
}

enum METHOD_SERIALIZATION_MODE {
Expand Down Expand Up @@ -893,10 +895,10 @@ static void jl_serialize_value_(jl_serializer_state *s, jl_value_t *v, int as_li
}
jl_serialize_value(s, (jl_value_t*)backedges);
jl_serialize_value(s, (jl_value_t*)NULL); //callbacks
jl_serialize_code_instance(s, mi->cache, 1, internal);
jl_serialize_code_instance(s, mi->cache, 1, internal, 0);
}
else if (jl_is_code_instance(v)) {
jl_serialize_code_instance(s, (jl_code_instance_t*)v, 0, 2);
jl_serialize_code_instance(s, (jl_code_instance_t*)v, 0, 2, 1);
}
else if (jl_typeis(v, jl_module_type)) {
jl_serialize_module(s, (jl_module_t*)v);
Expand Down
17 changes: 17 additions & 0 deletions test/precompile.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1290,3 +1290,20 @@ precompile_test_harness("__init__ cachepath") do load_path
""")
@test isa((@eval (using InitCachePath; InitCachePath)), Module)
end

precompile_test_harness("issue #46296") do load_path
write(joinpath(load_path, "CodeInstancePrecompile.jl"),
"""
module CodeInstancePrecompile
mi = first(methods(identity)).specializations[1]
ci = Core.CodeInstance(mi, Any, nothing, nothing, zero(Int32), typemin(UInt),
typemax(UInt), zero(UInt32), zero(UInt32), nothing, 0x00)
__init__() = @assert ci isa Core.CodeInstance
end
""")
Base.compilecache(Base.PkgId("CodeInstancePrecompile"))
(@eval (using CodeInstancePrecompile))
end

0 comments on commit 6fe0031

Please sign in to comment.