Dealing with cyclic hashes

original commit: 4088448317
This commit is contained in:
Jay McCarthy 2010-05-27 11:59:55 -06:00
parent cac230bc93
commit 2fd3353508

View File

@ -228,6 +228,11 @@
(traverse-stx expr visit)] (traverse-stx expr visit)]
[(wrapped? expr) [(wrapped? expr)
(traverse-wrapped expr visit)] (traverse-wrapped expr visit)]
[(hash? expr)
(when (visit expr)
(for ([(k v) (in-hash expr)])
(traverse-data k visit)
(traverse-data v visit)))]
[else [else
(void)])) (void)]))
@ -987,16 +992,18 @@
(for ([v (in-vector expr)]) (for ([v (in-vector expr)])
(out-data v out))] (out-data v out))]
[(hash? expr) [(hash? expr)
(out-byte CPT_HASH_TABLE out) (out-shared expr out
(out-number (cond (lambda ()
[(hash-eqv? expr) 2] (out-byte CPT_HASH_TABLE out)
[(hash-eq? expr) 0] (out-number (cond
[else 1]) [(hash-eqv? expr) 2]
out) [(hash-eq? expr) 0]
(out-number (hash-count expr) out) [else 1])
(for ([(k v) (in-hash expr)]) out)
(out-data k out) (out-number (hash-count expr) out)
(out-data v out))] (for ([(k v) (in-hash expr)])
(out-data k out)
(out-data v out))))]
[(svector? expr) [(svector? expr)
(let* ([vec (svector-vec expr)] (let* ([vec (svector-vec expr)]
[len (vector-length vec)]) [len (vector-length vec)])