From d6c26f9742eb2394536ec248c5de5be1ee2b30c6 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 11 Dec 2014 13:08:18 -0700 Subject: [PATCH] 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 --- racket/src/racket/src/read.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/racket/src/racket/src/read.c b/racket/src/racket/src/read.c index 378dd36868..f6e6cd18ce 100644 --- a/racket/src/racket/src/read.c +++ b/racket/src/racket/src/read.c @@ -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;