Skip to content

Commit dd1fcf3

Browse files
authored
fix #39405, saving modules with renamed imports (#39408)
1 parent 9c375e2 commit dd1fcf3

File tree

3 files changed

+32
-14
lines changed

3 files changed

+32
-14
lines changed

src/dump.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -348,9 +348,10 @@ static void jl_serialize_module(jl_serializer_state *s, jl_module_t *m)
348348
write_int8(s->s, 0);
349349
jl_serialize_value(s, m->parent);
350350
void **table = m->bindings.table;
351-
for (i = 1; i < m->bindings.size; i += 2) {
352-
if (table[i] != HT_NOTFOUND) {
353-
jl_binding_t *b = (jl_binding_t*)table[i];
351+
for (i = 0; i < m->bindings.size; i += 2) {
352+
if (table[i+1] != HT_NOTFOUND) {
353+
jl_serialize_value(s, (jl_value_t*)table[i]);
354+
jl_binding_t *b = (jl_binding_t*)table[i+1];
354355
jl_serialize_value(s, b->name);
355356
jl_value_t *e = b->value;
356357
if (!b->constp && e && jl_is_cpointer(e) && jl_unbox_voidpointer(e) != (void*)-1 && jl_unbox_voidpointer(e) != NULL)
@@ -1558,12 +1559,12 @@ static jl_value_t *jl_deserialize_value_module(jl_serializer_state *s) JL_GC_DIS
15581559
jl_gc_wb(m, m->parent);
15591560

15601561
while (1) {
1561-
jl_sym_t *name = (jl_sym_t*)jl_deserialize_value(s, NULL);
1562-
if (name == NULL)
1562+
jl_sym_t *asname = (jl_sym_t*)jl_deserialize_value(s, NULL);
1563+
if (asname == NULL)
15631564
break;
1564-
jl_binding_t *b = jl_get_binding_wr(m, name, 1);
1565+
jl_binding_t *b = jl_get_binding_wr(m, asname, 1);
1566+
b->name = (jl_sym_t*)jl_deserialize_value(s, (jl_value_t**)&b->name);
15651567
b->value = jl_deserialize_value(s, &b->value);
1566-
jl_gc_wb_buf(m, b, sizeof(jl_binding_t));
15671568
if (b->value != NULL) jl_gc_wb(m, b->value);
15681569
b->globalref = jl_deserialize_value(s, &b->globalref);
15691570
if (b->globalref != NULL) jl_gc_wb(m, b->globalref);

src/staticdata.c

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -387,9 +387,10 @@ static void jl_serialize_module(jl_serializer_state *s, jl_module_t *m)
387387
jl_serialize_value(s, m->parent);
388388
size_t i;
389389
void **table = m->bindings.table;
390-
for (i = 1; i < m->bindings.size; i += 2) {
391-
if (table[i] != HT_NOTFOUND) {
392-
jl_binding_t *b = (jl_binding_t*)table[i];
390+
for (i = 0; i < m->bindings.size; i += 2) {
391+
if (table[i+1] != HT_NOTFOUND) {
392+
jl_serialize_value(s, (jl_value_t*)table[i]);
393+
jl_binding_t *b = (jl_binding_t*)table[i+1];
393394
jl_serialize_value(s, b->name);
394395
jl_serialize_value(s, b->value);
395396
jl_serialize_value(s, b->globalref);
@@ -629,9 +630,11 @@ static void jl_write_module(jl_serializer_state *s, uintptr_t item, jl_module_t
629630
size_t count = 0;
630631
size_t i;
631632
void **table = m->bindings.table;
632-
for (i = 1; i < m->bindings.size; i += 2) {
633-
if (table[i] != HT_NOTFOUND) {
634-
jl_binding_t *b = (jl_binding_t*)table[i];
633+
for (i = 0; i < m->bindings.size; i += 2) {
634+
if (table[i+1] != HT_NOTFOUND) {
635+
jl_binding_t *b = (jl_binding_t*)table[i+1];
636+
write_pointerfield(s, (jl_value_t*)table[i]);
637+
tot += sizeof(void*);
635638
write_gctaggedfield(s, (uintptr_t)BindingRef << RELOC_TAG_OFFSET);
636639
tot += sizeof(void*);
637640
size_t binding_reloc_offset = ios_pos(s->s);
@@ -1383,12 +1386,13 @@ static void jl_reinit_item(jl_value_t *v, int how) JL_GC_DISABLED
13831386
size_t nbindings = mod->bindings.size;
13841387
htable_new(&mod->bindings, nbindings);
13851388
struct binding {
1389+
jl_sym_t *asname;
13861390
uintptr_t tag;
13871391
jl_binding_t b;
13881392
} *b;
13891393
b = (struct binding*)&mod[1];
13901394
while (nbindings > 0) {
1391-
ptrhash_put(&mod->bindings, (char*)b->b.name, &b->b);
1395+
ptrhash_put(&mod->bindings, b->asname, &b->b);
13921396
b += 1;
13931397
nbindings -= 1;
13941398
}

test/precompile.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -859,3 +859,16 @@ precompile_test_harness("Opaque Closure") do load_path
859859
f = (@eval (using OCPrecompile; OCPrecompile)).f
860860
@test Base.invokelatest(f, 1)(2) == 3
861861
end
862+
863+
# issue #39405
864+
precompile_test_harness("Renamed Imports") do load_path
865+
write(joinpath(load_path, "RenameImports.jl"),
866+
"""
867+
module RenameImports
868+
import Base.Experimental as ex
869+
test() = ex
870+
end
871+
""")
872+
Base.compilecache(Base.PkgId("RenameImports"))
873+
@test (@eval (using RenameImports; RenameImports.test())) isa Module
874+
end

0 commit comments

Comments
 (0)