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_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;
intptr_t symtabsize;
Scheme_Object **symtab;
@ -5449,7 +5449,6 @@ static Scheme_Object *read_compiled(Scheme_Object *port,
" expected version: %s",
(buf[0] ? buf : "???"), MZSCHEME_VERSION);
}
offset += size + 1;
mode = scheme_get_byte(port);
if (mode == 'D') {
@ -5473,10 +5472,8 @@ static Scheme_Object *read_compiled(Scheme_Object *port,
/* Module hash code */
got = scheme_get_bytes(port, 20, hash_code, 0);
offset += 20;
symtabsize = read_simple_number_from_port(port);
offset += 4;
/* 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,
"read (compiled): ill-formed code (bad table count: %" PRIdPTR " != %" PRIdPTR ")",
got, (all_short ? 2 : 4) * (symtabsize - 1));
offset += got;
{
/* This loop runs top to bottom, since sizeof(long) may be larger
than the decoded integers (but it's never shorter) */
@ -5527,8 +5522,6 @@ static Scheme_Object *read_compiled(Scheme_Object *port,
shared_size, size);
}
offset += 8;
rp = MALLOC_ONE_RT(CPort);
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);
rp->base = base;
}
offset = SCHEME_INT_VAL(scheme_file_position(1, &port));
rp->orig_port = port;
rp->size = 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 {
scheme_reserve_file_descriptor();
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->symtab_size = rp->symtab_size;
delay_info->symtab = rp->symtab;