parent
a6bd87b632
commit
cac230bc93
|
@ -501,15 +501,9 @@
|
||||||
|
|
||||||
;; ----------------------------------------
|
;; ----------------------------------------
|
||||||
;; Syntax unmarshaling
|
;; Syntax unmarshaling
|
||||||
|
|
||||||
(define (decode-stx cp v)
|
(define (decode-stx cp v)
|
||||||
(if (integer? v)
|
(if (integer? v)
|
||||||
(let-values ([(v2 decoded?) (unmarshal-stx-get cp v)])
|
(unmarshal-stx-get/decode cp v decode-stx)
|
||||||
(if decoded?
|
|
||||||
v2
|
|
||||||
(let ([v2 (decode-stx cp v2)])
|
|
||||||
(unmarshal-stx-set! cp v v2)
|
|
||||||
v2)))
|
|
||||||
(let loop ([v v])
|
(let loop ([v v])
|
||||||
(let-values ([(cert-marks v encoded-wraps)
|
(let-values ([(cert-marks v encoded-wraps)
|
||||||
(match v
|
(match v
|
||||||
|
@ -569,24 +563,14 @@
|
||||||
(define (decode-wraps cp w)
|
(define (decode-wraps cp w)
|
||||||
; A wraps is either a indirect reference or a list of wrap-elems (from stxobj.c:252)
|
; A wraps is either a indirect reference or a list of wrap-elems (from stxobj.c:252)
|
||||||
(if (integer? w)
|
(if (integer? w)
|
||||||
(let-values ([(w2 decoded?) (unmarshal-stx-get cp w)])
|
(unmarshal-stx-get/decode cp w decode-wraps)
|
||||||
(if decoded?
|
|
||||||
w2
|
|
||||||
(let ([w2 (decode-wraps cp w2)])
|
|
||||||
(unmarshal-stx-set! cp w w2)
|
|
||||||
w2)))
|
|
||||||
(map (lambda (a)
|
(map (lambda (a)
|
||||||
(let aloop ([a a])
|
(let aloop ([a a])
|
||||||
; A wrap-elem is either
|
; A wrap-elem is either
|
||||||
(cond
|
(cond
|
||||||
; A reference
|
; A reference
|
||||||
[(integer? a)
|
[(integer? a)
|
||||||
(let-values ([(a2 decoded?) (unmarshal-stx-get cp a)])
|
(unmarshal-stx-get/decode cp a (lambda (cp v) (aloop v)))]
|
||||||
(if decoded?
|
|
||||||
a2
|
|
||||||
(let ([a2 (aloop a2)])
|
|
||||||
(unmarshal-stx-set! cp a a2)
|
|
||||||
a2)))]
|
|
||||||
; A mark (not actually a number as the C says, but a (list <num>)
|
; A mark (not actually a number as the C says, but a (list <num>)
|
||||||
[(and (pair? a) (null? (cdr a)) (number? (car a)))
|
[(and (pair? a) (null? (cdr a)) (number? (car a)))
|
||||||
(make-wrap-mark (car a))]
|
(make-wrap-mark (car a))]
|
||||||
|
@ -704,22 +688,15 @@
|
||||||
[module-path-index
|
[module-path-index
|
||||||
(make-simple-module-binding module-path-index)]))))
|
(make-simple-module-binding module-path-index)]))))
|
||||||
|
|
||||||
(define (unmarshal-stx-get cp pos)
|
(define (unmarshal-stx-get/decode cp pos decode-stx)
|
||||||
(if (pos . >= . (vector-length (cport-symtab cp)))
|
(define v2 (read-sym cp pos))
|
||||||
(values `(#%bad-index ,pos) #t)
|
(define decoded? (vector-ref (cport-decoded cp) pos))
|
||||||
(let ([v (vector-ref (cport-symtab cp) pos)])
|
(if decoded?
|
||||||
(if (not-ready? v)
|
v2
|
||||||
(let ([save-pos (cport-pos cp)])
|
(let ([dv2 (decode-stx cp v2)])
|
||||||
(set-cport-pos! cp (vector-ref (cport-shared-offsets cp) (sub1 pos)))
|
(vector-set! (cport-symtab cp) pos dv2)
|
||||||
(let ([v (read-compact cp)])
|
(vector-set! (cport-decoded cp) pos #t)
|
||||||
(vector-set! (cport-symtab cp) pos v)
|
dv2)))
|
||||||
(set-cport-pos! cp save-pos)
|
|
||||||
(values v #f)))
|
|
||||||
(values v (vector-ref (cport-decoded cp) pos))))))
|
|
||||||
|
|
||||||
(define (unmarshal-stx-set! cp pos v)
|
|
||||||
(vector-set! (cport-symtab cp) pos v)
|
|
||||||
(vector-set! (cport-decoded cp) pos #t))
|
|
||||||
|
|
||||||
(define (parse-module-path-index cp s)
|
(define (parse-module-path-index cp s)
|
||||||
s)
|
s)
|
||||||
|
@ -738,15 +715,7 @@
|
||||||
(case cpt-tag
|
(case cpt-tag
|
||||||
[(delayed)
|
[(delayed)
|
||||||
(let ([pos (read-compact-number cp)])
|
(let ([pos (read-compact-number cp)])
|
||||||
(let ([v (vector-ref (cport-symtab cp) pos)])
|
(read-sym cp pos))]
|
||||||
(if (not-ready? v)
|
|
||||||
(let ([save-pos (cport-pos cp)])
|
|
||||||
(set-cport-pos! cp (vector-ref (cport-shared-offsets cp) (sub1 pos)))
|
|
||||||
(let ([v (read-compact cp)])
|
|
||||||
(vector-set! (cport-symtab cp) pos v)
|
|
||||||
(set-cport-pos! cp save-pos)
|
|
||||||
v))
|
|
||||||
v)))]
|
|
||||||
[(escape)
|
[(escape)
|
||||||
(let* ([len (read-compact-number cp)]
|
(let* ([len (read-compact-number cp)]
|
||||||
[s (cport-get-bytes cp len)])
|
[s (cport-get-bytes cp len)])
|
||||||
|
@ -894,16 +863,8 @@
|
||||||
(read-compact cp))))])
|
(read-compact cp))))])
|
||||||
(read (open-input-bytes #"x")))))]
|
(read (open-input-bytes #"x")))))]
|
||||||
[(symref)
|
[(symref)
|
||||||
(let* ([l (read-compact-number cp)]
|
(let* ([l (read-compact-number cp)])
|
||||||
[v (vector-ref (cport-symtab cp) l)])
|
(read-sym cp l))]
|
||||||
(if (not-ready? v)
|
|
||||||
(let ([pos (cport-pos cp)])
|
|
||||||
(set-cport-pos! cp (vector-ref (cport-shared-offsets cp) (sub1 l)))
|
|
||||||
(let ([v (read-compact cp)])
|
|
||||||
(set-cport-pos! cp pos)
|
|
||||||
(vector-set! (cport-symtab cp) l v)
|
|
||||||
v))
|
|
||||||
v))]
|
|
||||||
[(weird-symbol)
|
[(weird-symbol)
|
||||||
(let ([uninterned (read-compact-number cp)]
|
(let ([uninterned (read-compact-number cp)]
|
||||||
[str (read-compact-chars cp (read-compact-number cp))])
|
[str (read-compact-chars cp (read-compact-number cp))])
|
||||||
|
@ -956,6 +917,17 @@
|
||||||
[else
|
[else
|
||||||
(cons v (loop (sub1 need-car) proper))]))))
|
(cons v (loop (sub1 need-car) proper))]))))
|
||||||
|
|
||||||
|
(define (read-sym cp i)
|
||||||
|
(define symtab (cport-symtab cp))
|
||||||
|
(define vv (vector-ref symtab i))
|
||||||
|
(define save-pos (cport-pos cp))
|
||||||
|
(when (not-ready? vv)
|
||||||
|
(set-cport-pos! cp (vector-ref (cport-shared-offsets cp) (sub1 i)))
|
||||||
|
(let ([v (read-compact cp)])
|
||||||
|
(vector-set! symtab i v))
|
||||||
|
(set-cport-pos! cp save-pos))
|
||||||
|
(vector-ref symtab i))
|
||||||
|
|
||||||
;; path -> bytes
|
;; path -> bytes
|
||||||
;; implementes read.c:read_compiled
|
;; implementes read.c:read_compiled
|
||||||
(define (zo-parse port)
|
(define (zo-parse port)
|
||||||
|
@ -990,16 +962,14 @@
|
||||||
(unless (eof-object? (read-byte port))
|
(unless (eof-object? (read-byte port))
|
||||||
(error 'zo-parse "File too big"))
|
(error 'zo-parse "File too big"))
|
||||||
|
|
||||||
(define symtab (make-vector symtabsize (make-not-ready)))
|
(define nr (make-not-ready))
|
||||||
|
(define symtab
|
||||||
|
(make-vector symtabsize nr))
|
||||||
|
|
||||||
(define cp (make-cport 0 shared-size port size* rst-start 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))
|
(read-sym cp i))
|
||||||
(when (not-ready? vv)
|
|
||||||
(set-cport-pos! cp (vector-ref so* (sub1 i)))
|
|
||||||
(let ([v (read-compact cp)])
|
|
||||||
(vector-set! symtab i v))))
|
|
||||||
(set-cport-pos! cp shared-size)
|
(set-cport-pos! cp shared-size)
|
||||||
(read-marshalled 'compilation-top-type cp)))
|
(read-marshalled 'compilation-top-type cp)))
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user