From f0add80ef2f94ba3cce78fd9f8a65de914bcaf51 Mon Sep 17 00:00:00 2001 From: Jay McCarthy Date: Mon, 24 May 2010 13:12:57 -0600 Subject: [PATCH] Do not read the entire zo at once original commit: 2a934cb0539bc28442b0eaeb91c68afc866f7977 --- collects/compiler/decompile.rkt | 9 +++++---- collects/compiler/zo-parse.rkt | 23 +++++++++++++---------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/collects/compiler/decompile.rkt b/collects/compiler/decompile.rkt index e6d8e0aa48..f10d8737ac 100644 --- a/collects/compiler/decompile.rkt +++ b/collects/compiler/decompile.rkt @@ -1,6 +1,7 @@ #lang scheme/base (require compiler/zo-parse syntax/modcollapse + scheme/port scheme/match) (provide decompile) @@ -21,10 +22,10 @@ [table (make-hash)]) (for ([b (in-list bindings)]) (let ([v (and (cdr b) - (zo-parse (let-values ([(in out) (make-pipe)]) - (write (cdr b) out) - (close-output-port out) - in)))]) + (zo-parse + (open-input-bytes + (with-output-to-bytes + (λ () (write (cdr b)))))))]) (let ([n (match v [(struct compilation-top (_ prefix (struct primval (n)))) n] [else #f])]) diff --git a/collects/compiler/zo-parse.rkt b/collects/compiler/zo-parse.rkt index a048f20489..6f1b338560 100644 --- a/collects/compiler/zo-parse.rkt +++ b/collects/compiler/zo-parse.rkt @@ -359,12 +359,16 @@ (define (read-simple-number p) (integer-bytes->integer (read-bytes 4 p) #f #f)) - -(define-struct cport ([pos #:mutable] shared-start orig-port size bytes symtab shared-offsets decoded rns mpis)) +(define-struct cport ([pos #:mutable] shared-start orig-port size bytes-start symtab shared-offsets decoded rns mpis)) (define (cport-get-bytes cp len) - (subbytes (cport-bytes cp) (cport-pos cp) (+ (cport-pos cp) len))) + (define port (cport-orig-port cp)) + (define pos (cport-pos cp)) + (file-position port (+ (cport-bytes-start cp) pos)) + (read-bytes len port)) (define (cport-get-byte cp pos) - (bytes-ref (cport-bytes cp) pos)) + (define port (cport-orig-port cp)) + (file-position port (+ (cport-bytes-start cp) pos)) + (read-byte port)) (define (cport-rpos cp) (+ (cport-pos cp) (cport-shared-start cp))) @@ -979,17 +983,16 @@ (when (shared-size . >= . size*) (error 'zo-parse "Non-shared data segment start is not after shared data segment (according to offsets)")) - (define rst (read-bytes size* port)) + (define rst-start (file-position port)) + + (file-position port (+ rst-start size*)) (unless (eof-object? (read-byte port)) - (error 'not-end)) - - (unless (= size* (bytes-length rst)) - (error "wrong number of bytes")) + (error 'zo-parse "File too big")) (define symtab (make-vector symtabsize (make-not-ready))) - (define cp (make-cport 0 shared-size port size* rst symtab so* (make-vector symtabsize #f) (make-hash) (make-hash))) + (define cp (make-cport 0 shared-size port size* rst-start symtab so* (make-vector symtabsize #f) (make-hash) (make-hash))) (for/list ([i (in-range 1 symtabsize)]) (define vv (vector-ref symtab i))