fix PLT_DELAY_FROM_ZO

Fetching bytecode from a previously read file was broken in the case
of a bytecode file with submodules.

Closes PR 14878
This commit is contained in:
Matthew Flatt 2014-12-11 13:08:18 -07:00
parent dbfe4df223
commit d6c26f9742

View File

@ -5416,7 +5416,7 @@ static Scheme_Object *read_compiled(Scheme_Object *port,
{ {
Scheme_Hash_Table *directory = NULL; Scheme_Hash_Table *directory = NULL;
Scheme_Object *result; Scheme_Object *result;
intptr_t size, shared_size, got, offset = 0, directory_count = 0; intptr_t size, shared_size, got, offset, directory_count = 0;
CPort *rp; CPort *rp;
intptr_t symtabsize; intptr_t symtabsize;
Scheme_Object **symtab; Scheme_Object **symtab;
@ -5449,7 +5449,6 @@ static Scheme_Object *read_compiled(Scheme_Object *port,
" expected version: %s", " expected version: %s",
(buf[0] ? buf : "???"), MZSCHEME_VERSION); (buf[0] ? buf : "???"), MZSCHEME_VERSION);
} }
offset += size + 1;
mode = scheme_get_byte(port); mode = scheme_get_byte(port);
if (mode == 'D') { if (mode == 'D') {
@ -5473,10 +5472,8 @@ static Scheme_Object *read_compiled(Scheme_Object *port,
/* Module hash code */ /* Module hash code */
got = scheme_get_bytes(port, 20, hash_code, 0); got = scheme_get_bytes(port, 20, hash_code, 0);
offset += 20;
symtabsize = read_simple_number_from_port(port); symtabsize = read_simple_number_from_port(port);
offset += 4;
/* Load table mapping symtab indices to stream positions: */ /* Load table mapping symtab indices to stream positions: */
@ -5495,8 +5492,6 @@ static Scheme_Object *read_compiled(Scheme_Object *port,
scheme_read_err(port, NULL, -1, -1, -1, -1, 0, NULL, scheme_read_err(port, NULL, -1, -1, -1, -1, 0, NULL,
"read (compiled): ill-formed code (bad table count: %" PRIdPTR " != %" PRIdPTR ")", "read (compiled): ill-formed code (bad table count: %" PRIdPTR " != %" PRIdPTR ")",
got, (all_short ? 2 : 4) * (symtabsize - 1)); got, (all_short ? 2 : 4) * (symtabsize - 1));
offset += got;
{ {
/* This loop runs top to bottom, since sizeof(long) may be larger /* This loop runs top to bottom, since sizeof(long) may be larger
than the decoded integers (but it's never shorter) */ than the decoded integers (but it's never shorter) */
@ -5527,8 +5522,6 @@ static Scheme_Object *read_compiled(Scheme_Object *port,
shared_size, size); shared_size, size);
} }
offset += 8;
rp = MALLOC_ONE_RT(CPort); rp = MALLOC_ONE_RT(CPort);
SET_REQUIRED_TAG(rp->type = scheme_rt_compact_port); SET_REQUIRED_TAG(rp->type = scheme_rt_compact_port);
{ {
@ -5542,6 +5535,7 @@ static Scheme_Object *read_compiled(Scheme_Object *port,
scheme_tell_all(port, NULL, NULL, &base); scheme_tell_all(port, NULL, NULL, &base);
rp->base = base; rp->base = base;
} }
offset = SCHEME_INT_VAL(scheme_file_position(1, &port));
rp->orig_port = port; rp->orig_port = port;
rp->size = size; rp->size = size;
if ((got = scheme_get_bytes(port, size, (char *)rp->start, 0)) != size) if ((got = scheme_get_bytes(port, size, (char *)rp->start, 0)) != size)
@ -5590,7 +5584,7 @@ static Scheme_Object *read_compiled(Scheme_Object *port,
} else { } else {
scheme_reserve_file_descriptor(); scheme_reserve_file_descriptor();
rp->pos = shared_size; /* skip shared part */ rp->pos = shared_size; /* skip shared part */
delay_info->file_offset = offset + 2 + 1; /* +2 is for #~; +1 is ???? */ delay_info->file_offset = offset;
delay_info->size = shared_size; delay_info->size = shared_size;
delay_info->symtab_size = rp->symtab_size; delay_info->symtab_size = rp->symtab_size;
delay_info->symtab = rp->symtab; delay_info->symtab = rp->symtab;