fix .zo marshal of a syntax object containing a hash table in a list

Also, fix `zo-parse` unmarshaling of syntax-object hash tables.

Closes PR 14087

original commit: 70b6f6464f
This commit is contained in:
Matthew Flatt 2013-10-09 07:09:36 -06:00
parent 007d3fe205
commit 6ebcb502de

View File

@ -608,24 +608,27 @@
[(pair? v) [(pair? v)
(if (eq? #t (car v)) (if (eq? #t (car v))
;; Share decoded wraps with all nested parts. ;; Share decoded wraps with all nested parts.
(let loop ([v (cdr v)]) (let iloop ([v (cdr v)])
(cond (cond
[(pair? v) [(pair? v)
(let ploop ([v v]) (let ploop ([v v])
(cond (cond
[(null? v) null] [(null? v) null]
[(pair? v) (add-wrap (cons (loop (car v)) (ploop (cdr v))))] [(pair? v) (add-wrap (cons (iloop (car v)) (ploop (cdr v))))]
[else (loop v)]))] [else (iloop v)]))]
[(box? v) (add-wrap (box (loop (unbox v))))] [(box? v) (add-wrap (box (iloop (unbox v))))]
[(vector? v) [(vector? v)
(add-wrap (list->vector (map loop (vector->list v))))] (add-wrap (list->vector (map iloop (vector->list v))))]
[(hash? v)
(add-wrap (for/hash ([(k v) (in-hash v)])
(values k (iloop v))))]
[(prefab-struct-key v) [(prefab-struct-key v)
=> (lambda (k) => (lambda (k)
(add-wrap (add-wrap
(apply (apply
make-prefab-struct make-prefab-struct
k k
(map loop (struct->list v)))))] (map iloop (struct->list v)))))]
[else (add-wrap v)])) [else (add-wrap v)]))
;; Decode sub-elements that have their own wraps: ;; Decode sub-elements that have their own wraps:
(let-values ([(v counter) (if (exact-integer? (car v)) (let-values ([(v counter) (if (exact-integer? (car v))
@ -641,6 +644,9 @@
[(box? v) (add-wrap (box (loop (unbox v))))] [(box? v) (add-wrap (box (loop (unbox v))))]
[(vector? v) [(vector? v)
(add-wrap (list->vector (map loop (vector->list v))))] (add-wrap (list->vector (map loop (vector->list v))))]
[(hash? v)
(add-wrap (for/hash ([(k v) (in-hash v)])
(values k (loop v))))]
[(prefab-struct-key v) [(prefab-struct-key v)
=> (lambda (k) => (lambda (k)
(add-wrap (add-wrap