parent
cc82e80835
commit
f0add80ef2
|
@ -1,6 +1,7 @@
|
||||||
#lang scheme/base
|
#lang scheme/base
|
||||||
(require compiler/zo-parse
|
(require compiler/zo-parse
|
||||||
syntax/modcollapse
|
syntax/modcollapse
|
||||||
|
scheme/port
|
||||||
scheme/match)
|
scheme/match)
|
||||||
|
|
||||||
(provide decompile)
|
(provide decompile)
|
||||||
|
@ -21,10 +22,10 @@
|
||||||
[table (make-hash)])
|
[table (make-hash)])
|
||||||
(for ([b (in-list bindings)])
|
(for ([b (in-list bindings)])
|
||||||
(let ([v (and (cdr b)
|
(let ([v (and (cdr b)
|
||||||
(zo-parse (let-values ([(in out) (make-pipe)])
|
(zo-parse
|
||||||
(write (cdr b) out)
|
(open-input-bytes
|
||||||
(close-output-port out)
|
(with-output-to-bytes
|
||||||
in)))])
|
(λ () (write (cdr b)))))))])
|
||||||
(let ([n (match v
|
(let ([n (match v
|
||||||
[(struct compilation-top (_ prefix (struct primval (n)))) n]
|
[(struct compilation-top (_ prefix (struct primval (n)))) n]
|
||||||
[else #f])])
|
[else #f])])
|
||||||
|
|
|
@ -359,12 +359,16 @@
|
||||||
(define (read-simple-number p)
|
(define (read-simple-number p)
|
||||||
(integer-bytes->integer (read-bytes 4 p) #f #f))
|
(integer-bytes->integer (read-bytes 4 p) #f #f))
|
||||||
|
|
||||||
|
(define-struct cport ([pos #:mutable] shared-start orig-port size bytes-start symtab shared-offsets decoded rns mpis))
|
||||||
(define-struct cport ([pos #:mutable] shared-start orig-port size bytes symtab shared-offsets decoded rns mpis))
|
|
||||||
(define (cport-get-bytes cp len)
|
(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)
|
(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)
|
(define (cport-rpos cp)
|
||||||
(+ (cport-pos cp) (cport-shared-start cp)))
|
(+ (cport-pos cp) (cport-shared-start cp)))
|
||||||
|
@ -979,17 +983,16 @@
|
||||||
(when (shared-size . >= . size*)
|
(when (shared-size . >= . size*)
|
||||||
(error 'zo-parse "Non-shared data segment start is not after shared data segment (according to offsets)"))
|
(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))
|
(unless (eof-object? (read-byte port))
|
||||||
(error 'not-end))
|
(error 'zo-parse "File too big"))
|
||||||
|
|
||||||
(unless (= size* (bytes-length rst))
|
|
||||||
(error "wrong number of bytes"))
|
|
||||||
|
|
||||||
(define symtab (make-vector symtabsize (make-not-ready)))
|
(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)])
|
(for/list ([i (in-range 1 symtabsize)])
|
||||||
(define vv (vector-ref symtab i))
|
(define vv (vector-ref symtab i))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user