From e4af0cac26321d822f0f1d17800e07027e032adf Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sat, 3 Jan 2015 09:58:08 -0700 Subject: [PATCH] compiler/zo-marshal: fix offsets in submodule search table --- compiler-test/tests/compiler/zo.rkt | 9 ++++++++- zo-lib/compiler/zo-marshal.rkt | 10 ++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/compiler-test/tests/compiler/zo.rkt b/compiler-test/tests/compiler/zo.rkt index 5c0b885223..67f2bfa486 100644 --- a/compiler-test/tests/compiler/zo.rkt +++ b/compiler-test/tests/compiler/zo.rkt @@ -2,7 +2,8 @@ (require racket/pretty compiler/zo-parse compiler/zo-marshal - compiler/decompile) + compiler/decompile + racket/file) (define ex-mod1 '(module m racket @@ -64,6 +65,12 @@ (write c o) (let ([p (zo-parse (open-input-bytes (get-output-bytes o)))]) (let ([b (zo-marshal p)]) + ;; Check that submodule table is ok: + (parameterize ([read-accept-compiled #t] + [current-output-port (open-output-bytes)]) + (define f (make-temporary-file)) + (call-with-output-file f #:exists 'truncate (lambda (f) (display b f))) + (dynamic-require f #f)) (let ([p2 (zo-parse (open-input-bytes b))] [to-string (lambda (p) (let ([o (open-output-bytes)]) diff --git a/zo-lib/compiler/zo-marshal.rkt b/zo-lib/compiler/zo-marshal.rkt index c241013d04..d7ae319ff7 100644 --- a/zo-lib/compiler/zo-marshal.rkt +++ b/zo-lib/compiler/zo-marshal.rkt @@ -85,9 +85,11 @@ (iloop (loop (car subm) accum) (cdr subm))))))) (write-bytes (int->bytes (length pre-mod-bytess)) outp) ;; Size of btree: - (define btree-size + (define header-size (+ 8 - (string-length (version)) + (string-length (version)))) + (define btree-size + (+ header-size (apply + (for/list ([mb (in-list pre-mod-bytess)]) (+ (bytes-length (mod-bytes-name-bstr mb)) 20))))) @@ -99,7 +101,7 @@ (cons (mod-bytes (mod-bytes-code-bstr mb) (mod-bytes-name-bstr mb) offset) - (loop (+ offset + (loop (+ offset (bytes-length (mod-bytes-code-bstr mb))) (cdr mod-bytess))))))) ;; Sort by name for btree order: @@ -108,7 +110,7 @@ (define right-offsets (make-vector (vector-length sorted-mod-bytess) 0)) ;; Write out btree or compute offsets: (define (write-btree write-bytes) - (let loop ([lo 0] [hi (vector-length sorted-mod-bytess)] [pos 0]) + (let loop ([lo 0] [hi (vector-length sorted-mod-bytess)] [pos header-size]) (define mid (quotient (+ lo hi) 2)) (define mb (vector-ref sorted-mod-bytess mid)) (define name-len (bytes-length (mod-bytes-name-bstr mb)))